问题描述
我在 GKE 上使用 helm 安装了 kubernetes external secrets。
- GKE:asia-northeast1 上的 1.16.15-gke.6000
- 掌舵应用版本 6.2.0
- 使用工作负载标识 as document written
对于工作负载身份,我按照以下命令绑定的服务帐户 (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 中检查服务帐户显示正确的服务帐户
在集群中创建一个 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
有没有人遇到过类似的问题? 谢谢
整个命令
- 使用工作负载池创建集群。
$ gcloud 容器集群创建集群 --region asia-northeast1 --node-locations asia-northeast1-a --num-nodes 1 --preemptible --workload-pool=my-project.svc.id.goog
- 创建 kubernetes 服务帐户。
$ kubectl create serviceaccount --namespace default ksa
- 绑定 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`
- 添加注释
$ kubectl annotate serviceaccount
--命名空间默认
ksa
iam.gke.io/gcp-service-account=my-secrets-sa@my-project.iam.gserviceaccount.com
- 使用 helm 安装
$ helm install my-release external-secrets/kubernetes-external-secrets
- 创建外部机密
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