2

我在 GKE 上使用 helm安装kubernetes 外部机密。

  • GKE:1.16.15-gke.6000 on asia-northeast1
  • 掌舵应用程序版本 6.2.0
  • 使用 Workload Identity作为文档编写

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

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 并在其中检查 auth。表明my-secrets-sa@$PROJECT.iam.gserviceaccount.com

$ kubectl run -it --image google/cloud-sdk:slim --serviceaccount ksa-name --namespace k8s-namespace 工作负载身份测试

$ gcloud 身份验证列表

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

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

secretmy-gsm-secret-name本身存在于 secretmanager 中,因此不应“不存在”。此外,工作负载身份必须正确设置权限。

这是我定义的externalsecret。

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 container clusters create cluster --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 默认 ksa

  1. 绑定kubernetes服务账号&服务账号

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

  1. 添加注释

$ kubectl annotate serviceaccount
--namespace default
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

4

1 回答 1

2

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

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

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

现在,它运作良好。

谢谢@matt_j @norbjd

于 2021-01-31T06:31:36.897 回答