如何实现AKS部署容器与Azure Event Hub的认证授权?
本人对Azure安全知识有限(如Identity、Principal ID、Entra ID等),若问题浅显还请见谅。此前在容器应用模型中,我已创建身份并用于Event Hub角色分配,该流程可行。
当前场景:我拥有一个AKS集群,镜像存储于ACR注册表,通过命令kubectl create deployment <> --image=my.azureacr.io/imagename:v3创建部署,显示deployment.apps/somename已创建,但执行kubectl get deployment返回可用实例数为0(工作负载显示黄色三角标识),且我不知道如何查看日志。
我的应用配置如下:
spring.cloud.azure.eventhubs.namespace=hents spring.cloud.azure.eventhubs.processor.checkpoint-store.account-name=mynd spring.cloud.azure.eventhubs.processor.checkpoint-store.container-name=temckpoint spring.cloud.stream.bindings.supply-out-0.destination=sb spring.cloud.function.definition=supply; spring.cloud.stream.poller.initial-delay=0 spring.cloud.stream.poller.fixed-delay=1000
配置中未使用连接字符串或共享访问签名。现咨询:如何实现AKS部署的应用与Azure Event Hub之间的认证、授权及信任关系?
一、先排查AKS部署异常(解决可用实例数为0的问题)
查看Pod状态与事件
先找到部署对应的Pod:kubectl get pods -l app=<你的部署名称>再查看Pod的详细状态和启动事件,定位失败原因(比如镜像拉取权限不足、配置错误等):
kubectl describe pod <Pod名称>查看容器日志
如果Pod已创建但无法正常启动,直接查看容器日志:kubectl logs <Pod名称>若包含多个容器,需指定容器名称:
kubectl logs <Pod名称> -c <容器名称>
二、实现AKS应用与Azure Event Hub的认证授权(基于Azure工作负载身份)
推荐使用Azure工作负载身份(替代传统托管身份),适配AKS场景的身份认证需求,步骤如下:
1. 启用AKS集群的工作负载身份功能
确保AKS集群已开启OIDC issuer和工作负载身份:
az aks update -n <AKS集群名称> -g <资源组名称> --enable-oidc-issuer --enable-workload-identity
获取集群的OIDC issuer URL(后续步骤会用到):
az aks show -n <AKS集群名称> -g <资源组名称> --query "oidcIssuerProfile.issuerUrl" -o tsv
2. 创建Azure AD应用与服务主体
- 创建Azure AD应用,记录返回的
appId(客户端ID)和id(对象ID):az ad app create --display-name <自定义应用名称> - 关联创建服务主体:
az ad sp create --id <上面获取的appId>
3. 为服务主体分配必要权限
根据应用需求(发送/接收Event Hub事件、操作存储账户checkpoint),分配对应Azure角色:
- 发送Event Hub事件:分配
Azure Event Hubs Data Sender角色 - 接收Event Hub事件:分配
Azure Event Hubs Data Receiver角色 - 操作存储账户Blob:分配
Storage Blob Data Contributor角色
执行角色分配命令:
# 分配Event Hub命名空间权限 az role assignment create \ --role "Azure Event Hubs Data Sender" \ --assignee <服务主体对象ID> \ --scope "/subscriptions/<订阅ID>/resourceGroups/<资源组名称>/providers/Microsoft.EventHub/namespaces/<Event Hub命名空间>" # 分配存储账户权限 az role assignment create \ --role "Storage Blob Data Contributor" \ --assignee <服务主体对象ID> \ --scope "/subscriptions/<订阅ID>/resourceGroups/<资源组名称>/providers/Microsoft.Storage/storageAccounts/<存储账户名称>"
4. 绑定AKS服务账户与Azure AD应用
- 在AKS中创建服务账户:
kubectl create serviceaccount <自定义服务账户名称> -n <应用所在命名空间> - 建立AKS服务账户与Azure AD应用的信任关系:
az ad app federated-credential create \ --id <Azure AD应用对象ID> \ --parameters '{ "name": "<自定义凭证名称>", "issuer": "<之前获取的AKS OIDC issuer URL>", "subject": "system:serviceaccount:<应用所在命名空间>:<服务账户名称>", "description": "AKS workload identity credential", "audiences": ["api://AzureADTokenExchange"] }'
5. 修改AKS部署配置,启用工作负载身份
编辑部署YAML(或执行kubectl edit deployment <部署名称>),添加服务账户和环境变量:
spec: template: spec: serviceAccountName: <你的服务账户名称> containers: - name: <容器名称> image: my.azureacr.io/imagename:v3 env: - name: AZURE_CLIENT_ID value: <Azure AD应用的appId> - name: AZURE_TENANT_ID value: <你的Azure租户ID>
6. 验证Spring Boot应用配置
你的现有配置已采用无连接字符串的方式,Spring Cloud Azure会自动通过工作负载身份获取访问令牌,只需确保项目依赖中包含spring-cloud-azure-starter-eventhubs和spring-cloud-azure-starter-storage-blob相关依赖,版本与Spring Boot版本匹配即可。
内容的提问来源于stack exchange,提问作者Kris Swat

