소개
- 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"
- 에러 발생 : Error from server ([denied by autogke-node-affinity-selector-limitation]): error when creating "deployment-test.yml": admission webhook "policycontrollerv2.common-webhooks.networking.gke.io" denied the request: GKE Policy Controller rejected the request because it violates one or more policies: {"[denied by autogke-node-affinity-selector-limitation]":["If not using workload separation, node selector is not allowed on labels with keys: 'iam.gke.io/gke-metadata-server-enabled'; Autopilot allows node selector only on labels with keys: 'cloud.google.com/gke-spot,topology.kubernetes.io/region,topology.kubernetes.io/zone,failure-domain.beta.kubernetes.io/region,failure-domain.beta.kubernetes.io/zone,cloud.google.com/gke-os-distribution,kubernetes.io/os,kubernetes.io/arch'. Minimum required cpu request for using workload separation: '500m', current pod request : '500m'. Requested by user: '', groups: 'system:authenticated'."]}
- autopilot 에서 허용하는 node selector 값이 아니라는 것
- 에러 발생 : Error from server ([denied by autogke-node-affinity-selector-limitation]): error when creating "deployment-test.yml": admission webhook "policycontrollerv2.common-webhooks.networking.gke.io" denied the request: GKE Policy Controller rejected the request because it violates one or more policies: {"[denied by autogke-node-affinity-selector-limitation]":["If not using workload separation, node selector is not allowed on labels with keys: 'iam.gke.io/gke-metadata-server-enabled'; Autopilot allows node selector only on labels with keys: 'cloud.google.com/gke-spot,topology.kubernetes.io/region,topology.kubernetes.io/zone,failure-domain.beta.kubernetes.io/region,failure-domain.beta.kubernetes.io/zone,cloud.google.com/gke-os-distribution,kubernetes.io/os,kubernetes.io/arch'. Minimum required cpu request for using workload separation: '500m', current pod request : '500m'. Requested by user: '', groups: 'system:authenticated'."]}
변경된 매니페스트 파일로 롤링 업데이트 수행
kubectl apply -f DEPLOYMENT_FILE
'Cloud > GCP' 카테고리의 다른 글
[GCP] GCE 프로젝트간 VM 복사 (0) | 2023.11.27 |
---|---|
[GCP] GKE HTTPS Redirection 적용하기 (0) | 2022.02.24 |
GKE에서 CloudVPN으로 연결된 On Premise Database에 연결하기 (0) | 2022.02.16 |
[GCP] GCE 디스크 추가, OS Login (0) | 2022.01.26 |
[GCP] Shared VPC (0) | 2021.12.24 |