1. 程式人生 > 其它 >使用 kubeadm 進行證書管理

使用 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
作者:張瑞153169 出處:http://www.cnblogs.com/zhangrui153169/

-------------------------------------------

個性簽名:獨學而無友,則孤陋而寡聞。做一個靈魂有趣的人!

如果覺得這篇文章對你有小小的幫助的話,記得在右下角點個“推薦”哦,在此感謝!