掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
本頁展示如何手動輪換證書機構(gòu)(CA)證書。

創(chuàng)新互聯(lián)是專業(yè)的天涯網(wǎng)站建設(shè)公司,天涯接單;提供做網(wǎng)站、網(wǎng)站制作,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行天涯網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
你必須擁有一個 Kubernetes 的集群,同時你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個節(jié)點的集群上運行本教程,且這些節(jié)點不作為控制平面主機。 如果你還沒有集群,你可以通過 Minikube 構(gòu)建一個你自己的集群,或者你可以使用下面任意一個 Kubernetes 工具構(gòu)建:
您的 Kubernetes 服務(wù)器版本必須不低于版本 v1.13. 要獲知版本信息,請輸入 ?kubectl version?。
注意:
確保備份你的證書目錄、配置文件以及其他必要文件。
這里的方法假定 Kubernetes 的控制面通過運行多個 API 服務(wù)器以高可用配置模式運行。 另一假定是 API 服務(wù)器可體面地終止,因而客戶端可以徹底地與一個 API 服務(wù)器斷開 連接并連接到另一個 API 服務(wù)器。
如果集群中只有一個 API 服務(wù)器,則在 API 服務(wù)器重啟期間會經(jīng)歷服務(wù)中斷期。
ca.crt?、?ca.key?、?front-proxy-ca.crt? 和 ?front-proxy-client.key?)分發(fā)到所有控制面節(jié)點,放在其 Kubernetes 證書目錄下。--root-ca-file? 標(biāo)志,使之同時包含老的和新的 CA,之后重啟組件。自此刻起,所創(chuàng)建的所有服務(wù)賬號都會獲得同時包含老的 CA 和新的 CA 的 Secret。
說明: kube-controller-manager 標(biāo)志 ?
--client-ca-file? 和 ?--cluster-signing-cert-file? 所引用的文件 不能是 CA 證書包。如果這些標(biāo)志和 ?--root-ca-file? 指向同一個 ?ca.crt? 包文件(包含老的和新的 CA 證書), 你將會收到出錯信息。 要解決這個問題,可以將新的 CA 證書復(fù)制到單獨的文件中,并將 ?--client-ca-file? 和 ?--cluster-signing-cert-file? 標(biāo)志指向該副本。一旦 ?ca.crt? 不再是證書包文件,就可以恢復(fù)有問題的標(biāo)志指向 ?ca.crt? 并刪除該副本。
如果在 API 服務(wù)器使用新的 CA 之前啟動了新的 Pod,這些 Pod 也會獲得此更新并且同時信任老的和新的 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 kube-proxy?、?coredns ?等),以便這些 Pod 能夠使用 來自 ServiceAccount Secret 中的、已更新的證書機構(gòu)數(shù)據(jù)。coredns?、?kube-proxy? 和其他使用集群內(nèi)配置的 Pod 都正按預(yù)期方式工作。kube-apiserver? 配置的 ?--client-ca-file? 和 ?--kubelet-certificate-authority? 標(biāo)志所指的文件。kube-scheduler? 配置的 ?--client-ca-file? 標(biāo)志所指的文件。client-certificate-data? 和 ?client-key-data? 中的內(nèi)容,更新用戶賬號的證書。另外,還要更新 kubeconfig 文件中的 ?certificate-authority-data? 節(jié),使之包含 Base64 編碼的老的和新的證書機構(gòu)數(shù)據(jù)。
如果你的 kubelet 并未使用客戶端證書輪換,則在所有節(jié)點上更新 kubelet.conf 中 client-certificate-data 和 client-key-data 以及 kubelet 客戶端證書文件(通常位于 /var/lib/kubelet/pki 目錄下)
由于 Pod 既信任老的 CA 也信任新的 CA,Pod 中的客戶端會經(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
donekube-public? 名字空間下的 ConfigMap ?cluster-info?,使之包含新的 CA 證書。base64_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 -
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流