(二進制安裝)k8s1.9 證書過期及開啓自動續期方案.md

kubelet證書過期處理方案

集羣中某node狀態爲notReady,apiserver 報錯Unable to authenticate the request due to an error: x509: certificate has expired or is not yet valid

1 查看證書有效期

openssl x509 -in /etc/ssl/k8s/kubelet.crt -noout -text 

在證書過期node節點刪除kubelet相關證書文件及配置文件然後重啓kubelet,kubelet會向apiserver發起一個csr。

2 刪除kubelet相關證書

rm  /etc/kubernetes/kubelet.kubeconfig
rm  /etc/kubernetes/ssl/kubelet.*

3 重啓kubelet

systemctl  restart kubelet
systemctl  status  kubelet

4 apiserver 查看未授權的CSR請求,並授權

kubectl get csr
#獲取到的csr若爲csr-4pw6g
kubectl certificate approve csr-4pw6g

5 查看node狀態

kubectl get node

Ready則處理完成

在kubernetes1.7之後,可以採用集羣自動簽發證書方案,但仍然需要手動重啓kubelet, 在1.8之後,就可以自動簽發,自動renew證書;也可以設置更長的有效期。

開啓kubelet證書自動續期

在自動續期下引導過程與單純的手動批准 CSR 有點差異,具體的引導流程地址如下:

  • kubelet 讀取 bootstrap.kubeconfig,使用其 CA 與 Token 向 apiserver 發起第一次 CSR 請求(nodeclient)
  • apiserver 根據 RBAC 規則自動批准首次 CSR 請求(approve-node-client-csr),並下發證書(kubelet-client.crt)
  • kubelet 使用剛剛簽發的證書(O=system:nodes, CN=system:node:NODE_NAME)與 apiserver 通訊,併發起申請 10250 server 所使用證書的 CSR 請求
  • apiserver 根據 RBAC 規則自動批准 kubelet 爲其 10250 端口申請的證書(kubelet-server-current.crt)
  • 證書即將到期時,kubelet 自動向 apiserver 發起用於與 apiserver 通訊所用證書的 renew CSR 請求和 renew 本身 10250 端口所用證書的 CSR 請求
  • apiserver 根據 RBAC 規則自動批准兩個證書
  • kubelet 拿到新證書後關閉所有連接,reload 新證書,以後便一直如此

從以上流程我們可以看出,我們如果要創建 RBAC 規則,則至少能滿足四種情況:

  • 自動批准 kubelet 首次用於與 apiserver 通訊證書的 CSR 請求(nodeclient)
  • 自動批准 kubelet 首次用於 10250 端口鑑權的 CSR 請求(實際上這個請求走的也是 selfnodeserver 類型 CSR)
  • 自動批准 kubelet 後續 renew 用於與 apiserver 通訊證書的 CSR 請求(selfnodeclient)
  • 自動批准 kubelet 後續 renew 用於 10250 端口鑑權的 CSR 請求(selfnodeserver)

在 1.7 後,kubelet 啓動時增加 --feature-gates=RotateKubeletClientCertificate=true,RotateKubeletServerCertificate=true 選項,則 kubelet 在證書即將到期時會自動發起一個 renew 自己證書的 CSR 請求;同時 controller manager 需要在啓動時增加 --feature-gates=RotateKubeletServerCertificate=true 參數,再配合相應創建好的 ClusterRoleBinding,kubelet client 和 kubelet server 證才書會被自動簽署。

配置 kubelet 自動續期,RotateKubeletClientCertificate 用於自動續期 kubelet 連接 apiserver 所用的證書(kubelet-client-xxxx.pem),RotateKubeletServerCertificate 用於自動續期 kubelet 10250 api 端口所使用的證書(kubelet-server-xxxx.pem),–rotate-certificates 選項使得 kubelet 能夠自動重載新證書(rotate-certificates參數1.8以後纔有,1.7配置自動證書續期後仍需重啓kubelet)

1 kubelet 配置參數

--feature-gates=RotateKubeletClientCertificate=true,RotateKubeletServerCertificate=true
--rotate-certificates=true

2 kube-controller-manager配置參數

--feature-gates=RotateKubeletClientCertificate=true,RotateKubeletServerCertificate=true
--experimental-cluster-signing-duration=87600h0m0s

kubelet配置後,controller manager 自動批准相關 CSR 請求,controller manager如果不配置 --feature-gates=RotateKubeletServerCertificate=true 參數,則即使配置了相關的 RBAC 規則,也只會自動批准 kubelet client 的 renew 請求

