GKE 에서 기본적으로 노드(GCE VM)의 SA가 가진 권한으로 GCP 서비스에 액세스 할 수 있습니다. 여러 경우에 이런 상황을 원하지 않을 수 있습니다.
Workload Identity를 사용하면 GKE의 SA(이하 KSA)와 GCP의 SA(이하 GSA)를 매핑해 사용할 수 있습니다.
Workload Identity allows workloads in your GKE clusters to impersonate Identity and Access Management (IAM) service accounts to access Google Cloud services.
IAM roles
roles/container.admin
roles/iam.serviceAccountAdmin
GKE 에서 workload identity를 활성화합니다.
workload identity pool 은 프로젝트의 기본 pool을 사용하게 됩니다.
--workload-pool=PROJECT_ID.svc.id.goog
# GSA 생성
gcloud iam service-accounts create GSA_NAME \
--project=GSA_PROJECT
# KSA 생성
kubectl create serviceaccount KSA_NAME \
--namespace NAMESPACE
GSA에 필요한 역할을 부여합니다.
gcloud projects add-iam-policy-binding PROJECT_ID \
--member "serviceAccount:GSA_NAME@GSA_PROJECT.iam.gserviceaccount.com" \
--role "ROLE_NAME"
이번엔 GSA를 리소스로써 사용합니다. KSA가 GSA를 iam.workloadIdentityUser 유저의 권한으로 사용하기 위해 IAM 정책 바인딩을 추가합니다.
gcloud iam service-accounts add-iam-policy-binding GSA_NAME@GSA_PROJECT.iam.gserviceaccount.com \
--role roles/iam.workloadIdentityUser \
--member "serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]"
KSA에 annotation을 붙입니다.
kubectl annotate serviceaccount KSA_NAME \
--namespace NAMESPACE \
iam.gke.io/gcp-service-account=GSA_NAME@GSA_PROJECT.iam.gserviceaccount.com
참고
https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity
https://stackoverflow.com/questions/61875357/gcloud-confusion-around-add-iam-policy-binding
https://googlecloudarchitect.us/gcp-service-accounts-and-iam-bindings/
https://cloud.google.com/sdk/gcloud/reference/iam/service-accounts/add-iam-policy-binding
https://cloud.google.com/sdk/gcloud/reference/projects/add-iam-policy-binding