워크로드 아이덴티티 사용

워크로드 아이덴티티로 Knative serving 서비스를 인증하여 Compute API, Storage & Database API, Machine Learning API와 같은 Google Cloud API에 액세스하는 방법을 알아봅니다.

Knative serving 서비스를 인증하려면 다음을 수행해야 합니다.

  1. 클러스터에서 워크로드 아이덴티티 사용 설정
  2. 권한 구성
  3. Kubernetes 서비스 계정(KSA)을 Google 서비스 계정(GSA)에 결합합니다.

이 단계를 따르면 앞에서 만든 ID를 사용하는 새로운 Knative serving 서비스를 배포할 수 있습니다.

클러스터에서 워크로드 아이덴티티 사용 설정

Knative serving에서 워크로드 아이덴티티를 설정하려면 Google Cloud 서비스 계정 JSON 파일을 사용하는 대신 Fleet 워크로드 아이덴티티 제휴를 설정할 수 있습니다.

모든 측정항목을 사용 설정하도록 권한 구성

요청 수 또는 요청 지연 시간 같은 측정항목을 Google Cloud Observability에 사용 설정하려면 Cloud Monitoring에 대한 쓰기 권한을 부여해야 합니다. 예를 들어 모니터링 데이터를 작성하는 데 필요한 권한이 있으므로 Knative serving과 연결된 Google 서비스 계정에 모니터링 측정항목 작성자 역할(roles/monitoring.metricWriter)을 부여할 수 있습니다. Google 서비스 계정 만들기에 대한 자세한 내용은 서비스 계정 사용을 참조하세요.

서비스 계정 binding

Kubernetes 서비스 계정(KSA)이 Google 서비스 계정(GSA) 역할을 하도록 관계를 설정해야 합니다. binding한 KSA로 실행되는 모든 워크로드는 Google Cloud API에 액세스할 때 GSA로 자동 인증됩니다. binding한 KSA는 워크로드 아이덴티티를 사용하려는 Knative serving 서비스의 클러스터 및 네임스페이스 내에 있어야 합니다. GSA는 클러스터가 있는 Google Cloud 프로젝트와 다른 Google Cloud 프로젝트에 속할 수 있습니다.

  1. GSA가 없는 경우 계정을 만듭니다. 그렇지 않으면 다음 단계로 건너뜁니다. 조직의 Google Cloud 프로젝트 내에서 Knative serving와 함께 사용할 GSA를 만든 다음 Knative serving 서비스가 실행되는 Google Cloud 프로젝트에서 사용할 수 있습니다.

    새 GSA를 만들려면 다음 명령어를 실행합니다.

    gcloud iam service-accounts create GSA_NAME

    GSA_NAME을 새 Google 서비스 계정의 이름으로 바꿉니다.

    Knative serving 서비스에서 Google 서비스 계정을 사용하는 방법에 대한 자세한 내용은 서비스 계정 사용을 참조하세요.

  2. GSA에 필요한 IAM 역할이 있는지 확인합니다. 다음 명령어를 사용하여 추가 역할을 부여할 수 있습니다.

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member "serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
        --role "ROLE_NAME"
    

    다음과 같이 바꿉니다.

    • PROJECT_ID를 Google 서비스 계정이 있는 Google Cloud 프로젝트 ID로 바꿉니다.
    • GSA_NAME을 Google 서비스 계정의 이름으로 바꿉니다.
    • ROLE_NAME을 GSA에 할당할 IAM 역할로 바꿉니다(예: roles/monitoring.metricWriter).
  3. Kubernetes 서비스 계정이 없으면 Knative serving 서비스와 동일한 Kubernetes 네임스페이스에 계정을 만듭니다. 그렇지 않으면 다음 단계로 건너뜁니다.

    kubectl create serviceaccount --namespace K8S_NAMESPACE KSA_NAME
  4. Kubernetes 및 Google 서비스 계정을 바인딩하여 ID를 만든 후 클러스터에 배포합니다.

    1. KSA가 GSA를 가장할 수 있도록 둘 사이에 IAM 정책 바인딩을 만듭니다.

      gcloud iam service-accounts add-iam-policy-binding \
      --role roles/iam.workloadIdentityUser \
      --member "serviceAccount:PROJECT_ID.svc.id.goog[K8S_NAMESPACE/KSA_NAME]" \
      GSA_NAME@GSA_PROJECT_ID.iam.gserviceaccount.com

      다음과 같이 바꿉니다.

      • PROJECT_ID를 Kubernetes 서비스 계정 및 Knative serving 서비스가 있는 클러스터의 Google Cloud 프로젝트 ID로 바꿉니다.
      • K8S_NAMESPACE/KSA_NAME을 Kubernetes 서비스 계정의 네임스페이스 및 이름으로 바꿉니다.
      • GSA_NAME@GSA_PROJECT_ID를 Google 서비스 계정 이름과 Google Cloud 프로젝트의 ID로 바꿉니다. 조직의 모든 Google 서비스 계정을 사용할 수 있습니다. Google 서비스 계정을 보려면 서비스 계정 나열을 참조하세요.
    2. GSA의 이메일 주소를 사용하여 KSA에 iam.gke.io/gcp-service-account=GSA_NAME@GSA_PROJECT_ID 주석을 추가합니다.

      kubectl annotate serviceaccount \
      --namespace K8S_NAMESPACE KSA_NAME \
       iam.gke.io/gcp-service-account=GSA_NAME@GSA_PROJECT_ID.iam.gserviceaccount.com

      다음과 같이 바꿉니다.

      • K8S_NAMESPACE/KSA_NAME을 바인딩을 만든 Kubernetes 서비스 계정의 네임스페이스 및 이름으로 바꿉니다.
      • GSA_NAME@GSA_PROJECT_ID를 바인딩을 만든 Google 서비스 계정 이름 및 Google Cloud 프로젝트 ID로 바꿉니다.

