Google Cloud에 워크로드 아이덴티티 사용
워크로드 아이덴티티를 사용하면 클러스터의 애플리케이션마다 고유하고 세분화된 ID와 승인을 할당할 수 있습니다. 워크로드 아이덴티티는 Azure용 GKE 내에서 실행되는 애플리케이션이 Google Cloud 서비스에 액세스하는 데 권장되는 방식입니다. 자세한 내용은 워크로드 아이덴티티를 참조하세요.
이 주제에서는 워크로드 아이덴티티를 사용하여 워크로드에서 Google Cloud 서비스에 연결하는 방법을 설명합니다.
Google Cloud 서비스 계정 구성
이 섹션에서는 Google Cloud 서비스에 액세스할 수 있는 권한이 제한된 Google Cloud 서비스 계정(GSA)을 만듭니다.
워크로드 아이덴티티 풀 및 공급업체 가져오기
워크로드 아이덴티티를 구성하려면 클러스터의 ID 공급업체 URI 및 워크로드 아이덴티티 풀 값이 있어야 합니다.
클러스터의 워크로드 아이덴티티 풀 확인
모든 GKE 클러스터에는 워크로드 아이덴티티 풀
PROJECT_ID.svc.id.goog
에서 생성된 ID 공급업체가 포함되어 있습니다. 클러스터의 ID 풀 이름을 가져오려면 Google Cloud CLI를 사용합니다.gcloud container azure clusters describe CLUSTER_NAME \ --location=GOOGLE_CLOUD_LOCATION \ --format='value(workloadIdentityConfig.workloadPool)'
다음을 바꿉니다.
CLUSTER_NAME
을 클러스터 이름으로 바꿉니다.GOOGLE_CLOUD_LOCATION
을 클러스터를 관리하는 Google Cloud 위치의 이름으로 바꿉니다.
출력에는 클러스터의 ID 풀 이름이 포함됩니다. 이 값을 저장합니다. 서비스 계정의 고유 ID 값을 적어둡니다.
클러스터의 ID 공급업체 확인
클러스터의 ID 공급업체 이름을 찾으려면 Google Cloud CLI를 사용합니다.
gcloud container azure clusters describe CLUSTER_NAME \ --location=GOOGLE_CLOUD_LOCATION \ --format='value(workloadIdentityConfig.identityProvider)'
다음을 바꿉니다.
CLUSTER_NAME
GOOGLE_CLOUD_LOCATION
출력에는 클러스터의 ID 공급업체 이름이 포함됩니다. 이 값을 저장합니다. 서비스 계정의 고유 ID 값을 적어둡니다.
Google Cloud 서비스 계정 생성
Google Cloud 서비스 계정(GSA)을 만들고 권한을 부여하고 GSA에 IAM 정책 binding을 추가하려면 다음 단계를 따르세요.
Google Cloud CLI를 사용하여 GSA를 만듭니다.
gcloud iam service-accounts create GSA_NAME --project=PROJECT_ID
다음을 바꿉니다.
GSA_NAME
: 애플리케이션의 GSA 이름입니다.PROJECT_ID
: GSA의 Google Cloud 프로젝트입니다.
GSA가 서비스에 액세스할 수 있도록 IAM 바인딩을 추가합니다.
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role IAM_ROLE
다음을 바꿉니다.
GSA_NAME
: 애플리케이션의 GSA 이름입니다.PROJECT_ID
: GSA의 프로젝트 ID입니다.IAM_ROLE
: GSA에 부여할 IAM 역할입니다.
이 예시에서는
roles/compute.viewer
역할을 사용하여 컴퓨팅 서비스에 대해 읽기 전용 액세스를 허용합니다.gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role roles/compute.viewer
Kubernetes 서비스 계정(KSA)에 GSA를 가장할 수 있는 권한을 부여합니다.
roles/iam.workloadIdentityUser
역할로 IAM 정책 바인딩을 추가하면 됩니다.gcloud iam service-accounts add-iam-policy-binding GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \ --member serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE//KSA_NAME] \ --role roles/iam.workloadIdentityUser
다음을 바꿉니다.
GSA_NAME
PROJECT_ID
NAMESPACE
: 애플리케이션의 Kubernetes 네임스페이스입니다.KSA_NAME
: 애플리케이션에 사용할 KSA입니다.
샘플 애플리케이션 배포
이 섹션에서는 Compute Engine API에 액세스하는 샘플 애플리케이션을 배포합니다. 이 샘플을 사용하려면 서비스 계정에 roles/compute.viewer
IAM 역할이 부여되어야 합니다. 샘플 애플리케이션을 배포하려면 다음 단계를 따르세요.
다음 매니페스트를
workload-identity-sample.yaml
이라는 파일에 복사합니다.apiVersion: v1 kind: Namespace metadata: name: NAMESPACE --- apiVersion: v1 kind: ServiceAccount metadata: name: KSA_NAME namespace: NAMESPACE automountServiceAccountToken: false --- apiVersion: v1 kind: ConfigMap metadata: name: cloud-sdk-config namespace: NAMESPACE data: config: | { "type": "external_account", "audience": "identitynamespace:PROJECT_ID.svc.id.goog:IDENTITY_PROVIDER", "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/GSA_NAME@PROJECT_ID.iam.gserviceaccount.com: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" } } --- apiVersion: v1 kind: Pod metadata: name: cloud-sdk-example namespace: NAMESPACE spec: serviceAccount: KSA_NAME containers: - name: cloud-sdk image: gcr.io/google.com/cloudsdktool/cloud-sdk:latest command: - /bin/bash - -c - 'set -eu -o pipefail; while true; do gcloud compute zones list --filter="name ~ us-central1-*"; sleep 5; done' env: - name: CLOUDSDK_AUTH_CREDENTIAL_FILE_OVERRIDE value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json - name: CLOUDSDK_CORE_PROJECT value: PROJECT_ID volumeMounts: - name: gcp-ksa mountPath: /var/run/secrets/tokens/gcp-ksa readOnly: true volumes: - name: gcp-ksa projected: defaultMode: 420 sources: - serviceAccountToken: audience: PROJECT_ID.svc.id.goog expirationSeconds: 86400 path: token - configMap: name: cloud-sdk-config optional: false items: - key: config path: google-application-credentials.json
다음을 바꿉니다.
PROJECT_ID
NAMESPACE
KSA_NAME
GSA_NAME
IDENTITY_PROVIDER
를 클러스터의 ID 제공업체 이름으로 바꿉니다.
클러스터에 매니페스트를 적용합니다.
kubectl apply -f workload-identity-sample.yaml
샘플 애플리케이션이 작동하는지 확인하고 포드 로그를 확인합니다.
kubectl logs -f cloud-sdk-example -n NAMESPACE
다음을 바꿉니다.
NAMESPACE
포드가 Google Cloud Compute API에 성공적으로 액세스하면 다음과 비슷한 출력이 표시됩니다.
NAME REGION STATUS NEXT_MAINTENANCE TURNDOWN_DATE us-central1-c us-central1 UP us-central1-a us-central1 UP us-central1-f us-central1 UP us-central1-b us-central1 UP
삭제
샘플 애플리케이션 삭제
kubectl delete -f manifest.yaml
Google Cloud 서비스 계정에서 IAM 정책 binding 삭제
gcloud iam service-accounts remove-iam-policy-binding \ GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \ --member serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE//KSA_NAME] \ roles/iam.workloadIdentityUser
다음을 바꿉니다.
GSA_NAME
PROJECT_ID
NAMESPACE
KSA_NAME
프로젝트에서 IAM 정책 binding 삭제
gcloud projects remove-iam-policy-binding PROJECT_ID \ --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role roles/compute.viewer
다음을 바꿉니다.
GSA_NAME
PROJECT_ID
Google Cloud 서비스 계정 삭제
gcloud iam service-accounts delete \ GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
다음을 바꿉니다.
GSA_NAME
PROJECT_ID