使用 kubeadm 進行證書管理


 

參考:https://kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/

版本:v1.21

FEATURE STATE: Kubernetes v1.15 [stable]

由 kubeadm 生成的客戶端證書在 1 年后到期。 本頁說明如何使用 kubeadm 管理證書續訂。

檢查證書是否過期

你可以使用 check-expiration 子命令來檢查證書何時過期

kubeadm certs check-expiration 

輸出類似於以下內容:

CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED admin.conf Aug 02, 2022 09:12 UTC 364d no apiserver Aug 02, 2022 09:12 UTC 364d ca no apiserver-etcd-client Aug 02, 2022 09:12 UTC 364d etcd-ca no apiserver-kubelet-client Aug 02, 2022 09:12 UTC 364d ca no controller-manager.conf Aug 02, 2022 09:12 UTC 364d no etcd-healthcheck-client Aug 02, 2022 09:12 UTC 364d etcd-ca no etcd-peer Aug 02, 2022 09:12 UTC 364d etcd-ca no etcd-server Aug 02, 2022 09:12 UTC 364d etcd-ca no front-proxy-client Aug 02, 2022 09:12 UTC 364d front-proxy-ca no scheduler.conf Aug 02, 2022 09:12 UTC 364d no CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED ca Jul 21, 2031 08:00 UTC 9y no etcd-ca Jul 21, 2031 08:00 UTC 9y no front-proxy-ca Jul 21, 2031 08:00 UTC 9y no 

該命令顯示 /etc/kubernetes/pki 文件夾中的客戶端證書以及 kubeadm(admin.conf, controller-manager.conf 和 scheduler.conf) 使用的 KUBECONFIG 文件中嵌入的客戶端證書的到期時間/剩余時間。

另外, kubeadm 會通知用戶證書是否由外部管理; 在這種情況下,用戶應該小心的手動/使用其他工具來管理證書更新。

警告: kubeadm 不能管理由外部 CA 簽名的證書

說明: 上面的列表中沒有包含 kubelet.conf,因為 kubeadm 將 kubelet 配置為 自動更新證書。 輪換的證書位於目錄 /var/lib/kubelet/pki。 要修復過期的 kubelet 客戶端證書,請參閱 kubelet 客戶端證書輪換失敗。

自動更新證書

kubeadm 會在控制面 升級 的時候更新所有證書。

這個功能旨在解決最簡單的用例;如果你對此類證書的更新沒有特殊要求, 並且定期執行 Kubernetes 版本升級(每次升級之間的間隔時間少於 1 年), 則 kubeadm 將確保你的集群保持最新狀態並保持合理的安全性。

說明: 最佳的做法是經常升級集群以確保安全。

手動更新證書

重要警告:
在做任何操作之前,務必先備份相關證書和kubeconfig配置文件。
不要重新生成ca證書,因為更新了ca證書,集群節點就需要手工操作,才能讓集群正常(會涉及重新join)。
由於service account的密鑰是以rsa密鑰對形式生成,所以沒有過期時間。如無必要,千萬不要生成重新生成sa密鑰。因為sa密鑰關聯到一切系統pod內的進程訪問api server時的認證。如果更新了sa,則需要先重新生成這些pod加載的token,再刪除這些pod之后,重新加載token文件。經過測試,這些系統級pod包括但不限於kube-proxy,flannel,kubenetes-dashboard, kube-stat-metricst等所有用到sa認證的pod。

你能隨時通過 kubeadm certs renew 命令手動更新你的證書。

此命令用 CA (或者 front-proxy-CA )證書和存儲在 /etc/kubernetes/pki 中的密鑰執行更新。

警告: 如果你運行了一個 HA 集群,這個命令需要在所有控制面板節點上執行。

說明: certs renew 使用現有的證書作為屬性 (Common Name、Organization、SAN 等) 的權威來源, 而不是 kubeadm-config ConfigMap 。強烈建議使它們保持同步。

kubeadm certs renew提供以下選項:

Kubernetes 證書通常在一年后到期。

  • --csr-only 可用於經過一個外部 CA 生成的證書簽名請求來更新證書(無需實際替換更新證書); 更多信息請參見下節。
  • 可以更新單個證書而不是全部證書。

證書目錄結構

root@k8s-master:/etc/kubernetes/pki# tree . ├── apiserver.crt ├── apiserver-etcd-client.crt ├── apiserver-etcd-client.key ├── apiserver.key ├── apiserver-kubelet-client.crt ├── apiserver-kubelet-client.key ├── ca.crt ├── ca.key ├── etcd │   ├── ca.crt │   ├── ca.key │   ├── healthcheck-client.crt │   ├── healthcheck-client.key │   ├── peer.crt │   ├── peer.key │   ├── server.crt │   └── server.key ├── front-proxy-ca.crt ├── front-proxy-ca.key ├── front-proxy-client.crt ├── front-proxy-client.key ├── sa.key └── sa.pub 1 directory, 22 files 

證書說明:

