在 Kubernetes (K8s) 环境中,手动生成证书是一种重要的操作,特别是在需要对集群进行更细致的安全控制或不使用自动化工具如 kubeadm 时。
使用场景
- 增强安全性:手动生成证书可以让管理员更好地控制密钥的存储和管理,增强集群的安全性。
- 定制化需求:在特定情况下,可能需要为特定服务或节点生成特殊配置的证书。
- 教育和测试:学习和测试 Kubernetes 安全性配置时,手动创建和管理证书可以提供更深入的理解。
使用技巧
- 使用工具:可以通过工具如 easyrsa、openssl 或 cfssl 手动生成证书。
- 创建 CA(证书颁发机构):首先需要创建一个 CA,它将用于签署集群中其他证书。
- 证书存储位置:如果使用 kubeadm 安装 Kubernetes,大多数证书存储在
/etc/kubernetes/pki
目录中。 - 证书旋转:定期更新或“旋转”证书,以保持安全性和有效性。
使用案例
使用 EasyRSA 生成证书
初始化:
代码语言:javascript复制curl -LO https://dl.k8s.io/easy-rsa/easy-rsa.tar.gz
tar xzf easy-rsa.tar.gz
cd easy-rsa-master/easyrsa3
./easyrsa init-pki
生成 CA 和服务器证书:
代码语言:javascript复制./easyrsa --batch "--req-cn=${MASTER_IP}@`date %s`" build-ca nopass
./easyrsa --subject-alt-name="IP:${MASTER_IP},..." --days=10000 build-server-full server nopass
配置 API 服务器:使用生成的证书配置 Kubernetes API 服务器。
使用 OpenSSL 生成证书
生成 CA:
代码语言:javascript复制openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=${MASTER_IP}" -days 10000 -out ca.crt
生成服务器证书:
代码语言:javascript复制openssl genrsa -out server.key 2048
创建 CSR 配置文件:根据实际情况填写配置文件,然后生成服务器证书。
证书轮换
- 备份:在进行任何操作前备份所有证书和配置文件。
- 分发新证书:将新的 CA 证书和私钥分发到所有控制平面节点。
- 更新配置:更新
kube-controller-manager
的--root-ca-file
标志,包括新旧 CA。
注意事项
- 确保在生成和使用证书时正确配置所有相关参数,以保证集群的正常运作。
- 在进行证书旋转时,特别是在高可用性配置中,需要特别注意更新和重启服务的顺序。
通过手动管理 Kubernetes 证书,可以获得对安全性更高的控制,尽管这可能需要更多的管理工作。更多详细信息和指南,请参考 Kubernetes 官方文档:手动生成证书[1]、PKI 证书和需求[2] 和 手动轮换 CA 证书[3]。
参考资料
[1]
手动生成证书: https://kubernetes.io/docs/tasks/administer-cluster/certificates/
[2]
PKI 证书和需求: https://kubernetes.io/docs/setup/best-practices/certificates/
[3]
手动轮换 CA 证书: https://kubernetes.io/docs/tasks/tls/manual-rotation-of-ca-certificates/