新聞中心
手動(dòng)輪換 CA 證書
本頁展示如何手動(dòng)輪換證書機(jī)構(gòu)(CA)證書。

創(chuàng)新互聯(lián)是專業(yè)的天涯網(wǎng)站建設(shè)公司,天涯接單;提供做網(wǎng)站、網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行天涯網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
在開始之前
你必須擁有一個(gè) Kubernetes 的集群,同時(shí)你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個(gè)節(jié)點(diǎn)的集群上運(yùn)行本教程,且這些節(jié)點(diǎn)不作為控制平面主機(jī)。 如果你還沒有集群,你可以通過 Minikube 構(gòu)建一個(gè)你自己的集群,或者你可以使用下面任意一個(gè) Kubernetes 工具構(gòu)建:
- Katacoda
- 玩轉(zhuǎn) Kubernetes
您的 Kubernetes 服務(wù)器版本必須不低于版本 v1.13. 要獲知版本信息,請(qǐng)輸入 ?kubectl version?。
手動(dòng)輪換 CA 證書
注意:
確保備份你的證書目錄、配置文件以及其他必要文件。
這里的方法假定 Kubernetes 的控制面通過運(yùn)行多個(gè) API 服務(wù)器以高可用配置模式運(yùn)行。 另一假定是 API 服務(wù)器可體面地終止,因而客戶端可以徹底地與一個(gè) API 服務(wù)器斷開 連接并連接到另一個(gè) API 服務(wù)器。
如果集群中只有一個(gè) API 服務(wù)器,則在 API 服務(wù)器重啟期間會(huì)經(jīng)歷服務(wù)中斷期。
- 將新的 CA 證書和私鑰(例如:?
ca.crt?、?ca.key?、?front-proxy-ca.crt? 和 ?front-proxy-client.key?)分發(fā)到所有控制面節(jié)點(diǎn),放在其 Kubernetes 證書目錄下。 - 更新 kube-controller-manager 的 ?
--root-ca-file? 標(biāo)志,使之同時(shí)包含老的和新的 CA,之后重啟組件。 - 更新所有服務(wù)賬號(hào)令牌,使之同時(shí)包含老的和新的 CA 證書。
- 重啟所有使用集群內(nèi)配置的 Pods(例如:?
kube-proxy?、?coredns?等),以便這些 Pod 能夠使用 來自 ServiceAccount Secret 中的、已更新的證書機(jī)構(gòu)數(shù)據(jù)。 - 確保 ?
coredns?、?kube-proxy? 和其他使用集群內(nèi)配置的 Pod 都正按預(yù)期方式工作。 - 將老的和新的 CA 都追加到 ?
kube-apiserver? 配置的 ?--client-ca-file? 和 ?--kubelet-certificate-authority? 標(biāo)志所指的文件。 - 將老的和新的 CA 都追加到 ?
kube-scheduler? 配置的 ?--client-ca-file? 標(biāo)志所指的文件。 - 通過替換 ?
client-certificate-data? 和 ?client-key-data? 中的內(nèi)容,更新用戶賬號(hào)的證書。 - 遵循下列步驟執(zhí)行滾動(dòng)更新
- 重新啟動(dòng)所有其他 被聚合的 API 服務(wù)器 或者 Webhook 處理程序,使之信任新的 CA 證書。
- 在所有節(jié)點(diǎn)上更新 kubelet 配置中的 clientCAFile 所指文件以及 kubelet.conf 中的 certificate-authority-data 并重啟 kubelet 以同時(shí)使用老的和新的 CA 證書。
- 使用用新的 CA 簽名的證書 (apiserver.crt、apiserver-kubelet-client.crt 和 front-proxy-client.crt) 來重啟 API 服務(wù)器。 你可以使用現(xiàn)有的私鑰,也可以使用新的私鑰。 如果你改變了私鑰,則要將更新的私鑰也放到 Kubernetes 證書目錄下。
- 重啟調(diào)度器以使用新的 CA 證書。
- 確??刂泼娼M件的日志中沒有 TLS 相關(guān)的錯(cuò)誤信息。
- 為 Daemonset 和 Deployment 添加注解,從而觸發(fā)較安全的滾動(dòng)更新,替換 Pod。
- 如果你的集群使用啟動(dòng)引導(dǎo)令牌來添加節(jié)點(diǎn),則需要更新 ?
kube-public? 名字空間下的 ConfigMap ?cluster-info?,使之包含新的 CA 證書。 - 驗(yàn)證集群的功能正常
- 驗(yàn)證控制面組件的日志,以及 kubelet 和 kube-proxy 的日志,確保其中沒有 拋出 TLS 錯(cuò)誤。
- 驗(yàn)證被聚合的 API 服務(wù)器的日志,以及所有使用集群內(nèi)配置的 Pod 的日志。
- 完成集群功能的檢查之后:
- 更新所有的服務(wù)賬號(hào)令牌,使之僅包含新的 CA 證書。
- 使用集群內(nèi) kubeconfig 的 Pod 最終也需要被重啟,以獲得新的服務(wù)賬號(hào) Secret 數(shù)據(jù),進(jìn)而不再信任老的 CA 證書。
- 從 kubeconfig 文件和 --client-ca-file 以及 --root-ca-file 標(biāo)志所指向的文件 中去除老的 CA 數(shù)據(jù),之后重啟控制面組件。
- 重啟 kubelet,移除 clientCAFile 標(biāo)志所指向的文件以及 kubelet kubeconfig 文件中 的老的 CA 數(shù)據(jù)。
自此刻起,所創(chuàng)建的所有服務(wù)賬號(hào)都會(huì)獲得同時(shí)包含老的 CA 和新的 CA 的 Secret。
說明: kube-controller-manager 標(biāo)志 ?
--client-ca-file? 和 ?--cluster-signing-cert-file? 所引用的文件 不能是 CA 證書包。如果這些標(biāo)志和 ?--root-ca-file? 指向同一個(gè) ?ca.crt? 包文件(包含老的和新的 CA 證書), 你將會(huì)收到出錯(cuò)信息。 要解決這個(gè)問題,可以將新的 CA 證書復(fù)制到單獨(dú)的文件中,并將 ?--client-ca-file? 和 ?--cluster-signing-cert-file? 標(biāo)志指向該副本。一旦 ?ca.crt? 不再是證書包文件,就可以恢復(fù)有問題的標(biāo)志指向 ?ca.crt? 并刪除該副本。
如果在 API 服務(wù)器使用新的 CA 之前啟動(dòng)了新的 Pod,這些 Pod 也會(huì)獲得此更新并且同時(shí)信任老的和新的 CA 證書。
base64_encoded_ca="$(base64 -w0 )"
for namespace in $(kubectl get ns --no-headers | awk '{print $1}'); do
for token in $(kubectl get secrets --namespace "$namespace" --field-selector type=kubernetes.io/service-account-token -o name); do
kubectl get $token --namespace "$namespace" -o yaml | \
/bin/sed "s/\(ca.crt:\).*/\1 ${base64_encoded_ca}/" | \
kubectl apply -f -
done
done 另外,還要更新 kubeconfig 文件中的 ?certificate-authority-data? 節(jié),使之包含 Base64 編碼的老的和新的證書機(jī)構(gòu)數(shù)據(jù)。
如果你的 kubelet 并未使用客戶端證書輪換,則在所有節(jié)點(diǎn)上更新 kubelet.conf 中 client-certificate-data 和 client-key-data 以及 kubelet 客戶端證書文件(通常位于 /var/lib/kubelet/pki 目錄下)
由于 Pod 既信任老的 CA 也信任新的 CA,Pod 中的客戶端會(huì)經(jīng)歷短暫的連接斷開狀態(tài), 之后再連接到使用新的 CA 所簽名的證書的新的 API 服務(wù)器。
說明: 要使用 openssl 命令行為集群生成新的證書和私鑰,可參閱 證書(openssl)。 你也可以使用cfssl.
示例:
for namespace in $(kubectl get namespace -o jsonpath='{.items[*].metadata.name}'); do
for name in $(kubectl get deployments -n $namespace -o jsonpath='{.items[*].metadata.name}'); do
kubectl patch deployment -n ${namespace} ${name} -p '{"spec":{"template":{"metadata":{"annotations":{"ca-rotation": "1"}}}}}';
done
for name in $(kubectl get daemonset -n $namespace -o jsonpath='{.items[*].metadata.name}'); do
kubectl patch daemonset -n ${namespace} ${name} -p '{"spec":{"template":{"metadata":{"annotations":{"ca-rotation": "1"}}}}}';
done
donebase64_encoded_ca="$(base64 -w0 /etc/kubernetes/pki/ca.crt)"
kubectl get cm/cluster-info --namespace kube-public -o yaml | \
/bin/sed "s/\(certificate-authority-data:\).*/\1 ${base64_encoded_ca}/" | \
kubectl apply -f -分享題目:創(chuàng)新互聯(lián)kubernetes教程:Kubernetes手動(dòng)輪換CA證書
瀏覽路徑:http://www.dlmjj.cn/article/dpeogig.html


咨詢
建站咨詢
