Kubelet 證書自動(dòng)續(xù)期

一、問題現(xiàn)象和原因

Kubernetes 日志錯(cuò)誤

當(dāng) Kubernetes 集群日志中出現(xiàn) certificate has expired or is not yet valid 錯(cuò)誤信息時(shí),表明證書過期

證書過期原因

  • 服務(wù)器時(shí)間不對,導(dǎo)致證書過期
  • 確實(shí)證書過期了

證書過期,很多同學(xué)會(huì)很疑惑,我證書明明簽署10年有效期或者更久,怎么剛1年就過期了,下面就來解惑。

Kubernetes 集群證書

集群分為兩種證書:一、用于集群 Master、Etcd等通信的證書。 二、用于集群 Kubelet 組件證書

Kubernetes 集群中 Kubelet 組件坑

我們在搭建 Kubernetes 集群時(shí),一般只聲明用于集群 Master、Etcd等通信的證書 為 10年 或者 更久,但未聲明集群 Kubelet 組件證書 ,Kubelet 組件證書 默認(rèn)有效期為1年。集群運(yùn)行1年以后就會(huì)導(dǎo)致報(bào) certificate has expired or is not yet valid 錯(cuò)誤,導(dǎo)致集群 Node不能于集群 Master正常通信。

二、 解決方法

添加參數(shù)

  • 修改 kubelet 組件配置,具體添加下面參數(shù)
--feature-gates=RotateKubeletServerCertificate=true
--feature-gates=RotateKubeletClientCertificate=true
# 1.8版本以上包含1.8都支持證書更換自動(dòng)重載,以下版本只能手動(dòng)重啟服務(wù)
--rotate-certificates
  • 修改 controller-manager 組件配置,具體添加下面參數(shù)
# 證書有效期為10年
--experimental-cluster-signing-duration=87600h0m0s
--feature-gates=RotateKubeletServerCertificate=true

創(chuàng)建自動(dòng)批準(zhǔn)相關(guān) CSR 請求的 ClusterRole

  • vim tls-instructs-csr.yaml && kubectl apply -f tls-instructs-csr.yaml
kind: 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"]
  • 自動(dòng)批準(zhǔn) kubelet-bootstrap 用戶 TLS bootstrapping 首次申請證書的 CSR 請求
kubectl create clusterrolebinding node-client-auto-approve-csr --clusterrole=system:certificates.k8s.io:certificatesigningrequests:nodeclient --user=kubelet-bootstrap
  • 自動(dòng)批準(zhǔn) system:nodes 組用戶更新 kubelet 自身與 apiserver 通訊證書的 CSR 請求
kubectl create clusterrolebinding node-client-auto-renew-crt --clusterrole=system:certificates.k8s.io:certificatesigningrequests:selfnodeclient --group=system:nodes
  • 自動(dòng)批準(zhǔn) system:nodes 組用戶更新 kubelet 10250 api 端口證書的 CSR 請求
kubectl create clusterrolebinding node-server-auto-renew-crt --clusterrole=system:certificates.k8s.io:certificatesigningrequests:selfnodeserver --group=system:nodes

重啟kube-controller-manager 和 kubelet 服務(wù)

$ systemctl restart kube-controller-manager

# 進(jìn)入到ssl配置目錄,刪除 kubelet 證書
$ rm -f kubelet-client-current.pem kubelet-client-2019-05-10-09-57-21.pem kubelet.key kubelet.crt

# 重啟啟動(dòng),啟動(dòng)正常后會(huì)頒發(fā)有效期10年的ssl證書
$ systemctl restart kubelet


# 進(jìn)入到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

關(guān)注我

歡迎大家關(guān)注交流,定期分享自動(dòng)化運(yùn)維、DevOps、Kubernetes、Service Mesh和Cloud Native

image

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容