在 Azure 本地和 Windows Server 上为具有Azure Kubernetes 服务的 Windows 容器配置组托管服务帐户 (gMSA)
适用于:Azure Stack HCI 22H2 上的 AKS、Windows Server 上的 AKS
若要使用 AD 身份验证,可以为 Windows 容器配置组托管服务帐户 (gMSA) 以在未加入域的主机上运行。 组托管服务帐户是 Windows Server 2012 中引入的一种特殊类型的服务帐户,旨在使多台计算机无需知道密码即可共享一个标识。 Windows 容器无法加入域,但许多 Windows 容器中运行的 Windows 应用程序仍需要 AD 身份验证。
注意
若要了解 Kubernetes 社区如何支持将 gMSA 与 Windows 容器配合使用,请参阅配置 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 容器,需要满足以下先决条件:
- 一个 Active Directory 域,其中至少有一台运行 Windows Server 2012 或更高版本的域控制器。 没有使用 gMSA 的林或域功能级别要求,但只有运行 Windows Server 2012 或更高版本的域控制器才能分发 gMSA 密码。 有关详细信息,请参阅 gMSA 的 Active Directory 要求。
- 创建 gMSA 帐户所需的权限。 若要创建 gMSA 帐户,你必须是域管理员或使用有权创建 msDS-GroupManagedServiceAccount 对象的帐户。
- 访问 Internet 以下载 CredentialSpec PowerShell 模块。 如果在无连接的环境中工作,则可先在能够访问 Internet 的计算机上保存此模块,然后将其复制到开发计算机或容器主机。
- 若要确保 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 凭据规范文件。 这篇关于为 Windows Pod 和容器配置 gMSA 的 Kubernetes 文章详细描述了这些步骤。
将 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
部署容器后,通过以下步骤验证它是否正常工作:
运行以下命令来获取用于部署的容器 ID:
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>