我们已将Azure Kubernetes群集配置为使用Azure Active Directory RBAC。这意味着在使用kubectl时,我们需要首先以AD用户身份进行身份验证(通常通过通过Web浏览器手动完成设备代码身份验证来完成)。我们几乎完全按照MSDN文章Integrate Azure Active Directory with Azure Kubernetes Service进行了配置。
问题在于,Azure DevOp管道中的Kubernetes构建/发布任务现在也需要此身份验证,例如,当我们运行kubectl apply时:
2019-01-02T08:48:21.2070286Z ##[section]Starting: kubectl apply
2019-01-02T08:48:21.2074936Z ==============================================================================
2019-01-02T08:48:21.2075160Z Task : Deploy to Kubernetes
2019-01-02T08:48:21.2075398Z Description : Deploy, configure, update your Kubernetes cluster in Azure Container Service by running kubectl commands.
2019-01-02T08:48:21.2075625Z Version : 1.1.17
2019-01-02T08:48:21.2075792Z Author : Microsoft Corporation
2019-01-02T08:48:21.2076009Z Help : [More Information](https://go.microsoft.com/fwlink/?linkid=851275)
2019-01-02T08:48:21.2076245Z ==============================================================================
2019-01-02T08:48:25.7971481Z Found tool in cache: kubectl 1.7.0 x64
2019-01-02T08:48:25.7980222Z Prepending PATH environment variable with directory: C:\agents\HephaestusForge\_work\_tool\kubectl\1.7.0\x64
2019-01-02T08:48:25.8666111Z [command]C:\agents\HephaestusForge\_work\_tool\kubectl\1.7.0\x64\kubectl.exe apply -f C:\agents\HephaestusForge\_work\r8\a\_MyProject\kubernetes\deploy.yaml -o json
2019-01-02T08:48:26.3518703Z To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code CUYYYYYVV to authenticate.
对此有什么解决方法?是否可以让Azure DevOps将自身身份验证为服务器客户端而不是AD客户端?
答案 0 :(得分:2)
您可以使用不需要交互式登录的管理员配置文件,但不幸的是,它绕过了您可能已设置的任何RBAC控件。
答案 1 :(得分:2)
您可以从 https://github.com/Azure/kubelogin
为您的管道使用 kubelogin这是从登录步骤开始的完整示例,直到在 Kubernetes 中获取命名空间资源。
az login --service-principal -u $APP_ID -p $PASSWORD -t $TENANT
此语句更重要,如果您的 ~/.kube/config
文件中没有现有的集群上下文
az aks get-credentials --resource-group $RG_AKS --name $CLUSTER_NAME --overwrite-existing --file .kubeconfig-${CLUSTER_NAME}
Merged "my-aks-cluster-name" as current context in .kubeconfig-my-aks-cluster-name
使用 kubelogin 而不是 az aks get-credential ....
export KUBECONFIG=$(pwd)/.kubeconfig-${CLUSTER_NAME}
kubelogin convert-kubeconfig -l spn
export AAD_SERVICE_PRINCIPAL_CLIENT_ID=$APP_ID
export AAD_SERVICE_PRINCIPAL_CLIENT_SECRET=$PASSWORD
现在无需设备认证即可运行 kubectl
kubectl get pods -n $NAMESPACE
NAME READY STATUS RESTARTS AGE
myapp-be-7c8cf7d8b9-gnj2t 1/1 Running 0 103m
myapp-cms-65fd6df9c-z7752 1/1 Running 0 14m
myapp-fe-5dbcdd8d9c-fzxgh 1/1 Running 0 52m