[GCP] Workload Identity

소개


  • GKE에서 운영되는 workload가 다른 GCP 서비스(빅쿼리, GCS 등)에 접근해야 할 경우 service account로 인증이 필요하다. 하지만 GKE의 워커 노드에 credential 파일을 올린다던지 컨테이너 안에 credential 파일을 넣는 것은 보안상 취약하다.
  • Google에서 권장하는 방식인 workload identity를 이용해 credential 파일 없이 Service Account로 인증하는 환경을 구성한다.

적용방법


  • Enable Workload Identity on cluster (autopilot 클러스터는 디폴트로 enabled)

  • IAM service account 생성 (기 생성된 sa 이용, 이하 GSA라 부름)

  • GSA에 빅쿼리 접근에 필요한 role 부여

  • Create Kubernetes service account (이하 KSA라 부름)

      kubectl create serviceaccount sa \
          --namespace default
  • Add IAM Policy Binding (KSA를 GSA의 멤버로 바인딩)

      gcloud iam service-accounts add-iam-policy-binding dev@dev.iam.gserviceaccount.com \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:dev.svc.id.goog[default/sa]"
  • KSA에 GSA 바인딩 되었다는 주석 달기

      kubectl annotate serviceaccount sa \
          --namespace default \
          iam.gke.io/gcp-service-account=dev@dev.iam.gserviceaccount.com
  • Pod spec에 KSA 정보 추가

      ## kubernetes 매니페스트 파일 추출
      kubectl get deployment app -o yaml > deployment.yml
      # Pod의 spec으로 작성
      spec:
        serviceAccountName: sa
    
      #GCP 문서에는 아래 노드셀렉터 값도 설정해야 한다고 되어있지만 autopilot에서는 에러 발생.
      #삭제하면 정상적으로 동작함 (autopilot 모드에서는 node pool에 대한 설정을 제한해서 그런듯)
      #  nodeSelector:
      #    iam.gke.io/gke-metadata-server-enabled: "true"
  • 변경된 매니페스트 파일로 롤링 업데이트 수행

      kubectl apply -f DEPLOYMENT_FILE