1.Kubernetes 集群根證書 /etc/kubernetes/pki/ca.crt /etc/kubernetes/pki/ca.key 由此根證書簽發的證書有: kube-apiserver 組件持有的服務端證書 /etc/kubernetes/pki/apiserver.crt   /etc/kubernetes/pki/apiserver.key kubelet 組件持有的客戶端證書   /etc/kubernetes/pki/apiserver-kubelet-client.crt   /etc/kubernetes/pki/apiserver-kubelet-client.key 注意:kubelet 上一般不會明確指定服務端證書, 而是只指定 ca 根證書, 讓 kubelet 根據本地主機信息自動生成服務端證書並保存到配置的cert-dir文件夾中。輪換的證書默認位於目錄 /var/lib/kubelet/pki。 2.匯聚層(aggregator)證書 /etc/kubernetes/pki/front-proxy-ca.crt /etc/kubernetes/pki/front-proxy-ca.key 由此根證書簽發的證書只有一組: 代理端使用的客戶端證書, 用作代用戶與 kube-apiserver 認證 /etc/kubernetes/pki/front-proxy-client.crt /etc/kubernetes/pki/front-proxy-client.key 3.etcd 集群根證書 /etc/kubernetes/pki/etcd/ca.crt /etc/kubernetes/pki/etcd/ca.key 由此根證書簽發機構簽發的證書有: etcd server 持有的服務端證書 /etc/kubernetes/pki/etcd/server.crt /etc/kubernetes/pki/etcd/server.key peer 集群中節點互相通信使用的客戶端證書 /etc/kubernetes/pki/etcd/peer.crt /etc/kubernetes/pki/etcd/peer.key pod 中定義 Liveness 探針使用的客戶端證書 /etc/kubernetes/pki/etcd/healthcheck-client.crt /etc/kubernetes/pki/etcd/healthcheck-client.key 配置在 kube-apiserver 中用來與 etcd server 做雙向認證的客戶端證書 /etc/kubernetes/pki/apiserver-etcd-client.crt /etc/kubernetes/pki/apiserver-etcd-client.key 4.Serveice Account秘鑰 這組的密鑰對兒僅提供給 kube-controller-manager 使用。 kube-controller-manager 通過 sa.key 對 token 進行簽名, master 節點通過公鑰 sa.pub 進行簽名的驗證. API Server的authenticating環節支持多種身份校驗方式:client cert、bearer token、static password auth等,這些方式中有一種方式通過authenticating(Kubernetes API Server會逐個方式嘗試),那么身份校驗就會通過。 一旦API Server發現client發起的request使用的是service account token的方式,API Server就會自動采用signed bearer token方式進行身份校驗。而request就會使用攜帶的service account token參與驗證。 該token是API Server在創建service account時用API server啟動參數:–service-account-key-file的值簽署(sign)生成的。 如果–service-account-key-file未傳入任何值,那么將默認使用–tls-private-key-file的值,即API Server的私鑰(server.key)。 通過authenticating后,API Server將根據Pod username所在的group:system:serviceaccounts和system:serviceaccounts:(NAMESPACE)的權限對其進行authority 和admission control兩個環節的處理。 在這兩個環節中,cluster管理員可以對service account的權限進行細化設置。 /etc/kubernetes/pki/sa.key /etc/kubernetes/pki/sa.pub 注意:kubeadm 創建的集群, kube-proxy ,flannel,coreDNS是以 pod 形式運行的, 在 pod 中, 直接使用 service account 與 kube-apiserver 進行認證,此時就不需要再單獨為 kube-proxy 創建證書。 

更新證書

1.生成集群配置的yaml文件

root@k8s-master:~# kubeadm config view > /root/kubeadm.yaml Command "view" is deprecated, This command is deprecated and will be removed in a future release, please use 'kubectl get cm -o yaml -n kube-system kubeadm-config' to get the kubeadm config directly. 

2.每個Master操作

mkdir /etc/kubernetes.bak cp -r /etc/kubernetes/* /etc/kubernetes.bak cp -r /var/lib/etcd /var/lib/etcd.bak


# 備份並刪除舊的配置文件
$ mv /etc/kubernetes/admin.conf /etc/kubernetes/admin.conf.bak $ mv /etc/kubernetes/kubelet.conf /etc/kubernetes/kubelet.conf.bak $ mv /etc/kubernetes/controller-manager.conf /etc/kubernetes/controller-manager.conf.bak $ mv /etc/kubernetes/scheduler.conf /etc/kubernetes/scheduler.conf.bak


$ kubeadm certs renew all --config=/root/kubeadm.yaml
 
$ kubeadm init phase kubeconfig all --config kubeadm.yaml [kubeconfig] Using kubeconfig folder "/etc/kubernetes" [kubeconfig] Using existing up-to-date kubeconfig file: "/etc/kubernetes/admin.conf" [kubeconfig] Using existing up-to-date kubeconfig file: "/etc/kubernetes/kubelet.conf" [kubeconfig] Using existing up-to-date kubeconfig file: "/etc/kubernetes/controller-manager.conf" [kubeconfig] Using existing up-to-date kubeconfig file: "/etc/kubernetes/scheduler.conf"
 
           

輸出類似以下內容:

certificate embedded in the kubeconfig file for the admin to use and for kubeadm itself renewed certificate for serving the Kubernetes API renewed certificate the apiserver uses to access etcd renewed certificate for the API server to connect to kubelet renewed certificate embedded in the kubeconfig file for the controller manager to use renewed certificate for liveness probes to healthcheck etcd renewed certificate for etcd nodes to communicate with each other renewed certificate for serving etcd renewed certificate for the front proxy client renewed certificate embedded in the kubeconfig file for the scheduler manager to use renewed Done renewing certificates. You must restart the kube-apiserver, kube-controller-manager, kube-scheduler and etcd, so that they can use the new certificates. 

注:也可以逐個組件更新。

# 更新kubeconfig文件 cp $HOME/.kube/config $HOME/.kube/config.old cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config

3.再次查詢證書期限

# kubeadm certs check-expiration 

4.如果使用Docker運行時,可以在三台Master上執行以下命令重啟kube-apiserver,kube-controller,kube-scheduler,etcd這4個容器,使證書生效

# docker ps | grep -E 'k8s_kube-apiserver|k8s_kube-controller-manager|k8s_kube-scheduler|k8s_etcd_etcd' | awk -F ' ' '{print $1}' | xargs docker restart


免責聲明!

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



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