設定群組受管理的服務帳戶 (gMSA) 適用於具有 Azure Stack HCI 和 Windows Server 上 Azure Kubernetes Service 的 Windows 容器

適用於:Azure Stack HCI 22H2 上的 AKS、Windows Server 上的 AKS

若要使用 AD 驗證,您可以設定 Windows 容器的群組受管理的服務帳戶 (gMSA),來執行具有未加入網域主機的容器。 群組受管理的服務帳戶是一種於 Windows Server 2012 中引進的特殊類型服務帳戶,其設計目的是讓多部電腦在無須知道密碼的情況下共用身分識別。 Windows 容器無法加入網域,但是許多在 Windows 容器中執行的 Windows 應用程式仍需要 AD 驗證。

注意

若要了解 Kubernetes 社群如何支援搭配 Windows 容器使用 gMSA,請參閱設定 gMSA

具有未加入網域主機容器的 gMSA 架構

如果容器具有未加入網域的主機,gMSA 會使用可移植的使用者身分識別,而不是主機身分識別來取得 gMSA 認證。 因此,不再需要手動將 Windows 背景工作節點角色加入網域。 使用者身分識別會儲存為 Kubernetes 中的密碼。 下圖顯示使用未加入網域的主機為容器設定 gMSA 的流程:

群組受控服務帳戶第二版的圖表

具有未加入網域主機的容器 gMSA,可讓您彈性地以 gMSA 建立容器,無須將主機節點加入網域。 從 Windows Server 2019 開始支援 ccg.exe,可讓外掛程式機制從 Active Directory 中取出 gMSA 認證。 您可以使用該身分識別來啟動容器。 如需 ccg.exe 的詳細資訊,請參閱 ICcgDomainAuthCredentials 介面

未加入網域和已加入網域主機的容器 gMSA 比較

最初推出 gMSA 時,容器主機必須加入網域,這造成使用者需手動將 Windows 背景工作節點加入網域的額外負荷。 我們已針對具有未加入網域主機的容器 gMSA 解決這項限制,因此使用者現在可以使用具有未加入網域主機的 gMSA。 gMSA 的其他改善包括下列各項:

  • 不需要手動將 Windows 背景工作節點加入網域,因為手動加入會造成大量的額外負荷。 針對縮放比例的案例,這將會簡化流程。
  • 在輪流更新案例中,使用者再也無須將節點重新加入網域。
  • 更輕鬆地管理背景工作節點電腦帳戶,以擷取 gMSA 服務帳戶密碼。
  • 使用 Kubernetes 設定 gMSA 的端對端流程較不復雜。

開始之前

若要使用群組受管理的服務帳戶來執行 Windows 容器,您需要下列各項:

  • 至少有一個網域控制站是執行 Windows Server 2012 或更新版本的 Active Directory 網域。 使用 gMSA 沒有樹系或網域功能層級的需求,但 gMSA 密碼只能由執行 Windows Server 2012 或更新版本的網域控制站散發。 如需詳細資訊,請參閱 gMSA 的 Active Directory 需求
  • 建立 gMSA 帳戶的權限。 若要建立 gMSA 帳戶,您必須是網域管理員,或使用已獲得建立 msDS-GroupManagedServiceAccount 物件使用權限的帳戶。
  • 存取網際網路以下載 CredentialSpec PowerShell 模組。 如果您是在中斷連線的環境中工作,您可以在具有網際網路存取權的電腦上儲存模組,然後將其複製到您的開發機器或容器主機。
  • 為確保 gMSA 和 AD 驗證可正常運作,請確定 Azure Stack HCI 和 Windows Server 叢集節點已設定為與網域控制站或其他時間來源的時間同步。 您也應該確定 Hyper-V 已設定為與任何虛擬機器的時間同步。

準備網域控制站中的 gMSA

請依照下列步驟在網域控制站中準備 gMSA:

  1. 在網域控制站中,準備 Active Directory建立 gMSA 帳戶

  2. 建立網域使用者帳戶。 此使用者帳戶 / 密碼將會儲存為 Kubernetes 密碼,並用於取出 gMSA 密碼。

  3. 若要建立 GMSA 帳戶並授與權限,以讀取在步驟 2 中建立的 gMSA 帳戶密碼,請執行下列 New-ADServiceAccount PowerShell 命令:

     New-ADServiceAccount -Name "<gmsa account name>" -DnsHostName "<gmsa account name>.<domain name>.com" -ServicePrincipalNames "host/<gmsa account name>", "host/<gmsa account name>.<domain name>.com" -PrincipalsAllowedToRetrieveManagedPassword <username you created earlier> 
    

    針對 -PrincipalsAllowedToRetrieveManagedPassword,請指定您稍早建立的網域使用者名稱,如下列範例所示:

    New-ADServiceAccount -Name "WebApp01" -DnsHostName "WebApp01.akshcitest.com" -ServicePrincipalNames "host/WebApp01", "host/WebApp01.akshcitest.com" -PrincipalsAllowedToRetrieveManagedPassword "testgmsa"
    

準備 gMSA 認證規格 JSON 檔案

若要準備 gMSA 認證規格 JSON 檔案,請依照建立認證規格的步驟執行。

針對叢集中的 Windows pod 和容器設定 gMSA

