一 檢視證書
1.1 檢視過期時間-方式一
1 [root@master01 ~]# tree /etc/kubernetes/pki/ 2 [root@master01 ~]# for tls in `find /etc/kubernetes/pki -maxdepth 2 -name "*.crt"`; \ 3 do echo ===============$tls===============; \ 4 openssl x509 -in $tls -text| grep Not; \ 5 done
1.1 檢視過期時間-方式二
1 [root@master01 ~]# tree /etc/kubernetes/pki/
1 [root@master01 ~]# kubeadm alpha certs check-expiration
提示:由上可知,根證書有效期為10年,其他所有證書有效期為1年。
二 證書類別
2.1 叢集根證書
1 [root@master01 ~]# ll /etc/kubernetes/pki/ca* 2 -rw-r--r-- 1 root root 1.1K Jun 15 21:08 /etc/kubernetes/pki/ca.crt 3 -rw------- 1 root root 1.7K Jun 15 21:08 /etc/kubernetes/pki/ca.key
由此叢集根證書籤發的證書有:
- kube-apiserver 元件持有的服務端證書
1 [root@master01 ~]# ll /etc/kubernetes/pki/apiserver.* 2 -rw-r--r-- 1 root root 1.3K Jun 15 21:08 /etc/kubernetes/pki/apiserver.crt 3 -rw------- 1 root root 1.7K Jun 15 21:08 /etc/kubernetes/pki/apiserver.key
- kubelet 元件持有的客戶端證書
1 [root@master01 ~]# ll /etc/kubernetes/pki/apiserver-kubelet-client.* 2 -rw-r--r-- 1 root root 1.1K Jun 15 21:08 /etc/kubernetes/pki/apiserver-kubelet-client.crt 3 -rw------- 1 root root 1.7K Jun 15 21:08 /etc/kubernetes/pki/apiserver-kubelet-client.key
提示:kubelet的/var/lib/kubelet/config.yaml配置檔案中一般不會明確指定服務端證書,而是隻指定 ca 根證書, 讓 kubelet 根據本地主機資訊自動生成服務端證書並儲存到配置的cert-dir資料夾中。
2.2 匯聚層證書
1 [root@master01 ~]# ll /etc/kubernetes/pki/front-proxy-ca.* 2 -rw-r--r-- 1 root root 1.1K Jun 15 21:08 /etc/kubernetes/pki/front-proxy-ca.crt 3 -rw------- 1 root root 1.7K Jun 15 21:08 /etc/kubernetes/pki/front-proxy-ca.key
由此匯聚層根證書籤發的證書有:
1 [root@master01 ~]# ll /etc/kubernetes/pki/front-proxy-client.* 2 -rw-r--r-- 1 root root 1.1K Jun 15 21:08 /etc/kubernetes/pki/front-proxy-client.crt 3 -rw------- 1 root root 1.7K Jun 15 21:08 /etc/kubernetes/pki/front-proxy-client.key 4
2.3 etcd叢集根證書
1 [root@master01 ~]# ll /etc/kubernetes/pki/etcd/ca.* 2 -rw-r--r-- 1 root root 1017 Jun 15 21:08 /etc/kubernetes/pki/etcd/ca.crt 3 -rw------- 1 root root 1.7K Jun 15 21:08 /etc/kubernetes/pki/etcd/ca.key 4
由此etcd根證書籤發的證書有:
- etcd server服務端證書
1 [root@master01 ~]# ll /etc/kubernetes/pki/etcd/server.* 2 -rw-r--r-- 1 root root 1.2K Jun 15 21:08 /etc/kubernetes/pki/etcd/server.crt 3 -rw------- 1 root root 1.7K Jun 15 21:08 /etc/kubernetes/pki/etcd/server.key 4
- etcd 叢集中peer節點互相通訊使用的客戶端證書
1 [root@master01 ~]# ll /etc/kubernetes/pki/etcd/peer.* 2 -rw-r--r-- 1 root root 1.2K Jun 15 21:08 /etc/kubernetes/pki/etcd/peer.crt 3 -rw------- 1 root root 1.7K Jun 15 21:08 /etc/kubernetes/pki/etcd/peer.key 4
- pod 中定義 Liveness 探針使用的客戶端證書
1 [root@master01 ~]# ll /etc/kubernetes/pki/etcd/healthcheck-client.* 2 -rw-r--r-- 1 root root 1.1K Jun 15 21:08 /etc/kubernetes/pki/etcd/healthcheck-client.crt 3 -rw------- 1 root root 1.7K Jun 15 21:08 /etc/kubernetes/pki/etcd/healthcheck-client.key 4
- 配置在 kube-apiserver 中用來與 etcd server 做雙向認證的客戶端證書
1 [root@master01 ~]# ll /etc/kubernetes/pki/apiserver-etcd-client.* 2 -rw-r--r-- 1 root root 1.1K Jun 15 21:08 /etc/kubernetes/pki/apiserver-etcd-client.crt 3 -rw------- 1 root root 1.7K Jun 15 21:08 /etc/kubernetes/pki/apiserver-etcd-client.key 4
2.4 Serveice Account金鑰
1 [root@master01 ~]# ll /etc/kubernetes/pki/sa.* 2 -rw------- 1 root root 1.7K Jun 15 21:08 /etc/kubernetes/pki/sa.key 3 -rw------- 1 root root 451 Jun 15 21:08 /etc/kubernetes/pki/sa.pub 4
Serveice Account金鑰對僅提供給 kube-controller-manager 使用. kube-controller-manager 通過 sa.key 對 token 進行簽名, master 節點通過公鑰 sa.pub 進行簽名的驗證。
延伸:API Server身份驗證過程:
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的許可權進行細化設定。
kubeadm 建立的叢集,kube-proxy、flannel、coreDNS是以 pod 形式執行的,在 pod 中,直接使用 service account 與 kube-apiserver 進行認證,此時就不需要再單獨為 kube-proxy 建立證書。
三 更新證書方法一
提示:此方式採用kubeadm預設延期1年時間的策略,若要自定義更長時間,如100年,才開步驟四。
3.1 備份叢集配置
1 [root@master01 ~]# kubeadm config view > kubeadm-cluster.yaml
3.2 更新證書
1 [root@master01 ~]# kubeadm alpha certs renew --help #檢視幫助
提示:由help可知,證書更新可針對單個證書更新。
1 [root@master01 ~]# kubeadm alpha certs renew all --config=kubeadm-cluster.yaml #更新所有證書
1 [root@master01 ~]# kubeadm alpha certs check-expiration #確認驗證
1 [root@master01 ~]# scp -rp kubeadm-cluster.yaml root@master02:/root/ 2 [root@master01 ~]# scp -rp kubeadm-cluster.yaml root@master03:/root/ 3 [root@master02 ~]# kubeadm alpha certs renew all --config=kubeadm-cluster.yaml 4 [root@master03 ~]# kubeadm alpha certs renew all --config=kubeadm-cluster.yaml 5
提示:更新操作需要在所有master節點執行。
3.3 啟用證書
在三臺Master上執行重啟kube-apiserver、kube-controller、kube-scheduler、etcd這4個容器,以便使證書生效。
1 [root@master01 ~]# docker ps |grep -E 'k8s_kube-apiserver|k8s_kube-controller-manager|k8s_kube-scheduler|k8s_etcd_etcd' | awk -F ' ' '{print $1}' |xargs docker restart 2 [root@master02 ~]# docker ps |grep -E 'k8s_kube-apiserver|k8s_kube-controller-manager|k8s_kube-scheduler|k8s_etcd_etcd' | awk -F ' ' '{print $1}' |xargs docker restart 3 [root@master03 ~]# docker ps |grep -E 'k8s_kube-apiserver|k8s_kube-controller-manager|k8s_kube-scheduler|k8s_etcd_etcd' | awk -F ' ' '{print $1}' |xargs docker restart
提示:啟用操作需要在所有master節點執行。
四 更新證書方法二
提示:此方式採用編譯kubeadm原始碼,原始碼中自定義證書時間,如100年。
4.1 備份叢集配置
1 [root@master01 ~]# kubeadm config view > kubeadm-cluster.yaml
4.2 檢視當前版本
1 [root@master01 ~]# kubectl version
4.3 獲取原始碼
1 [root@master01 ~]# wget https://github.com/kubernetes/kubernetes/archive/v1.18.3.tar.gz 2 [root@master01 ~]# tar -zxvf v1.18.3.tar.gz 3
4.4 修改CA證書時間
1 [root@master01 ~]# vi kubernetes-1.18.3/staging/src/k8s.io/client-go/util/cert/cert.go 2 …… 3 57 func NewSelfSignedCACert(cfg Config, key crypto.Signer) (*x509.Certificate, error) { 4 …… 5 65 NotBefore: now.UTC(), 6 66 NotAfter: now.Add(duration365d * 100).UTC(), 7 ……
提示:ca證書最大時間限定為100年,若要將最大時限也延長,可在cert.go中修改如下maxAge值:
maxAge := time.Hour * 24 * 365 * 10
4.5 修改其他證書時間
1 [root@master01 ~]# vi kubernetes-1.18.3/cmd/kubeadm/app/constants/constants.go 2 …… 3 39 const ( 4 48 // CertificateValidity defines the validity for all the signed certificates generated by kubeadm 5 49 CertificateValidity = time.Hour * 24 * 365 * 100 6 …… 7 [root@master01 kubernetes-1.18.3]# cat build/build-image/cross/VERSION 8 v1.13.9-5 #使用官方corss版本
4.6 編譯kubeadm方式一
1 [root@master01 kubernetes-1.18.3]# docker pull us.gcr.io/k8s-artifacts-prod/build-image/kube-cross:v1.13.9-5 2 [root@master01 ~]# docker run --rm -v /root/kubernetes-1.18.3/:/go/src/k8s.io/kubernetes -it us.gcr.io/k8s-artifacts-prod/build-image/kube-cross:v1.13.9-5 bash 3 root@51e96585ea73:/go# cd /go/src/k8s.io/kubernetes 4 root@51e96585ea73:/go/src/k8s.io/kubernetes# make all WHAT=cmd/kubeadm GOFLAGS=-v
提示:若要編譯其他命令,可參考如下:
# 編譯kubelet
# make all WHAT=cmd/kubelet GOFLAGS=-v
# 編譯kubectl
# make all WHAT=cmd/kubectl GOFLAGS=-v
#編譯完命令在 _output/bin/kubeadm 目錄下,
#其中bin是使用了軟連線
#真實路徑是_output/local/bin/linux/amd64/kubeadm
1 root@51e96585ea73:/go/src/k8s.io/kubernetes# exit #退出容器 2 [root@master01 ~]# mv /usr/bin/kubeadm /usr/bin/kubeadm_backup #備份原kubeadm 3 [root@master01 ~]# cp kubernetes-1.18.3/_output/local/bin/linux/amd64/kubeadm /usr/bin/kubeadm 4 [root@master01 ~]# kubeadm version #檢視版本 5
4.7 編譯kubeadm方式二
1 [root@master01 ~]# yum -y install gcc make rsync jq 2 [root@master01 ~]# wget https://dl.google.com/go/go1.13.9.linux-amd64.tar.gz 3 [root@master01 ~]# tar zxvf go1.13.9.linux-amd64.tar.gz -C /usr/local/ 4 [root@master01 ~]# vi /etc/profile.d/goenv.sh 5 #go setting 6 export GOROOT=/usr/local/go 7 export GOPATH=/usr/local/gopath 8 export PATH=$PATH:$GOROOT/bin 9 [root@master01 ~]# source /etc/profile 10 [root@master01 ~]# go version 11 go version go1.13.9 linux/amd64 12 [root@master01 ~]# cd kubernetes-1.18.3/ 13 [root@master01 kubernetes-1.18.3]# make all WHAT=cmd/kubeadm GOFLAGS=-v 14 [root@master01 kubernetes-1.18.3]# mv /usr/bin/kubeadm /usr/bin/kubeadm_backup #備份原kubeadm 15 [root@master01 kubernetes-1.18.3]# cp _output/local/bin/linux/amd64/kubeadm /usr/bin/kubeadm
4.8 備份叢集配置
1 [root@master01 ~]# kubeadm config view > kubeadm-cluster.yaml
4.8 更新證書
1 [root@master01 ~]# ssh root@master02 "mv /usr/bin/kubeadm /usr/bin/kubeadm_backup" 2 [root@master01 ~]# ssh root@master03 "mv /usr/bin/kubeadm /usr/bin/kubeadm_backup" 3 [root@master01 ~]# scp -rp kubeadm-cluster.yaml root@master02:/root/ 4 [root@master01 ~]# scp -rp kubeadm-cluster.yaml root@master03:/root/ 5 [root@master01 ~]# kubeadm alpha certs renew all --config=kubeadm-cluster.yaml 6 [root@master02 ~]# kubeadm alpha certs renew all --config=kubeadm-cluster.yaml 7 [root@master03 ~]# kubeadm alpha certs renew all --config=kubeadm-cluster.yaml 8 [root@master01 ~]# kubeadm alpha certs check-expiration #確認驗證
提示:更新操作需要在所有master節點執行。
所有根證書:ca、etcd-ca、front-proxy-ca只有在init初始化的時候才會更新時間,因此建議對於kubeadm部署Kubernetes,可以在初始化之前使用編譯的方式將證書設定為更長時間,如100年。
4.9 啟用證書
在三臺Master上執行重啟kube-apiserver、kube-controller、kube-scheduler、etcd這4個容器,以便使證書生效。
參考3.3即可。