You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动化处理Crossplane ProviderRevision与Workload Identity?

GCP与Crossplane IAM自动化配置问题解决方案

问题背景

我通过GitHub Actions(GHA)配合Terraform创建Kubernetes集群及相关GCP资源,在配置Crossplane与GCP的Workload Identity关联时遇到两个自动化难题:

  • 默认情况下,Crossplane Provider Pod使用的Kubernetes服务账号(SA)会随Provider版本/发布生成唯一名称,如何在集群外通过自动化为这个唯一命名的K8s SA添加GCP IAM绑定?
  • 若创建一个已知名称的K8s SA并让Crossplane Provider Pod使用它,如何将该SA与Crossplane自动生成的唯一命名ClusterRole进行绑定?不想自行创建ClusterRole以避免重复工作。

解决方案

一、自动化处理Crossplane默认生成的唯一K8s SA的GCP IAM绑定

Crossplane Provider的.status.currentRevision字段包含了生成唯一SA名称的核心标识,可通过以下步骤在GHA中自动化完成配置:

  1. 在GHA workflow中,确保已安装kubectl并完成集群访问配置(Terraform创建集群后可输出kubeconfig)。
  2. 获取Provider的currentRevision值并拼接出默认K8s SA名称:
PROVIDER_REVISION=$(kubectl get provider.pkg.crossplane.io gcp -n upbound-system -o jsonpath='{.status.currentRevision}')
KUBERNETES_SA="provider-${PROVIDER_REVISION}"

注意:需将命令中的gcp替换为你实际安装的Provider名称,upbound-system替换为Crossplane所在的自定义命名空间(若有)。

  1. 执行GCP IAM绑定与K8s SA注解命令:
gcloud iam service-accounts add-iam-policy-binding \
    ${GCP_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com \
    --role roles/iam.workloadIdentityUser \
    --member "serviceAccount:${PROJECT_ID}.svc.id.goog[upbound-system/${KUBERNETES_SA}]" \
    --project ${PROJECT_ID}

kubectl annotate serviceaccount ${KUBERNETES_SA} \
    iam.gke.io/gcp-service-account=${GCP_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com \
    -n upbound-system

二、自定义已知名称K8s SA并绑定Crossplane自动生成的ClusterRole

若要使用固定名称的K8s SA,按以下步骤操作:

  1. 创建自定义名称的K8s SA(示例名称为crossplane-gcp-provider-sa):
kubectl create serviceaccount crossplane-gcp-provider-sa -n upbound-system
  1. 获取Crossplane自动生成的ClusterRole名称:
PROVIDER_REVISION=$(kubectl get provider.pkg.crossplane.io gcp -n upbound-system -o jsonpath='{.status.currentRevision}')
CLUSTER_ROLE="provider-${PROVIDER_REVISION}"
  1. 创建ClusterRoleBinding,将自定义SA与目标ClusterRole绑定:
kubectl create clusterrolebinding crossplane-gcp-provider-binding \
    --clusterrole=${CLUSTER_ROLE} \
    --serviceaccount=upbound-system:crossplane-gcp-provider-sa
  1. 安装Crossplane Provider时,指定使用该自定义SA:
    在Provider的配置YAML中添加spec.serviceAccountName字段:
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: gcp
  namespace: upbound-system
spec:
  package: xpkg.upbound.io/upbound/provider-family-gcp:v1.3.0
  serviceAccountName: crossplane-gcp-provider-sa # 指定自定义SA名称
  1. 执行GCP IAM绑定与SA注解命令(使用自定义SA名称):
gcloud iam service-accounts add-iam-policy-binding \
    ${GCP_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com \
    --role roles/iam.workloadIdentityUser \
    --member "serviceAccount:${PROJECT_ID}.svc.id.goog[upbound-system/crossplane-gcp-provider-sa]" \
    --project ${PROJECT_ID}

kubectl annotate serviceaccount crossplane-gcp-provider-sa \
    iam.gke.io/gcp-service-account=${GCP_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com \
    -n upbound-system

内容的提问来源于stack exchange,提问作者Mike Williams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 01:53:16