通过群集连接,可在任何位置安全地连接到已启用 Azure Arc 的 Kubernetes 群集,而无需在防火墙上启用任何入站端口。
访问已启用 Azure Arc 的 Kubernetes 群集的 apiserver
可实现以下方案:
- 交互式调试和故障排除。
- Azure 服务对自定义位置及其上创建的其他资源的群集访问权限。
在开始之前,请查看群集连接功能的概念性概述。
具有活动订阅的 Azure 帐户。 创建试用版订阅。
一个现有的已启用 Azure Arc 的 Kubernetes 连接的群集。
为已启用 Arc 的 Kubernetes 启用网络要求,包括群集连接所需的所有终结点。
安装最新版本的
connectedk8s
Azure CLI 扩展:az extension add --name connectedk8s
如果已安装
connectedk8s
扩展,请将扩展更新到最新版本:az extension update --name connectedk8s
替换占位符并运行以下命令,设置本文档中使用的环境变量:
CLUSTER_NAME=<cluster-name> RESOURCE_GROUP=<resource-group-name> ARM_ID_CLUSTER=$(az connectedk8s show -n $CLUSTER_NAME -g $RESOURCE_GROUP --query id -o tsv)
在已启用 Arc 的现有群集上,使用 Microsoft Entra 身份验证或服务帐户令牌创建 ClusterRoleBinding。
获取与 Microsoft Entra 实体关联的
objectId
。 对于单个用户帐户,获取与 Microsoft Entra 实体关联的用户主体名称 (UPN)。对于 Microsoft Entra 组帐户:
AAD_ENTITY_ID=$(az ad signed-in-user show --query id -o tsv)
对于 Microsoft Entra 单用户帐户:
AAD_ENTITY_ID=$(az ad signed-in-user show --query userPrincipalName -o tsv)
对于 Microsoft Entra 应用程序:
AAD_ENTITY_ID=$(az ad sp show --id <id> --query id -o tsv)
向实体授予适当权限。
如果使用 Kubernetes 本机 ClusterRoleBinding 或 RoleBinding 对群集进行授权检查,并且
kubeconfig
文件指向群集的apiserver
来进行直接访问,你可以创建一个映射到需要访问此群集的 Microsoft Entra 实体。 例如:kubectl create clusterrolebinding demo-user-binding --clusterrole cluster-admin --user=$AAD_ENTITY_ID
如果使用 Azure RBAC 对群集进行授权检查,则可以创建映射到 Microsoft Entra 实体的适用 Azure 角色分配 。 例如:
az role assignment create --role "Azure Arc Kubernetes Viewer" --assignee $AAD_ENTITY_ID --scope $ARM_ID_CLUSTER az role assignment create --role "Azure Arc Enabled Kubernetes Cluster User Role" --assignee $AAD_ENTITY_ID --scope $ARM_ID_CLUSTER
在
kubeconfig
文件指向 Kubernetes 群集的apiserver
的情况下,运行以下命令以创建服务帐户。 此示例将在默认命名空间中创建服务帐户,但你可以用任何其他命名空间来替换default
。kubectl create serviceaccount demo-user -n default
创建 ClusterRoleBinding 以 授予此服务帐户对群集的适当权限。 如果在第一个命令中使用了其他命名空间,请在此处用其替换
default
。kubectl create clusterrolebinding demo-user-binding --clusterrole cluster-admin --serviceaccount default:demo-user
创建服务帐户令牌:
kubectl apply -f - <<EOF apiVersion: v1 kind: Secret metadata: name: demo-user-secret annotations: kubernetes.io/service-account.name: demo-user type: kubernetes.io/service-account-token EOF
TOKEN=$(kubectl get secret demo-user-secret -o jsonpath='{$.data.token}' | base64 -d | sed 's/$/\n/g')
获取要输出到控制台的令牌
echo $TOKEN
现在可从其他客户端访问群集。 在另一台客户端设备上运行以下步骤。
使用 Microsoft Entra 身份验证或服务帐户令牌身份验证进行登录。
根据所使用的身份验证选项,从任何位置(即使是在环绕群集的防火墙外)获取与群集通信所需的群集连接
kubeconfig
。对于 Microsoft Entra 身份验证:
az connectedk8s proxy -n $CLUSTER_NAME -g $RESOURCE_GROUP
对于服务帐户令牌身份验证:
az connectedk8s proxy -n $CLUSTER_NAME -g $RESOURCE_GROUP --token $TOKEN
注意
此命令将打开代理并阻止当前 shell。
在不同的 shell 会话中,使用
kubectl
将请求发送到群集:kubectl get pods -A
现在应会看到来自群集的响应,其中包含 default
命名空间下所有 Pod 的列表。
对 Kubernetes 群集发出请求时,如果使用的 Microsoft Entra 服务主体是 200 多个组的成员,则可能会看到以下错误:
Overage claim (users with more than 200 group membership) for SPN is currently not supported. For troubleshooting, please refer to aka.ms/overageclaimtroubleshoot
这是一个已知限制。 若要避免此错误,请执行以下操作:
创建一个不太可能是超过 200 个组的成员的服务主体。
- 在群集上设置 Microsoft Entra RBAC。
- 部署和管理群集扩展。
- 通过遵循已启用 Azure Arc 的 Kubernetes 安全手册中的指导,以其他方式帮助保护群集。