在 AKS 混合式中安全地與憑證通訊

適用于:Azure Stack HCI 上的 AKS、Windows Server 上的 AKS

憑證是用來在叢集內元件之間建立安全通訊。 AKS 混合式提供零觸控、現成的布建,以及內建 Kubernetes 元件的憑證管理。 在本文中,您將瞭解如何在 AKS 混合式中布建和管理憑證。

憑證和 CA

AKS 混合式會產生並使用下列憑證授權單位單位 (CA) 和憑證。

叢集 CA

  • API 伺服器具有叢集 CA,可簽署憑證以進行從 API 伺服器到 kubelet 的單向通訊。
  • 每個也會 kubelet 建立憑證簽署要求, (CSR) ,由叢集 CA 簽署,以便從 kubelet 到 API 伺服器進行通訊。
  • Etcd 金鑰值存放區具有叢集 CA 簽署的憑證,可進行從 etcd 至 API 伺服器的通訊。

etcd CA

  • Etcd 金鑰值存放區具有 etcd CA,可簽署憑證來驗證和授權叢集中 etcd 複本之間的資料複寫。

前端 Proxy CA

  • 前端 Proxy CA 可保護 API 伺服器與擴充功能 API 伺服器之間的通訊。

憑證佈建

kubelet 憑證布建是使用 TLS 啟動載入來完成。 針對任何其他憑證,請使用 YAML 型的金鑰和憑證建立。

  • 憑證會儲存在 /etc/kubernetes/pki中。
  • 這些金鑰是 RSA 4096、EcdsaCurve:P384

注意

根憑證的有效期為 10 年。 所有其他非根憑證都是短期的,且有效期為四天。

憑證更新和管理

非根憑證會自動更新。 除了下列憑證之外,Kubernetes 的所有控制平面憑證都會受到管理:

  • Kubelet 伺服器憑證
  • Kubeconfig 用戶端憑證

作為安全性最佳做法,您應該使用 Active Directory 單一登入 進行使用者驗證。

憑證撤銷

憑證撤銷應該很少見,而且應該在憑證更新時完成。

取得想要撤銷的憑證序號後,請使用 Kubernetes 自訂資源來定義和保存撤銷資訊。 每個撤銷物件都可以包含一或多個撤銷項目。

若要執行撤銷,請使用下列其中一項:

  • 序號
  • Group
  • DNS 名稱
  • IP 位址

您可以指定 notBefore 時間,以便僅撤銷在特定時間戳記之前發出的憑證。 如果未指定 notBefore 時間,則所有符合撤銷的現有和未來憑證都會遭到撤銷。

注意

目前無法使用伺服器憑證的 kubelet 撤銷。

如果您在執行撤銷時使用序號,您可以使用 Repair-AksHciClusterCerts 以下所述的 PowerShell 命令,讓您的叢集進入運作狀態。 如果您使用稍早所列的任何其他欄位,請務必指定 notBefore 時間,讓您可以使用 命令復原叢集 Repair-AksHciClusterCerts

apiVersion: certificates.microsoft.com/v1 
kind: RenewRevocation 
metadata: 
  name: my-renew-revocation 
  namespace: kube-system 
spec: 
  description: My list of renew revocations 
  revocations: 
  - description: Revoked certificates by serial number 
    kind: serialnumber 
    notBefore: "2020-04-17T17:22:05Z" 
    serialNumber: 77fdf4b1033b387aaace6ce1c18710c2 
  - description: Revoked certificates by group 
    group: system:nodes 
    kind: Group 
  - description: Revoked certificates by DNS 
    dns: kubernetes.default.svc. 
    kind: DNS 
  - description: Revoked certificates by DNS Suffix 
    dns: .cluster.local 
    kind: DNS 
  - description: Revoked certificates by IP 
    ip: 170.63.128.124 
    kind: IP 

疑難排解和維護

請參閱下列指令碼和文件以進行記錄和監視:

更新背景工作節點的憑證

若為背景工作角色節點,certificate-renewal-worker Pod 會記錄失敗的憑證更新。 如果憑證更新在背景工作節點上持續失敗,且憑證過期,則會移除節點,並在其位置建立新的背景工作節點。

以下範例說明如何使用前置詞 certificate-renewal-worker 來查看 Pod 的記錄:

kubectl.exe --kubeconfig .\testcluster-kubeconfig -n=kube-system get pods 
NAME                                           READY   STATUS             RESTARTS   AGE 
… 
certificate-renewal-worker-6f68k               1/1     Running            0          6d 

若要從憑證更新 Pod 取得記錄:

kubectl.exe --kubeconfig .\testcluster-kubeconfig -n=kube-system logs certificate-renewal-worker-6f68k

更新控制平面節點的憑證

針對控制平面節點,憑證更新失敗會由 certificate-renewal-controller Pod 記錄。 如果憑證在控制平面節點上過期,則節點最終可能會由其他節點無法連線。 如果所有控制平面節點進入此狀態,叢集將會因為 TLS 失敗而變得無法運作。 若要確認叢集是否已進入此狀態,請嘗試使用 kubectl 存取叢集,然後確認連線是否失敗,並顯示與過期 x509 憑證相關的錯誤訊息。

以下範例說明如何使用前置詞 certificate-renewal-controller 來查看 Pod 的記錄:

kubectl.exe --kubeconfig .\testcluster-kubeconfig -n=kube-system get pods 
NAME                                           READY   STATUS             RESTARTS   AGE 
… 
certificate-renewal-controller-2cdmz               1/1     Running            0          6d 

若要從憑證更新 Pod 取得記錄:

kubectl.exe --kubeconfig .\testcluster-kubeconfig -n=kube-system logs certificate-renewal-controller-2cdmz

控制平面節點無法像背景工作節點一樣重新建立,但您可以使用 Repair-AksHciClusterCerts 模組來協助修正與過期憑證相關的錯誤。 如果叢集因為憑證過期而開始失敗,請執行下列命令:

Repair-AksHciClusterCerts -Name mytargetcluster 

如果無法透過 kubectl 存取叢集,您可以在 /var/log/pods 資料夾中找到記錄。

後續步驟

在本操作指南中,您已了解如何佈建和管理憑證。 接著,您可以: