이 가이드에서는 GKE on AWS에서 워크로드 아이덴티티를 구성하여 GCP 리소스에 대한 워크로드 액세스를 제어하는 방법을 설명합니다. 여기에는 ID를 사용하여 클러스터의 Google Cloud 리소스에 액세스하는 방법 예시가 포함됩니다.
AWS IAM 계정과 함께 워크로드 아이덴티티를 사용해서 AWS 리소스 액세스를 제어하려면 AWS에서 워크로드 아이덴티티 사용을 참조하세요.
개요
워크로드 아이덴티티는 Google Cloud IAM 권한을 사용해서 Google Cloud 리소스 액세스를 제어합니다. 워크로드 아이덴티티를 사용하면 각 워크로드에 서로 다른 IAM 역할을 할당할 수 있습니다. 이러한 세분화된 권한 제어를 통해 최소 권한 원칙을 따를 수 있습니다. 워크로드 아이덴티티가 없으면 GKE on AWS 노드에 Google Cloud IAM 역할을 할당하여 노드의 모든 워크로드에 노드와 동일한 권한을 부여해야 합니다.
기본 요건
Kubernetes 버전 v1.20 이상으로 사용자 클러스터를 만듭니다.
AWS VPC에 프록시 또는 방화벽이 사용되는 경우 다음 URL을 허용 목록에 추가합니다.
securetoken.googleapis.com
iamcredentials.googleapis.com
sts.googleapis.com
anthos-aws
디렉터리에서anthos-gke
를 사용하여 컨텍스트를 사용자 클러스터로 전환합니다.cd anthos-aws env HTTPS_PROXY=http://localhost:8118 \ anthos-gke aws clusters get-credentials CLUSTER_NAME
CLUSTER_NAME을 사용자 클러스터 이름으로 바꿉니다.다음 명령어를 사용하여 이 기능에 필요한 4개의 새 서비스를 사용 설정합니다.
gcloud services enable securetoken.googleapis.com gcloud services enable iam.googleapis.com gcloud services enable iamcredentials.googleapis.com gcloud services enable sts.googleapis.com
WI 풀 및 제공업체 이름 작성
각 Google Cloud 프로젝트는 PROJECT_ID.svc.id.goog
형식의 이름을 사용하여 관리형 워크로드 아이덴티티 풀을 자동으로 만듭니다. 이와 비슷하게, Google Cloud는 해당 이름이 https://gkehub.googleapis.com/projects/PROJECT_ID/locations/global/memberships/MEMBERSHIP_ID
패턴을 따르는 ID 공급업체를 만듭니다.
워크로드 아이덴티티 풀에 대한 자세한 내용은 Fleet 사용 설정된 구성요소를 참조하세요.
여기에 표시된 것처럼 프로젝트 ID 및 멤버십 ID로 이름을 작성합니다.
export PROJECT_ID=USER_PROJECT_NAME export CLUSTER_MEMBERSHIP_ID=PROJECT_MEMBERSHIP_NAME export IDP="https://gkehub.googleapis.com/projects/${PROJECT_ID}/locations/global/memberships/${CLUSTER_MEMBERSHIP_ID}" export WI_POOL="${PROJECT_ID}.svc.id.goog"
다음을 바꿉니다.
- USER_PROJECT_NAME을 사용자가 선택한 사용자 프로젝트 이름으로 바꿉니다.
- PROJECT_MEMBERSHIP_NAME을 클러스터의 멤버십 이름으로 바꿉니다.
IAM 정책 binding 만들기
Kubernetes 서비스 계정(KSA)이 Google Cloud 서비스 계정(GSA)을 가장하도록 허용하는 정책 binding을 만듭니다.
export K8S_NAMESPACE=KUBERNETES_NAMESPACE export KSA_NAME=KUBERNETES_SA_NAME export GCP_SA_EMAIL="WORKLOAD_IDENTITY_TEST@${PROJECT_ID}.iam.gserviceaccount.com" gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$WI_POOL[$K8S_NAMESPACE/$KSA_NAME]" $GCP_SA_EMAIL
다음을 바꿉니다.
- KUBERNETES_NAMESPACE을 Kubernetes 서비스 계정이 정의된 Kubernetes 네임스페이스로 바꿉니다.
- WORKLOAD_IDENTITY_TEST를 원하는 워크로드 이름으로 바꿉니다.
- KUBERNETES_SA_NAME을 애플리케이션에 연결된 Kubernetes 서비스 계정의 이름으로 바꿉니다.
SDK 구성 맵 만들기
아래의 셸 스크립트를 실행하여 ConfigMap에서 워크로드 아이덴티티 세부정보를 저장합니다. 포드가 ConfigMap을 마운트하면 Google Cloud CLI가 워크로드 아이덴티티 세부정보를 읽을 수 있습니다.
cat << EOF > cfmap.yaml kind: ConfigMap apiVersion: v1 metadata: namespace: ${K8S_NAMESPACE} name: my-cloudsdk-config data: config: | { "type": "external_account", "audience": "identitynamespace:${WI_POOL}:${IDP}", "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/${GCP_SA_EMAIL}:generateAccessToken", "subject_token_type": "urn:ietf:params:oauth:token-type:jwt", "token_url": "https://sts.googleapis.com/v1/token", "credential_source": { "file": "/var/run/secrets/tokens/gcp-ksa/token" } } EOF env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f cfmap.yaml
Kubernetes 서비스 계정 만들기
IAM binding에 사용된 것과 동일한 이름 및 네임스페이스를 사용하여 사용자 클러스터에 KSA를 만듭니다.
cat << EOF > k8s-service-account.yaml apiVersion: v1 kind: ServiceAccount metadata: name: ${KSA_NAME} namespace: ${K8S_NAMESPACE} EOF env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f k8s-service-account.yaml
포드 만들기
그런 후 위에서 만든 서비스 계정 토큰 보호 및 ConfigMap으로 포드를 만듭니다.
샘플 포드 yaml 파일을 만듭니다.
cat << EOF > sample-pod.yaml apiVersion: v1 kind: Pod metadata: name: sample-pod namespace: ${K8S_NAMESPACE} spec: serviceAccountName: ${KSA_NAME} containers: - command: - /bin/bash - -c - while :; do echo '.'; sleep 500 ; done image: google/cloud-sdk name: cloud-sdk env: - name: GOOGLE_APPLICATION_CREDENTIALS value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json volumeMounts: - name: gcp-ksa mountPath: /var/run/secrets/tokens/gcp-ksa readOnly: true volumes: - name: gcp-ksa projected: defaultMode: 420 sources: - serviceAccountToken: path: token audience: ${WI_POOL} expirationSeconds: 172800 - configMap: name: my-cloudsdk-config optional: false items: - key: "config" path: "google-application-credentials.json" EOF
포드의 YAML을 클러스터에 적용합니다.
env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f sample-pod.yaml
Google Cloud 워크로드 아이덴티티 사용
지원되는 SDK 버전
Google Cloud 워크로드 아이덴티티 기능을 사용하려면 이를 지원하는 SDK로 코드를 빌드해야 합니다. Google Cloud 워크로드 아이덴티티를 지원하는 SDK 버전 목록은 Fleet 워크로드 아이덴티티를 참조하세요.
워크로드 아이덴티티를 사용하는 샘플 코드
이 섹션에는 Google Cloud 워크로드 아이덴티티를 사용하는 샘플 Python 코드가 포함되어 있습니다. 이 예시의 서비스 계정은 'Cloud Storage 관리자' 권한이 포함된 ID를 사용하여 모든 Google Cloud 프로젝트의 Cloud Storage 버킷을 나열합니다.
포드 내에서 셸을 실행합니다.
env HTTPS_PROXY=http://localhost:8118 \ kubectl exec -it sample-pod -- bash
스크립트를 실행하여 프로젝트의 스토리지 버킷을 나열합니다.
# execute these commands inside the Pod pip install --upgrade google-cloud-storage cat << EOF > sample-list-bucket.py from google.cloud import storage storage_client = storage.Client() buckets = storage_client.list_buckets() for bucket in buckets: print(bucket.name) EOF env GOOGLE_CLOUD_PROJECT=USER_PROJECT_NAME \ python3 sample-list-bucket.py
USER_PROJECT_NAME을 Google Cloud 프로젝트 ID로 바꿉니다.
추가 정보
- Fleet 워크로드 아이덴티티
- 워크로드 아이덴티티 제휴
- OIDC ID 공급업체에서 리소스 액세스(Kubernetes 클러스터가 OIDC ID 공급업체)
- AWS에서 워크로드 아이덴티티 사용