内容提要
本文介绍修复Kubernetes 1.14.1集群证书有效期仅1年的方法:安装Go 1.12.1并下载源码,将cert.go中证书时长改为10年,重新编译kubeadm、kubelet、kubectl并替换;备份PKI与kubeconfig后执行kubeadm certs renew all更新证书,重启apiserver等容器,同步证书至各master,配置kubelet证书轮换,最终验证证书有效期延长至10年。
延伸解读
为何需要修改源码
Kubernetes 1.14.1 中,kubeadm 生成的证书默认有效期仅为 1 年,这会导致集群在一年后因证书过期而故障。文章通过修改源码中 cert.go 的证书时长参数,将有效期延长至 10 年,从而避免频繁续期。但需注意,此方法需重新编译 kubeadm 等组件,操作复杂且可能引入兼容性问题。
操作中的关键风险点
更新证书涉及备份 PKI 和 kubeconfig 文件、替换二进制、重启核心组件等步骤。若备份不完整或操作失误,可能导致集群不可用。文章强调必须备份 /etc/kubernetes/pki 和 *.conf 文件,并在所有 master 节点同步证书。此外,编译环境需安装 rsync 并确保权限正确,否则会报错。
证书轮换与长期维护
除了修改源码,文章还介绍了配置 kubelet 证书轮换和 controller-manager 签署时间的方法。通过设置 --feature-gates=RotateKubeletClientCertificate=true 和 --experimental-cluster-signing-duration=87600h0m0s,可以进一步确保证书自动更新。但需注意,这些配置需在所有节点生效,并重启相关服务。
Q&A
Kubernetes 1.14.1 集群证书默认有效期是多久?
部分组件证书(如 master 组件证书或 kubelet 证书)默认有效期只有 1 年。
如何将 Kubernetes 1.14.1 的证书有效期从 1 年延长到 10 年?
需要修改 Kubernetes 源码中证书生成逻辑,将证书时长改为 10 年,然后重新编译 kubeadm、kubelet、kubectl 并替换,再执行证书更新操作。
修改 Kubernetes 证书有效期需要修改哪个文件?
需要修改 staging/src/k8s.io/client-go/util/cert/cert.go 文件,将 NewSignedCert 函数中的 NotAfter 字段添加 "* 10",即改为 time.Now().Add(duration365d * 10).UTC()。
编译 Kubernetes 1.14.1 需要什么 Go 版本?
需要 Go 1.12+,本文档采用 Go 1.12.1。
更新 Kubernetes 证书后如何验证有效期?
可以使用 openssl 命令检查证书,例如:openssl x509 -in apiserver.crt -text -noout | grep Not,查看 Not After 日期是否延长至 10 年。
更新证书后需要重启哪些组件?
需要在所有 master 节点重启 kube-apiserver、kube-controller-manager、kube-scheduler、etcd 四个容器。
如何配置 kubelet 证书轮换?
需要确保 /var/lib/kubelet/config.yaml 中有 rotateCertificates: true,如果没有,则编辑 /etc/kubernetes/kubelet.env 增加 --feature-gates=RotateKubeletClientCertificate=true 和 --rotate-certificates=true,然后重启 kubelet。