使用 Azure 本機和 Windows Server 上的 Azure Kubernetes Service 設定 Windows 容器的群組受控服務帳戶 (gMSA)
適用於:Azure Stack HCI 22H2 上的 AKS、Windows Server 上的 AKS
若要使用 AD 驗證,您可以設定群組受控服務帳戶 (gMSA),讓 Windows 容器以未加入網域的主機執行。 群組 受管理的服務帳戶是 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 的樹系或網域功能等級需求,但只有執行 Windows Server 2012 或更新版本的域控制器可以散發 gMSA 密碼。 如需詳細資訊,請參閱 gMSA 的 Active Directory 需求。
- 建立 gMSA 帳戶的權限。 若要建立 gMSA 帳戶,您必須是網域系統管理員,或使用有權建立 msDS-GroupManagedServiceAccount 對象的帳戶。
- 存取因特網以下載 CredentialSpec PowerShell 模組。 如果您是在中斷連線的環境中工作,您可以在具有網際網路存取權的電腦上儲存模組,然後將其複製到您的開發機器或容器主機。
- 若要確保 gMSA 和 AD 驗證可運作,請確定 Azure 本機和 Windows Server 叢集節點已設定為將其時間與域控制器或其他時間來源同步處理。 您也應該確定 Hyper-V 已設定為將時間同步至任何虛擬機。
在域控制器中準備 gMSA
請遵循下列步驟來準備域控制器中的 gMSA:
在域控制器中, 準備 Active Directory 並 建立 gMSA 帳戶。
建立網域用戶帳戶。 此用戶帳戶/密碼認證會儲存為 Kubernetes 秘密,並用來擷取 gMSA 密碼。
若要建立 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 背景工作節點。 雖然您不需要在 Azure 本機和 Windows Server 上的 AKS 中加入 Windows 背景工作角色節點,但還有其他必要的設定步驟。 這些步驟包括安裝 Webhook、自訂資源定義 (CRD) 和認證規格,以及啟用角色型訪問控制 (RBAC 角色)。 下列步驟使用建置的PowerShell命令來協助簡化設定程式。
完成下列步驟之前,請確定 已安裝 AksHci PowerShell 模組,並可 kubectl
連線到您的叢集。
若要安裝 Webhook,請執行下列 Install-AksHciGmsaWebhook PowerShell 命令:
Install-AksHciGMSAWebhook -Name <cluster name>
若要驗證 Webhook Pod 是否成功執行,請執行下列命令:
kubectl get pods -n kube-system | findstr gmsa
您應該會看到一個 Pod,其中包含 正在執行的 gmsa-webhook 前置詞。
建立儲存 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
注意
如果您在預設值以外的命名空間下建立秘密,請記得將部署的命名空間設定為相同的命名空間。
使用 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 檔案。 必要的專案包括 serviceAccountName
、 gmsaCredentialSpecName
、 volumeMounts
和 dnsconfig
。
新增服務帳戶:
serviceAccountName: default securityContext: windowsOptions: gmsaCredentialSpecName:
新增認證規格物件:
securityContext: windowsOptions: gmsaCredentialSpecName: <cred spec name>
掛接部署的秘密:
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
在 dnsConfig 底下新增網域控制器和網域名稱的 IP 位址:
dnsConfig: nameservers: - <IP address for domain controller> searches: - <domain>
確認容器使用 gMSA
部署容器之後,請使用下列步驟來確認容器是否正常運作:
執行下列命令以取得部署的容器識別碼:
kubectl get pods
開啟 PowerShell 並執行下列命令:
kubectl exec -it <container id> powershell
在容器中之後,請執行下列命令:
Nltest /parentdomain Nltest /sc_verify:<domain>
Connection Status = 0 0x0 NERR_Success The command completed successfully.
此輸出顯示計算機已由域控制器驗證,且用戶端電腦與域控制器之間存在安全通道。
檢查容器是否可以取得有效的 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>