自定義基于kubeadm創(chuàng)建的k8s集群證書
在 Kubernetes 集群的運(yùn)維過程中,證書管理是非常重要的一部分。尤其是自定義證書的過期時間和定期的證書檢查與替換。本文將詳細(xì)介紹如何自定義基于kubeadm創(chuàng)建的k8s集群證書。
1、確認(rèn)當(dāng)前Kubernetes版本
首先,確認(rèn)當(dāng)前 Kubernetes版本:
Bash
kubectl version
WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short. Use --output=yaml|json to get the full version.
Client Version: version.Info{Major:"1", Minor:"27", GitVersion:"v1.27.6", GitCommit:"741c8db18a52787d734cbe4795f0b4ad860906d6", GitTreeState:"clean", BuildDate:"2023-09-13T09:21:34Z", GoVersion:"go1.20.8", Compiler:"gc", Platform:"linux/amd64"}
Kustomize Version: v5.0.1
Server Version: version.Info{Major:"1", Minor:"27", GitVersion:"v1.27.6", GitCommit:"741c8db18a52787d734cbe4795f0b4ad860906d6", GitTreeState:"clean", BuildDate:"2023-09-13T09:14:09Z", GoVersion:"go1.20.8", Compiler:"gc", Platform:"linux/amd64"}
# 這里查看的go環(huán)境版本為:GoVersion:"go1.20.8"
# Kubernetes源碼版本為:GitVersion:"v1.27.6"
圖片
2、下載對應(yīng)源碼和編譯環(huán)境
下載對應(yīng)源碼
根據(jù)Kubernetes版本信息下載對應(yīng)版本的Kubernetes源碼,
下載地址:https://github.com/kubernetes/kubernetes/releases,
這里是v1.27.6版本
圖片
下載對應(yīng)go環(huán)境
根據(jù)Kubernetes版本信息下載對應(yīng)版本的go環(huán)境,下載地址:https://go.dev/dl/,這里是1.20.8版本
圖片
3、證書備份
為確保安全,先進(jìn)行證書備份:
Bash
# master
cp -r /etc/kubernetes/pki /etc/kubernetes/pki-backup
圖片
4、證書檢查
Kubernetes 提供了 kubeadm 命令來檢測集群證書的過期時間。執(zhí)行以下命令檢查證書狀態(tài):
Bash
kubeadm certs check-expiration
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Feb 14, 2026 05:26 UTC 364d ca no
apiserver Feb 14, 2026 05:26 UTC 364d ca no
apiserver-etcd-client Feb 14, 2026 05:26 UTC 364d etcd-ca no
apiserver-kubelet-client Feb 14, 2026 05:26 UTC 364d ca no
controller-manager.conf Feb 14, 2026 05:26 UTC 364d ca no
etcd-healthcheck-client Feb 14, 2026 05:26 UTC 364d etcd-ca no
etcd-peer Feb 14, 2026 05:26 UTC 364d etcd-ca no
etcd-server Feb 14, 2026 05:26 UTC 364d etcd-ca no
front-proxy-client Feb 14, 2026 05:26 UTC 364d front-proxy-ca no
scheduler.conf Feb 14, 2026 05:26 UTC 364d ca no
圖片
此命令會列出集群中所有證書的過期信息,當(dāng)前證書過期時間為1年。
5、自定義證書時間并替換
按照以下步驟進(jìn)行替換:
5.1 準(zhǔn)備編譯環(huán)境
在 master節(jié)點(diǎn)準(zhǔn)備編譯環(huán)境:
Bash
# master
tar xf go1.20.8.linux-amd64.tar.gz -C /usr/local/
echo "export PATH=$PATH:/usr/local/go/bin" >>/etc/profile
source /etc/profile
go version
圖片
5.2 源碼編譯和替換
然后,編譯 kubeadm 并替換原有版本:
Bash
# master
tar xf kubernetes-1.27.6.tar.gz
cd kubernetes-1.27.6/
vi cmd/kubeadm/app/constants/constants.go
圖片
修改證書有效期為 10 年(3650 天):
Bash
CertificateValidity = time.Hour * 24 * 365 * 10
圖片
編譯 kubeadm:
Bash
make WHAT=cmd/kubeadm GOFLAGS=-v
ll _output/bin/
mv /usr/bin/kubeadm /usr/bin/kubeadm.bak
cp _output/bin/kubeadm /usr/bin/
圖片
圖片
5.3 更新證書
執(zhí)行以下命令更新所有證書:
Bash
# master
kubeadm certs renew all
# 如不需要更新所有證書,可以按需更新以下證書
kubeadm certs renew admin.conf
kubeadm certs renew apiserver
kubeadm certs renew apiserver-kubelet-client
kubeadm certs renew controller-manager.conf
kubeadm certs renew front-proxy-client
kubeadm certs renew scheduler.conf
圖片
5.4 同步文件至其他Master節(jié)點(diǎn)
將更新后的 kubeadm 二進(jìn)制文件和證書同步到其他 Master 節(jié)點(diǎn):
Bash
scp /usr/bin/kubeadm master02:/usr/bin
scp /usr/bin/kubeadm master03:/usr/bin
5.5 重啟相關(guān)組件
最后,重啟相關(guān)的 Kubernetes 組件,使證書生效:
Bash
kubectl -n kube-system delete po -l 'compnotallow=kube-apiserver'
kubectl -n kube-system delete po -l 'compnotallow=kube-controller-manager'
kubectl -n kube-system delete po -l 'compnotallow=kube-scheduler'
圖片
通過執(zhí)行這些命令,集群中的證書將會更新,并且相關(guān)的組件會自動重啟,應(yīng)用新證書。
5.6 證書檢查
執(zhí)行以下命令檢查證書狀態(tài):
Bash
kubeadm certs check-expiration
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Feb 12, 2035 05:48 UTC 9y ca no
apiserver Feb 12, 2035 05:48 UTC 9y ca no
apiserver-etcd-client Feb 12, 2035 05:48 UTC 9y etcd-ca no
apiserver-kubelet-client Feb 12, 2035 05:48 UTC 9y ca no
controller-manager.conf Feb 12, 2035 05:48 UTC 9y ca no
etcd-healthcheck-client Feb 12, 2035 05:48 UTC 9y etcd-ca no
etcd-peer Feb 12, 2035 05:48 UTC 9y etcd-ca no
etcd-server Feb 12, 2035 05:48 UTC 9y etcd-ca no
front-proxy-client Feb 12, 2035 05:48 UTC 9y front-proxy-ca no
scheduler.conf Feb 12, 2035 05:48 UTC 9y ca no
圖片
可以看到,現(xiàn)在所有證書過期時間均已變成10年。
5、總 結(jié)
本文詳細(xì)介紹了如何自定義基于kubeadm創(chuàng)建的Kubernetes集群證書的過期時間,并對證書進(jìn)行定期檢查和替換。通過重新編譯kubeadm源碼,我們能夠靈活地設(shè)置證書的有效期限,從而為測試環(huán)境和生產(chǎn)環(huán)境提供便利。
自定義證書過期時間不僅簡化了運(yùn)維管理,還減少了因證書過期導(dǎo)致的潛在風(fēng)險。此外,通過本文的步驟,您可以確保集群的安全性和穩(wěn)定性,同時避免了頻繁更新證書帶來的額外工作負(fù)擔(dān)。
通過執(zhí)行上述步驟,您可以有效地更新集群中的證書,并確保相關(guān)組件能夠自動重啟并應(yīng)用新證書。這種方法不僅提高了運(yùn)維效率,還增強(qiáng)了集群的整體安全性。