我在 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 中的服务帐户会显示正确的服务帐户
在集群中创建一个 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
以前有没有人遇到过类似的问题?谢谢
整个命令
- 使用工作负载池创建一个集群。
$ gcloud container clusters create cluster --region asia-northeast1 --node-locations asia-northeast1-a --num-nodes 1 --preemptible --workload-pool=my-project.svc.id.goog
- 创建 Kubernetes 服务帐户。
$ kubectl create serviceaccount --namespace 默认 ksa
- 绑定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`
- 添加注释
$ kubectl annotate serviceaccount
--namespace default
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