使用憑證保護通訊

憑證是用來在叢集內元件之間建立安全通訊。 Azure Stack HCI 和 Windows Server 上的 Azure Kubernetes Service (AKS) 針對內建 Kubernetes 元件提供了零接觸、現成的憑證佈建和管理功能。

憑證和 CA

Azure Stack HCI 和 Windows Server 上的 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 伺服器之間的通訊。

憑證佈建

Kubelets 的憑證佈建是使用 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 資料夾中找到記錄。

後續步驟

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