Kubelet 證書如何自動續期


一、問題現象和原因

Kubernetes 日志錯誤

當 Kubernetes 集群日志中出現 certificate has expired or is not yet valid 錯誤信息時,表明證書過期

證書過期原因

  • 服務器時間不對,導致證書過期
  • 確實證書過期了

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

Kubernetes 集群證書

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

Kubernetes 集群中 Kubelet 組件坑

我們在搭建 Kubernetes 集群時,一般只聲明用於集群 Master、Etcd等通信的證書 為 10年 或者 更久,但未聲明集群 Kubelet 組件證書 ,Kubelet 組件證書 默認有效期為1年。集群運行1年以后就會導致報 certificate has expired or is not yet valid 錯誤,導致集群 Node不能於集群 Master正常通信。

二、 解決方法

添加參數

  • 修改 kubelet 組件配置,具體添加下面參數

    1 --feature-gates=RotateKubeletServerCertificate=true
    2 --feature-gates=RotateKubeletClientCertificate=true
    3 # 1.8版本以上包含1.8都支持證書更換自動重載,以下版本只能手動重啟服務
    4 --rotate-certificates
  • 修改 controller-manager 組件配置,具體添加下面參數 

  • 1 # 證書有效期為10年
    2 
    3 --experimental-cluster-signing-duration=87600h0m0s
    4 
    5 --feature-gates=RotateKubeletServerCertificate=true

創建自動批准相關 CSR 請求的 ClusterRole

vim tls-instructs-csr.yaml && kubectl apply -f tls-instructs-csr.yaml

  • 1 kind: ClusterRole
    2 apiVersion: rbac.authorization.k8s.io/v1
    3 metadata:
    4   name: system:certificates.k8s.io:certificatesigningrequests:selfnodeserver
    5 rules:
    6 - apiGroups: ["certificates.k8s.io"]
    7   resources: ["certificatesigningrequests/selfnodeserver"]
    8   verbs: ["create"]
#自動批准 kubelet-bootstrap 用戶 TLS bootstrapping 首次申請證書的 CSR 請求
kubectl create clusterrolebinding node-client-auto-approve-csr --clusterrole=system:certificates.k8s.io:certificatesigningrequests:nodeclient --user=kubelet-bootstrap

 

#自動批准 system:nodes 組用戶更新 kubelet 自身與 apiserver 通訊證書的 CSR 請求
kubectl create clusterrolebinding node-client-auto-renew-crt --clusterrole=system:certificates.k8s.io:certificatesigningrequests:selfnodeclient --group=system:nodes
#自動批准 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 服務

 1 $ systemctl daemon-reload 
2
$ systemctl restart kube-controller-manager.service 3 # 進入到ssl配置目錄,刪除 kubelet 證書 4 $ rm -f kubelet-client-current.pem kubelet-client-*.pem kubelet.key kubelet.crt 5 6 # 重啟啟動,啟動正常后會頒發有效期10年的ssl證書 7 $ systemctl restart kubelet 8 9 10 # 進入到ssl配置目錄,查看證書有效期 11 $ openssl x509 -in kubelet-client-current.pem -noout -text | grep "Not" 12 Not Before: Nov 22 08:46:00 2019 GMT
13 Not After : Nov 19 08:46:00 2029 GMT

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM