Google Cloud에 워크로드 아이덴티티 사용

워크로드 아이덴티티를 사용하면 클러스터의 애플리케이션마다 고유하고 세분화된 ID와 승인을 할당할 수 있습니다. 워크로드 아이덴티티는 AWS용 GKE 내에서 실행되는 애플리케이션이 Google Cloud 서비스에 액세스하는 데 권장되는 방식입니다. 자세한 내용은 워크로드 아이덴티티를 참조하세요.

이 주제에서는 워크로드 아이덴티티를 사용하여 워크로드에서 Google Cloud 서비스에 연결하는 방법을 설명합니다.

Google Cloud 서비스 계정 구성

이 섹션에서는 Google Cloud 서비스에 액세스할 수 있는 권한이 제한된 Google Cloud 서비스 계정(GSA)을 만듭니다.

워크로드 아이덴티티 풀 및 공급업체 가져오기

워크로드 아이덴티티를 구성하려면 클러스터의 ID 공급업체 URI 및 워크로드 아이덴티티 풀 값이 있어야 합니다.

  1. 클러스터의 워크로드 아이덴티티 풀 확인

    모든 GKE 클러스터에는 워크로드 아이덴티티 풀 PROJECT_ID.svc.id.goog에서 생성된 ID 공급업체가 포함되어 있습니다. 클러스터의 ID 풀 이름을 가져오려면 Google Cloud CLI를 사용합니다.

    gcloud container aws clusters describe CLUSTER_NAME \
        --location=GOOGLE_CLOUD_LOCATION \
        --format='value(workloadIdentityConfig.workloadPool)'
    

    다음을 바꿉니다.

    • CLUSTER_NAME을 클러스터 이름으로 바꿉니다.
    • GOOGLE_CLOUD_LOCATION을 클러스터를 관리하는 Google Cloud 위치의 이름으로 바꿉니다.

    출력에는 클러스터의 ID 풀 이름이 포함됩니다. 이 값을 저장합니다. 서비스 계정의 고유 ID 값을 적어둡니다.

  2. 클러스터의 ID 공급업체 확인

    클러스터의 ID 공급업체 이름을 찾으려면 Google Cloud CLI를 사용합니다.

    gcloud container aws 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을 추가하려면 다음 단계를 따르세요.

  1. Google Cloud CLI를 사용하여 GSA를 만듭니다.

    gcloud iam service-accounts create GSA_NAME --project=PROJECT_ID
    

    다음을 바꿉니다.

    • GSA_NAME: 애플리케이션의 GSA 이름입니다.
    • PROJECT_ID: GSA의 Google Cloud 프로젝트입니다.
  2. 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
    
  3. 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 역할이 부여되어야 합니다. 샘플 애플리케이션을 배포하려면 다음 단계를 따르세요.

  1. 다음 매니페스트를 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 제공업체 이름으로 바꿉니다.
  2. 클러스터에 매니페스트를 적용합니다.

    kubectl apply -f workload-identity-sample.yaml
    
  3. 샘플 애플리케이션이 작동하는지 확인하고 포드 로그를 확인합니다.

    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
    

삭제

  1. 샘플 애플리케이션 삭제

    kubectl delete -f manifest.yaml
    
  2. 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
  3. 프로젝트에서 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
  4. Google Cloud 서비스 계정 삭제

    gcloud iam service-accounts delete \
       GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
    

    다음을 바꿉니다.

    • GSA_NAME
    • PROJECT_ID

다음 단계