워크로드 아이덴티티를 사용하도록 새 서비스 배포

생성한 워크로드 아이덴티티를 사용하는 새로운 Knative serving 서비스를 배포합니다.

Console

  1. Google Cloud 콘솔에서 Knative serving으로 이동합니다.

    Knative serving으로 이동

  2. 배포할 새 서비스를 구성하려면 서비스 만들기를 클릭합니다. 기존 서비스를 구성하려면 해당 서비스를 클릭한 다음 새 버전 수정 및 배포를 클릭합니다.

  3. 고급 설정에서 컨테이너를 클릭합니다.

  4. 서비스 계정 드롭다운을 클릭하고 원하는 서비스 계정을 선택합니다.

  5. 다음을 클릭하여 다음 섹션으로 진행합니다.

  6. 이 서비스가 트리거되는 방식 구성 섹션에서 서비스를 호출하는 데 사용할 연결을 선택합니다.

  7. 만들기를 클릭하여 Knative serving에 이미지를 배포하고 배포가 완료될 때까지 기다립니다.

명령줄

  • 기존 서비스의 경우 다음 매개변수로 gcloud run services update 명령어를 실행하여 Kubernetes 서비스 계정을 설정합니다.

    gcloud run services update SERVICE --service-account KSA_NAME
    

    다음과 같이 바꿉니다.

    • SERVICE를 Knative serving 서비스의 이름으로 바꿉니다.
    • KSA_NAME을 워크로드 아이덴티티를 만드는 데 사용한 Kubernetes 서비스 계정으로 바꿉니다.
  • 새 서비스의 경우 --service-account 매개변수로 gcloud run deploy 명령어를 실행하여 Kubernetes 서비스 계정을 설정합니다.

    gcloud run deploy --image IMAGE_URL --service-account KSA_NAME
    

    다음과 같이 바꿉니다.

    • IMAGE_URL을 컨테이너 이미지에 대한 참조(예: gcr.io/cloudrun/hello)로 바꿉니다.
    • KSA_NAME을 워크로드 아이덴티티를 만드는 데 사용한 Kubernetes 서비스 계정으로 바꿉니다.

YAML

--format=export 플래그를 사용하여 gcloud run services describe 명령어로 YAML 파일에 기존 서비스 구성을 다운로드할 수 있습니다. 그런 다음 gcloud run services replace 명령어로 YAML 파일을 수정하고 변경사항을 배포할 수 있습니다. 지정된 속성만 수정해야 합니다.

  1. 서비스 구성을 로컬 작업공간의 service.yaml 파일에 다운로드합니다.

    gcloud run services describe SERVICE --format export > service.yaml

    SERVICE를 Knative serving 서비스의 이름으로 바꿉니다.

  2. 로컬 파일에서 serviceAccountName: 속성을 업데이트합니다.

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        spec:
          serviceAccountName: KSA_NAME
    

    바꾸기

    • SERVICE를 Knative serving 서비스의 이름으로 바꿉니다.
    • KSA_NAME을 워크로드 아이덴티티를 만드는 데 사용한 Kubernetes 서비스 계정으로 바꿉니다.
  3. 다음 명령어를 실행하여 Knative serving 서비스에 구성을 배포합니다.

    gcloud run services replace service.yaml

워크로드 아이덴티티를 사용하도록 기존 서비스 마이그레이션

기존 클러스터에서 워크로드 아이덴티티를 사용 설정한 경우 워크로드 아이덴티티를 사용할 클러스터의 각 서비스를 마이그레이션해야 합니다. 기존 서비스 마이그레이션 방법 알아보기

다음 단계

서비스에 대한 액세스를 관리하는 방법 알아보기