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

이 가이드에서는 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으로 포드를 만듭니다.

  1. 샘플 포드 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
    
  2. 포드의 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 버킷을 나열합니다.

  1. 포드 내에서 셸을 실행합니다.

    env HTTPS_PROXY=http://localhost:8118 \
    kubectl exec -it sample-pod -- bash
    
  2. 스크립트를 실행하여 프로젝트의 스토리지 버킷을 나열합니다.

    # 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로 바꿉니다.

추가 정보