Kubernetes 社群已支援針對 gMSA 的 Windows 背景工作節點加入網域。 即使您不需要將 Windows 背景工作節點加入 Azure Stack HCI 和 Windows Server 上 AKS 中的網域,也有其他需要設定的步驟。 這些步驟包括安裝 Webhook、自訂資源定義 (CRD) 和認證規格,以及啟用角色型存取控制 (RBAC 角色)。 下列步驟會使用建立的 PowerShell 命令,以協助簡化設定流程。

在完成下列步驟之前,請確定已安裝 AksHci PowerShell 模組,且 kubectl 可以連線到您的叢集。

  1. 若要安裝 Webhook,請執行下列 Install-AksHciGmsaWebhook PowerShell 命令:

    Install-AksHciGMSAWebhook -Name <cluster name>
    

    若要驗證 Webhook pod 是否成功執行,請執行下列命令:

    kubectl get pods -n kube-system | findstr gmsa
    

    您應該會看到一個正在執行,具有 gmsa-webhook 首碼的 pod。

  2. 建立儲存 Active Directory 使用者認證的密碼物件。 完成以下的設定資料,並將設定儲存在名為 secret.yaml 的檔案中。

    apiVersion: v1
    kind: Secret
    metadata:
       name: <secret-name>
       namespace: <secret under namespace other than the default>
    type: Opaque
    stringData:
       domain: <FQDN of the domain, for example: akshcitest.com>
       username: <domain user who can retrieve the gMSA password>
       password: <password>
    

    接著,執行下列命令來建立密碼物件:

    kubectl apply -f secret.yaml
    

    注意

    如果您在預設值以外的命名空間下建立密碼,請記得將部署的命名空間設定為相同的命名空間。

  3. 使用 Add-AksHciGMSACredentialSpec PowerShell Cmdlet 來建立 gMSA CRD、啟用角色型存取控制 (RBAC) ,然後將角色指派給服務帳戶,以使用特定的 gMSA 認證規格檔案。 此 Kubernetes 文章會在針對 Windows pod 和容器設定的 gMSA 中詳細說明這些步驟。

    使用 JSON 認證規格作為下列 PowerShell 命令的輸入 (參數必須使用星號 *):

    Add-AksHciGMSACredentialSpec -Name <cluster name>*  
      -credSpecFilePath <path to JSON credspec>* 
      -credSpecName <name for credspec as the k8s GMSACredentialSpec object>* 
      -secretName <name of secret>* 
      -secretNamespace <namespace of secret>  
      -serviceAccount <name of service account to bind to clusterrole>  
      -clusterRoleName <name of clusterrole to use the credspec>*  
      -overwrite 
    

    若要檢視範例,請參閱下列程序代碼:

    Add-AksHciGMSACredentialSpec -Name mynewcluster 
      -credSpecFilePath .\credspectest.json 
      -credSpecName credspec-mynewcluster 
      -secretName mysecret 
      -clusterRoleName clusterrole-mynewcluster
    

部署應用程式

使用下列範例設定建立部署 YAML 檔。 必要的項目包括 serviceAccountNamegmsaCredentialSpecNamevolumeMountsdnsconfig

  1. 加入服務帳戶:

    serviceAccountName: default
       securityContext: 
         windowsOptions: 
           gmsaCredentialSpecName:
    
  2. 新增認證規格物件:

    securityContext: 
         windowsOptions: 
           gmsaCredentialSpecName: <cred spec name>
    
  3. 裝載部署的密碼:

    volumeMounts:
         - name: <volume name>
           mountPath: <vmount path>
           readOnly: true
       volumes:
         - name: <volume name>
           secret:
             secretName: <secret name>
             items:
               - key: username
                 path: my-group/my-username
    
  4. 將網域控制站的 IP 位址和網域名稱新增至 dnsConfig 底下:

    dnsConfig: 
         nameservers:
           - <IP address for domain controller>
         searches: 
           - <domain>
    

確認容器正在使用 gMSA

在您部署容器之後,請使用下列步驟來確認其是否正常運作:

  1. 執行下列命令,以取得您部署的容器識別碼:

    kubectl get pods
    
  2. 開啟 PowerShell 並執行下列命令:

    kubectl exec -it <container id> powershell
    
  3. 一旦在容器中,請執行下列動作:

    Nltest /parentdomain 
    Nltest /sc_verify:<domain> 
    
    Connection Status = 0 0x0 NERR_Success The command completed successfully. 
    

    此輸出顯示電腦已由網域控制站驗證,且用戶端電腦與網域控制站之間存在安全通道。

  4. 檢查容器是否可取得有效的 Kerberos 票證授權票證 (TGT)。

    klist get krbtgt
    
    A ticket to krbtgt has been retrieved successfully
    

清除叢集中的 gMSA 設定

如果您需要清除 gMSA 設定,請使用下列解除安裝步驟。

解除安裝認證規格

若要解除安裝,請執行下列 Remove-AksHcigmsaCredentialSpec PowerShell 命令:

Remove-AksHciGMSACredentialSpec -Name <cluster name> -credSpecName <cred spec object name> -clusterRoleName <clusterrole object name> -serviceAccount <serviceaccount object name> -secretNamespace <namespace of the secret object>

解除安裝 Webhook

若要解除安裝 Webhook,請執行下列 Uninstall-AksHciGMSAWebhook PowerShell 命令:

Uninstall-AksHciGMSAWebhook -Name <cluster name>

下一步