GKE 上的 kubernetes 外部机密,权限错误

问题描述

我在 GKE 上使用 helm 安装了 kubernetes external secrets

对于工作负载身份,我按照以下命令绑定的服务帐户 (my-secrets-sa@$PROJECT.iam.gserviceaccount.com) 具有 SecretManager.admin 角色,这对于使用 google 似乎是必要的秘密管理员

gcloud iam service-accounts add-iam-policy-binding --role roles/iam.workloadIdentityUser --member "serviceAccount:$CLUSTER_PROJECT.svc.id.goog[$SECRETS_NAMESPACE/kubernetes-external-secrets]" my- secrets-sa@$PROJECT.iam.gserviceaccount.com

工作负载标识设置正确,因为在 GKE 上的 pod 中检查服务帐户显示正确的服务帐户

https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity#enable_workload_identity_on_a_new_cluster

在集群中创建一个 pod 并在其中检查身份验证。它显示my-secrets-sa@$PROJECT.iam.gserviceaccount.com

$ kubectl run -it --image google/cloud-sdk:slim --serviceaccount ksa-name --namespace k8s-namespace workspace-identity-test

$ gcloud 身份验证列表

但是即使创建externalsecret,externalsecret也显示错误

错误,7 PERMISSION_DENIED:资源“projects/project-id/secrets/my-gsm-secret-name/versions/latest”的权限“secretmanager.versions.access”被拒绝(或者它可能不存在)。>

secret my-gsm-secret-name 本身存在于 secretmanager 中,所以它不应该“不存在”。 此外,必须通过工作负载标识正确设置权限。

这是我定义的外部秘密。

apiVersion: kubernetes-client.io/v1
kind: ExternalSecret
Metadata:
  name: gcp-secrets-manager-example    # name of the k8s external secret and the k8s secret
spec:
  backendType: gcpsecretsManager
  projectId: my-gsm-secret-project
  data:
    - key: my-gsm-secret-name     # name of the GCP secret
      name: my-kubernetes-secret-name   # key name in the k8s secret
      version: latest    # version of the GCP secret
      property: value      # name of the field in the GCP secret

有没有人遇到过类似的问题? 谢谢

整个命令

  1. 使用工作负载池创建集群。

$ gcloud 容器集群创建集群 --region asia-northeast1 --node-locations asia-northeast1-a --num-nodes 1 --preemptible --workload-pool=my-project.svc.id.goog

  1. 创建 kubernetes 服务帐户。

$ kubectl create serviceaccount --namespace default ksa

  1. 绑定 kubernetes 服务帐号和服务帐号

$ gcloud iam service-accounts add-iam-policy-binding
--role 角色/iam.workloadIdentityUser
--member "serviceAccount:my-project.svc.id.goog[default/ksa]"
my-secrets-sa@my-project.iam.gserviceaccount.com`

  1. 添加注释

$ kubectl annotate serviceaccount
--命名空间
ksa
iam.gke.io/gcp-service-account=my-secrets-sa@my-project.iam.gserviceaccount.com

  1. 使用 helm 安装

$ helm install my-release external-secrets/kubernetes-external-secrets

  1. 创建外部机密
apiVersion: kubernetes-client.io/v1
kind: ExternalSecret
Metadata:
  name: gcp-secrets-manager-example    # name of the k8s external secret and the k8s secret
spec:
  backendType: gcpsecretsManager
  projectId: my-gsm-secret-project
  data:
    - key: my-gsm-secret-name     # name of the GCP secret
      name: my-kubernetes-secret-name   # key name in the k8s secret
      version: latest    # version of the GCP secret
      property: value      # name of the field in the GCP secret

$ kubectl apply -f excternal-secret.yaml

解决方法

我注意到我使用了不同的 kubernetes 服务帐户。

安装 helm 时,创建了新的 kubernetes 服务帐户 my-release-kubernetes-external-secrets,并且服务/pods 必须在此服务帐户上运行。

所以我应该绑定 my-release-kubernetes-external-secrets 和谷歌服务帐户。

现在,它运行良好。

谢谢@matt_j @norbjd