当 Kubernetes 集群日志中出现 certificate has expired or is not yet valid 错误信息时,表明证书过期
证书过期,很多同学会很疑惑,我证书明明签署10年有效期或者更久,怎么刚1年就过期了,下面就来解惑。
集群分为两种证书:一、用于集群 Master、Etcd等通信的证书。二、用于集群 Kubelet 组件证书
我们在搭建 Kubernetes 集群时,一般只声明用于集群 Master、Etcd等通信的证书 为 10年 或者 更久,但未声明集群 Kubelet 组件证书 ,Kubelet 组件证书 默认有效期为1年。集群运行1年以后就会导致报 certificate has expired or is not yet valid 错误,导致集群 Node不能和集群 Master正常通信。
kubelet 组件配置,具体添加下面参数--feature-gates=RotateKubeletServerCertificate=true
--feature-gates=RotateKubeletClientCertificate=true
# 1.8版本以上包含1.8都支持证书更换自动重载,以下版本只能手动重启服务
--rotate-certificatescontroller-manager 组件配置,具体添加下面参数# 证书有效期为10年
--experimental-cluster-signing-duration=87600h0m0s
--feature-gates=RotateKubeletServerCertificate=truevim tls-instructs-csr.yaml && kubectl apply -f tls-instructs-csr.yamlkind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: system:certificates.k8s.io:certificatesigningrequests:selfnodeserver
rules:
- apiGroups: ["certificates.k8s.io"]
resources: ["certificatesigningrequests/selfnodeserver"]
verbs: ["create"]kubectl create clusterrolebinding node-client-auto-approve-csr --clusterrole=system:certificates.k8s.io:certificatesigningrequests:nodeclient --user=kubelet-bootstrapkubectl create clusterrolebinding node-client-auto-renew-crt --clusterrole=system:certificates.k8s.io:certificatesigningrequests:selfnodeclient --group=system:nodeskubectl create clusterrolebinding node-server-auto-renew-crt --clusterrole=system:certificates.k8s.io:certificatesigningrequests:selfnodeserver --group=system:nodes$ systemctl restart kube-controller-manager
# 进入到ssl配置目录,删除 kubelet 证书
$ rm -f kubelet-client-current.pem kubelet-client-2019-05-10-09-57-21.pem kubelet.key kubelet.crt
# 重启启动,启动正常后会颁发有效期10年的ssl证书
$ systemctl restart kubelet
# 进入到ssl配置目录,查看证书有效期
$ openssl x509 -in kubelet-client-current.pem -noout -text | grep "Not"
Not Before: May 13 02:36:00 2019 GMT
Not After : May 10 02:36:00 2029 GMT欢迎大家关注交流,定期分享自动化运维、DevOps、Kubernetes、Service Mesh和Cloud Native