如何自动化处理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中自动化完成配置:
- 在GHA workflow中,确保已安装
kubectl并完成集群访问配置(Terraform创建集群后可输出kubeconfig)。 - 获取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所在的自定义命名空间(若有)。
- 执行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,按以下步骤操作:
- 创建自定义名称的K8s SA(示例名称为
crossplane-gcp-provider-sa):
kubectl create serviceaccount crossplane-gcp-provider-sa -n upbound-system
- 获取Crossplane自动生成的ClusterRole名称:
PROVIDER_REVISION=$(kubectl get provider.pkg.crossplane.io gcp -n upbound-system -o jsonpath='{.status.currentRevision}') CLUSTER_ROLE="provider-${PROVIDER_REVISION}"
- 创建ClusterRoleBinding,将自定义SA与目标ClusterRole绑定:
kubectl create clusterrolebinding crossplane-gcp-provider-binding \ --clusterrole=${CLUSTER_ROLE} \ --serviceaccount=upbound-system:crossplane-gcp-provider-sa
- 安装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名称
- 执行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
相关产品推荐
相关产品推荐

