在AKS中使用Flux2,如何正确配置ImageRepository认证(工作负载/Kubelet)
解决AKS中Flux2 ImageRepository的ACR认证问题(工作负载身份方案)
核心逻辑
Flux的image-reflector-controller负责扫描ACR镜像,它的ServiceAccount需要绑定拥有AcrPull权限的工作负载身份——kubelet的身份仅用于节点拉取镜像,和Flux控制器的身份是独立的,这是你之前认证失败的核心原因。
关于gotk-components.yaml/gotk-sync.yaml的说明
这两个文件是Flux初始化时生成的核心组件清单:
gotk-components.yaml:包含image-reflector-controller、image-automation-controller等核心控制器的Deployment、ServiceAccount资源gotk-sync.yaml:用于同步Flux自身配置的GitRepository、Kustomization资源
如果你是通过Bicep部署Flux,这两个清单要么是Bicep直接部署的资源,要么是Flux自动生成的。如果找不到本地文件,可以直接从集群导出当前运行的资源:
# 导出image-reflector-controller的ServiceAccount kubectl get sa image-reflector-controller -n flux-system -o yaml > image-reflector-sa.yaml # 导出对应的Deployment kubectl get deployment image-reflector-controller -n flux-system -o yaml > image-reflector-deploy.yaml
正确配置步骤
1. 确认工作负载身份基础环境
- AKS集群已启用OIDC发行者
- 用户托管身份已创建,且已被授予目标ACR的
AcrPull角色 - 已为该身份创建联邦凭据:受众设为
api://AzureADTokenExchange,主体名称必须完全匹配system:serviceaccount:flux-system:image-reflector-controller
2. 给Flux控制器的ServiceAccount绑定工作负载身份
不需要纠结Kustomize补丁,直接修改集群中已有的ServiceAccount:
kubectl annotate serviceaccount image-reflector-controller -n flux-system \ azure.workload.identity/client-id=<你的用户托管身份ClientID>
如果是用Bicep部署Flux,直接在定义ServiceAccount时添加该注释即可,避免后续手动修改。
3. 验证身份绑定状态
检查ServiceAccount的注释是否生效:
kubectl describe sa image-reflector-controller -n flux-system
确认输出中存在azure.workload.identity/client-id字段。
再检查控制器Pod是否挂载了身份令牌卷:
kubectl describe pod -n flux-system -l app.kubernetes.io/name=image-reflector-controller
在Volumes和VolumeMounts部分,应该能看到azure-identity-token相关配置。
4. 配置正确的ImageRepository资源
确保资源中不指定SecretRef(工作负载身份会自动处理认证):
apiVersion: image.toolkit.fluxcd.io/v1beta2 kind: ImageRepository metadata: name: my-acr-repo namespace: flux-system spec: image: <你的ACR名称>.azurecr.io/<目标镜像名> interval: 1m0s # 无需spec.secretRef,工作负载身份自动完成认证
常见问题排查
- 找不到image-reflector-controller ServiceAccount:检查Flux镜像控制器是否已部署,执行
kubectl get pods -n flux-system,如果没有对应Pod,说明Bicep部署Flux时未启用镜像扫描组件,需在部署配置中开启image-reflector和image-automation控制器。 - 认证仍失败:查看控制器日志定位问题:
重点检查令牌获取失败的错误,确认联邦凭据的主体名称完全匹配,以及用户托管身份的kubectl logs -n flux-system -l app.kubernetes.io/name=image-reflector-controllerAcrPull角色是否正确分配到目标ACR。
内容的提问来源于stack exchange,提问作者The Senator
相关产品推荐
相关产品推荐