kube-controller-manager 組件提供了一個 --experimental-cluster-signing-duration 參數來設置簽署的證書有效時間;默認爲 8760h0m0s,將其改爲 87600h0m0s 即 10 年後再進行 TLS bootstrapping 簽署證書即可。

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

1.8後 的 apiserver 自動創建了兩條 ClusterRole,分別是system:certificates.k8s.io:certificatesigningrequests:nodeclient, system:certificates.k8s.io:certificatesigningrequests:selfnodeclient,還需要創建一條。

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"]

4 ClusterRole綁定到適當的用戶組

將 ClusterRole 綁定到適當的用戶組,以完成自動批准相關 CSR 請求

此處的system:bootstrappers組與token.csv中的組對應

#token.csv
ae7cee6997302be28077fcc96c2f5c14,kubelet-bootstrap,10001,"system:kubelet-bootstrap"
#格式 Token,用戶名,UID,用戶組

# 允許 system:bootstrappers 組用戶創建 CSR 請求
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --group=system:kubelet-bootstrap

# 自動批准 system:bootstrappers 組用戶 TLS bootstrapping 首次申請證書的 CSR 請求
kubectl create clusterrolebinding node-client-auto-approve-csr --clusterrole=system:certificates.k8s.io:certificatesigningrequests:nodeclient --group=system:kubelet-bootstrap
#注意 clusterrolebinding kubelet-bootstrap及node-client-auto-approve-csr 中的--group=system:kubelet-bootstrap 可以替換爲--user=kubelet-bootstrap,與token.csv保持一致。

# 自動批准 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

kubelet證書介紹

token.csv

該文件爲一個用戶的描述文件,基本格式爲 Token,用戶名,UID,用戶組;這個文件在 apiserver 啓動時被 apiserver 加載,然後就相當於在集羣內創建了一個這個用戶;接下來就可以用 RBAC 給他授權;持有這個用戶 Token 的組件訪問 apiserver 的時候,apiserver 根據 RBAC 定義的該用戶應當具有的權限來處理相應請求

bootstarp.kubeconfig

該文件中內置了 token.csv 中用戶的 Token,以及 apiserver CA 證書;kubelet 首次啓動會加載此文件,使用 apiserver CA 證書建立與 apiserver 的 TLS 通訊,使用其中的用戶 Token 作爲身份標識像 apiserver 發起 CSR 請求

kubelet-client.crt

該文件在 kubelet 完成 TLS bootstrapping 後生成,此證書是由 controller manager 簽署的,此後 kubelet 將會加載該證書,用於與 apiserver 建立 TLS 通訊,同時使用該證書的 CN 字段作爲用戶名,O 字段作爲用戶組向 apiserver 發起其他請求

kubelet.crt

該文件在 kubelet 完成 TLS bootstrapping 後並且沒有配置 --feature-gates=RotateKubeletServerCertificate=true 時纔會生成;這種情況下該文件爲一個獨立於 apiserver CA 的自籤 CA 證書,有效期爲 1 年;被用作 kubelet 10250 api 端口

kubelet-server.crt

該文件在 kubelet 完成 TLS bootstrapping 後並且配置了 --feature-gates=RotateKubeletServerCertificate=true 時纔會生成;這種情況下該證書由 apiserver CA 簽署,默認有效期同樣是 1 年,被用作 kubelet 10250 api 端口鑑權

kubelet-client-current.pem

這是一個軟連接文件,當 kubelet 配置了 --feature-gates=RotateKubeletClientCertificate=true選項後,會在證書總有效期的 70%~90% 的時間內發起續期請求,請求被批准後會生成一個 kubelet-client-時間戳.pem;kubelet-client-current.pem 文件則始終軟連接到最新的真實證書文件,除首次啓動外,kubelet 一直會使用這個證書同 apiserver 通訊

kubelet-server-current.pem

同樣是一個軟連接文件,當 kubelet 配置了 --feature-gates=RotateKubeletServerCertificate=true 選項後,會在證書總有效期的 70%~90% 的時間內發起續期請求,請求被批准後會生成一個 kubelet-server-時間戳.pem;kubelet-server-current.pem 文件則始終軟連接到最新的真實證書文件,該文件將會一直被用於 kubelet 10250 api 端口鑑權

參考:
https://yq.aliyun.com/articles/647345
https://www.cnblogs.com/rootid/p/9850713.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章