通过Workload Identity绑定K8s与GCP服务账户失败排查
- 按官方文档配置Config Connector,执行
kubectl apply无报错,但出现如下警告:
Warning: resource configconnectors/configconnector.core.cnrm.cloud.google.com is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically.
- 执行
gcloud iam service-accounts get-iam-policy [service account]无法看到预期的绑定关系,应用也没有获得所需权限 - 重复执行配置步骤时系统提示“unchanged”,看似配置已创建但未生效;手动通过gcloud命令添加绑定后一切恢复正常
相关配置文件
iam-policy.yml
apiVersion: iam.cnrm.cloud.google.com/v1beta1 kind: IAMPolicy metadata: name: iampolicy-workload-identity spec: resourceRef: apiVersion: iam.cnrm.cloud.google.com/v1beta1 kind: IAMServiceAccount name: review-instance-account@*********.gserviceaccount.com bindings: - role: roles/iam.workloadIdentityUser members: - serviceAccount:*********.svc.id.goog[review-9/sand-access]
service-account.yml
apiVersion: v1 kind: ServiceAccount metadata: annotations: iam.gke.io/gcp-service-account: review-instance-account@********.iam.gserviceaccount.com name: sand-access namespace: review-apps
configconnector.yml
apiVersion: core.cnrm.cloud.google.com/v1beta1 kind: ConfigConnector metadata: # the name is restricted to ensure that there is only one # ConfigConnector resource installed in your cluster name: configconnector.core.cnrm.cloud.google.com spec: mode: cluster googleServiceAccount: 'review-instance-account********.iam.gserviceaccount.com'
修正IAMPolicy的资源引用格式
IAMPolicy的resourceRef.name需要填写GCP服务账号的短名称(即@符号之前的部分),而非完整邮箱地址。比如目标账号是review-instance-account@*********.gserviceaccount.com,resourceRef.name应改为review-instance-account。修改后的配置片段:spec: resourceRef: apiVersion: iam.cnrm.cloud.google.com/v1beta1 kind: IAMServiceAccount name: review-instance-account # 替换为短名称确认Config Connector服务账号权限
Config Connector使用的GCP服务账号(review-instance-account********.iam.gserviceaccount.com)必须拥有roles/iam.serviceAccountAdmin权限,才能修改目标服务账号的IAM策略。手动绑定生效说明账号本身具备权限,但需确认该权限已正确授予Config Connector的服务账号。验证Config Connector运行状态
执行以下命令查看Config Connector资源状态,确保STATUS为Ready:kubectl get configconnector.core.cnrm.cloud.google.com若状态异常,查看控制器日志排查问题:
kubectl logs -n cnrm-system -l cnrm.cloud.google.com/component=manager重新应用配置并检查IAMPolicy状态
修改配置后执行kubectl apply -f iam-policy.yml,然后查看IAMPolicy资源的状态和事件:# 查看资源状态详情 kubectl get iampolicy iampolicy-workload-identity -o yaml # 查看资源事件 kubectl describe iampolicy iampolicy-workload-identity确认
status.conditions中存在Ready: True的状态,说明配置已生效。关于kubectl apply警告的说明
该警告是因为Config Connector资源并非通过kubectl create --save-config或kubectl apply创建,后续执行kubectl apply会自动补全缺失的注解,无需额外处理,不影响功能正常运行。
内容的提问来源于stack exchange,提问作者NoTroutAboutIt

