查看k8s中所有證書的到期時間:
kubeadm alpha certs check-expiration

查看CA證書過期時間:
openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -text |grep Not

查看集群證書過期時間:
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ' Not '

如果集群證書還沒有過期
獲取一個創(chuàng)建好的 k8s集群的初始化配置文件
kubeadm config view > kubeadm.yaml

如果證書已經(jīng)過期了:
vim kubeadm.yaml
sion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
kubernetesVersion: v1.15.0 # kubernetes 版本
apiServer:
certSANs:
- 192.168.10.xxx # master 所有節(jié)點IP地址,包括master和slave
- 192.168.10.xxx # slave1
- 192.168.10.xxx # slave2
extraArgs:
service-node-port-range: 80-32767
advertise-address: 0.0.0.0
controlPlaneEndpoint: "192.168.10.xxx:6443" # APIserver 地址,也就是master節(jié)點地址
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers #這里使用國內(nèi)阿里云的鏡像倉庫
或者更簡單的:
apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
kubernetesVersion: v1.13.5 #--------這里改成你集群對應的版本
imageRepository: k8s.gcr.io #-------k8s官方的鏡像倉庫
重新生成默認一年時長證書
在集群已經(jīng)部署好的情況下集群的證書過期,可以選擇對證書進行重新生成。
單master或多master集群(etcd在集群內(nèi))處理:
1)、備份原先的證書文件和配置文件:
cp -rp /etc/kubernetes /etc/kubernetes.bak
2)、刪除過期的證書文件:
(注意:1.13.0以下的版本需要刪除舊的證書,不然不會重新生成,1.13.5以上的就不用操作了會自動更新的。ca.cer\ca.key\sa的這些證書不要刪除ca默認就是10年沒必要重新生成,同時kubeadm在重新生成apiserver這些組件的證書的時候需要使用ca證書來進行簽發(fā))
$ rm -f /etc/kubernetes/pki/apiserver*
$ rm -f /etc/kubernetes/pki/front-proxy-client.*
$ rm -rf /etc/kubernetes/pki/etcd/healthcheck-client.*
$ rm -rf /etc/kubernetes/pki/etcd/server.*
$ rm -rf /etc/kubernetes/pki/etcd/peer.*
3)、獲取k8s集群初始化的配置文件yaml文件:
kubeadm config view > kubeadm.yaml
4)、生成新的證書文件
生成證書有兩種方式一種是重新生成私鑰和公鑰,一種是使用存在的私鑰重新簽發(fā)。
生成相應組件的證書(此格式會使用相應組件的原來的key重新簽發(fā)證書):
$kubeadm alpha phase certs renew etcd-healthcheck-client --config kubeadm.yaml
$kubeadm alpha phase certs renew etcd-peer --config kubeadm.yaml
$kubeadm alpha phase certs renew etcd-server --config kubeadm.yaml
$kubeadm alpha phase certs renew front-proxy-client--config kubeadm.yaml
$kubeadm alpha phase certs renew apiserver-etcd-client --config kubeadm.yaml
$kubeadm alpha phase certs renew apiserver-kubelet-client --config kubeadm.yaml
$kubeadm alpha phase certs renew apiserver --config kubeadm.yaml
##或者重新簽發(fā)全部組件的證書
$kubeadm alpha phase certs renew all --config kubeadm.yaml
kubeadm alpha certs renew all --config=kubeadm.yaml #我用的這個,上邊那個我的平臺運行失敗。
或如下格式(這種格式需要刪除原來存在的相應證書和key,此格式會重新創(chuàng)建相應組件的私鑰和公鑰):
$kubeadm init phase certs apiserver --config kubeadm.yaml
生成新的配置文件(admin.conf、controller-manager.conf、kubelet.conf、scheduler.conf):
mv /etc/kubernetes/*.conf ~/.
kubeadm alpha phase kubeconfig all --config kubeadm.yaml
或如下格式重新生成相關組件的配置文件:
kubeadm init phase kubeconfig all --config kubeadm.yaml #我用的這個
將新生成的admin.conf文件覆蓋掉.kube/config文件:
mv $HOME/.kube/config $HOME/.kube/config.old
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
chmod 644 $HOME/.kube/config
5)、重啟kube-apiserver,kube-controller,kube-scheduler,etcd這4個容器:(一定要ps -a要不有可能服務容器沒啟動)
docker ps -a | grep -v pause | grep -E "etcd|scheduler|controller|apiserver" | awk '{print $1}' | awk '{print "docker","restart",$1}' | bash
6)、各節(jié)點重啟kubelet或相關組件:
systemctl restart kubelet
注意:若集群式采用高可用ha方式安裝的話有所區(qū)別,etd的相關證書需要另外簽發(fā)操作,要是之前搭建集群的時候已經(jīng)使用了長時間的則僅僅需要處理k8s其它組件的證書即可。
再查看證書過期時間已經(jīng)更新了。
參考文檔
http://www.itdecent.cn/p/289c62200818
https://www.cnblogs.com/skymyyang/p/11093686.html
https://blog.51cto.com/u_12988868/2587697
http://www.itdecent.cn/p/cdffaff82a34
客戶端kubelet證書輪換自動續(xù)期:
kubectl證書輪換是在當前證書即將過期時,將自動生成新的密鑰,并從k8s api申請新的證書。
kubelet 進程接收 --rotate-certificates 參數(shù),該參數(shù)決定 kubelet 在當前使用的證書即將到期時,是否會自動申請新的證書。 由于證書輪換是 beta 特性,必須通過參數(shù) --feature-gates=RotateKubeletClientCertificate=true 進行啟用。
kube-controller-manager 進程接收 --experimental-cluster-signing-duration 參數(shù),該參數(shù)控制證書簽發(fā)的有效期限。
當 kubelet 啟動時,如被配置為自舉(使用--bootstrap-kubeconfig 參數(shù)),kubelet 會使用其初始證書連接到 Kubernetes API ,并發(fā)送證書簽名的請求。 可以通過以下方式查看證書簽名請求的狀態(tài):
$kubectl get csr
最初,來自節(jié)點上 kubelet 的證書簽名請求處于 Pending 狀態(tài)。 如果證書簽名請求滿足特定條件, 控制管理器會自動批準,此時請求會處于 Approved 狀態(tài)。 接下來,控制器管理器會簽署證書, 證書的有效期限由 --experimental-cluster-signing-duration 參數(shù)指定,簽署的證書會被附加到證書簽名請求中。
Kubelet 會從 Kubernetes API 取回簽署的證書,并將其寫入磁盤,存儲位置通過 --cert-dir 參數(shù)指定。 然后 kubelet 會使用新的證書連接到 Kubernetes API。
當簽署的證書即將到期時,kubelet 會使用 Kubernetes API,發(fā)起新的證書簽名請求。 同樣地,控制管理器會自動批準證書請求,并將簽署的證書附加到證書簽名請求中。 Kubelet 會從 Kubernetes API 取回簽署的證書,并將其寫入磁盤。 然后它會更新與 Kubernetes API 的連接,使用新的證書重新連接到 Kubernetes API。
1)、開啟證書輪換:
修改kubelet啟動配置文件增加如下參數(shù)
在/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf增加如下參數(shù):
Environment="KUBELET_EXTRA_ARGS=--feature-gates=RotateKubeletServerCertificate=true --feature-gates=RotateKubeletClientCertificate=true"
修改kube-controller-manager.yaml配置文件
在/etc/kubernetes/manifests/kube-controller-manager.yaml 添加如下參數(shù):
- command:
- kube-controller-manager
- --experimental-cluster-signing-duration=87600h0m0s #10年
- --feature-gates=RotateKubeletServerCertificate=true
- ....
創(chuàng)建 rbac 對象
創(chuàng)建rbac對象,允許節(jié)點輪換kubelet server證書:
vim kubelet-ca-update.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
labels:
kubernetes.io/bootstrapping: rbac-defaults
name: system:certificates.k8s.io:certificatesigningrequests:selfnodeserver
rules:
- apiGroups:
- certificates.k8s.io
resources:
- certificatesigningrequests/selfnodeserver
verbs:
- create
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubeadm:node-autoapprove-certificate-server
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:certificates.k8s.io:certificatesigningrequests:selfnodeserver
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: system:nodes
kubectl create -f kubelet-ca-update.yaml