GCP

Shared VPC를 사용하여 GKE 클러스터 생성시 IAM 설정

Somaz 2023. 10. 8. 02:01
728x90
반응형

Overview

서로 다른 프로젝트에서 공유 VPC를 사용하는 2개의 Google Kubernetes Engine(GKE) 클러스터를 만드는 방법에 대해서 알아보려고 한다.

GKE 아키텍처 예시

 


 

공유 VPC란(Share VPC)?

공유 VPC는 여러 프로젝트에 리소스를 공통 VPC 네트워크에 연결할 수 있게 함으로써 해당 네트워크의 내부 IP를 사용하여 서로 안전하고 효율적으로 통신할 수 있다.

 

프로젝트(환경)별로 리소스를 분리하여 구성할 수 있다. 따라서 환경별로 리소스를 분리하여 관리할 수 있고 비용 관리 측면에도 용이하다. 

공유 VPC를 사용하면 호스트 프로젝트를 지정한 후 하나 이상의 다른 서비스 프로젝트를 연결할 수 있다. 서브넷, 경로 방화벽과 같은 네트워크 리소스를 호스트 프로젝트에서만 제어하면 되기 때문에 네트워크 리소스 관리에 용이하다.

 

 


 

1. 기본 개념

공유 VPC 네트워크가 있는 호스트 프로젝트는 두 개의 서비스 프로젝트에 내부 연결을 제공하는 반면, 독립형 프로젝트는 공유 VPC를 사용하지 않는다.

출처 : https://cloud.google.com/vpc/docs/shared-vpc?hl=ko#shared_vpc_overview

 

 

2. 여러 호스트 프로젝트

공유 VPC를 사용하여 별도의 테스트 및 프로덕션 환경을 구축하는 방법을 보여준다. 아래의 경우에는 별도의 두 호스트 프로젝트인 테스트 환경과 프로젝트 환경을 사용한다.

출처 : https://cloud.google.com/vpc/docs/shared-vpc?hl=ko#example_multiple_host_projects

 

 


 

공유 VPC를 활용하여 GKE 클러스터 설정 시 선행작업

호스트 프로젝트와 서비스 프로젝트 예시는 다음과 같다.

 

 

호스트 프로젝트(Host Project)

  • `somaz-hp`

 

서비스 프로젝트(Service Project)

  • `somaz-sp-dev`
  • `somaz-sp-prod`

 


 

IAM 설정

서비스 프로젝트가 somaz-sp-dev 기준으로 작성한다. 나머지 서비스 프로젝트도 동일하다.

  • `GCP API SA: <project-number>@cloudservices.gserviceaccount.com`
  • `GKE API SA: service-<project-number>@container-engine-robot.iam.gserviceaccount.com`

 

 

1. 서비스 계정 변수 설정

GKE_SA=service-$(gcloud projects describe somaz-sp-dev --format 'value(projectNumber)')@container-engine-robot.iam.gserviceaccount.com

echo $GKE_SA
service-<project number>@container-engine-robot.iam.gserviceaccount.com

$ GCP_API_SA=$(gcloud projects describe somaz-sp-dev --format 'value(projectNumber)')@cloudservices.gserviceaccount.com

$ echo $GCP_API_SA
<project number>@cloudservices.gserviceaccount.com

 

 

2. 프로젝트에서 GKE API 사용 설정

gcloud services enable container.googleapis.com

# 확인
gcloud services list --enabled |grep Kubernetes
container.googleapis.com             Kubernetes Engine API

 

 

3. 호스트 프로젝트 GKE API SA와 서비스 프로젝트 GCP API SA / GKE API SA에게 `roles/container.serviceAgent(=Kubernetes Egnine 서비스 에이전트)` 권한 부여 (호스트 프로젝트에 부여)

# Host Project GKE API 서비스 계정 권한 부여
gcloud projects add-iam-policy-binding somaz-hp --member serviceAccount:$GKE_SA --role roles/container.serviceAgent

# Service Project GKE API 서비스 계정, Google API 서비스 계정 권한 부여
gcloud projects add-iam-policy-binding somaz-hp --member serviceAccount:$GKE_SA --role roles/container.serviceAgent
gcloud projects add-iam-policy-binding somaz-hp --member serviceAccount:$GCP_API_SA --role roles/container.serviceAgent

# roles/container.serviceAgent 권한 부여 확인
gcloud projects get-iam-policy mgmt-2023 --flatten="bindings[].members" --format='table(bindings.role,bindings.members)' | grep 'roles/container.serviceAgent'
roles/container.serviceAgent          serviceAccount:<project number>@cloudservices.gserviceaccount.com
roles/container.serviceAgent          serviceAccount:service-<project number>@container-engine-robot.iam.gserviceaccount.com
roles/container.serviceAgent          serviceAccount:service-<project number>@container-engine-robot.iam.gserviceaccount.com

 

 

4. 서비스 프로젝트 GKE API SA 에게 `roles/editor(=편집자)` 권한 부여 (서비스 프로젝트에 부여)

# Service Project Google API 서비스 계정 권한 부여
gcloud projects add-iam-policy-binding somaz-sp-dev --member serviceAccount:$GKE_SA --role roles/editor

# roles/editor 권한 부여 확인
gcloud projects get-iam-policy dev-dsp-1 --flatten="bindings[].members" --format='table(bindings.role,bindings.members)' | grep 'roles/editor'

 

 

5. 서비스 프로젝트 GKE API SA 과 GCP API SA 에 `roles/compute.networkUser(=Compute 네트워크 사용자)` 권한 부여(호스트 프로젝트에 부여)

# Service Project GKE API 서비스 계정, Google API 서비스 계정 권한 부여
gcloud projects add-iam-policy-binding somaz-hp --member serviceAccount:$GKE_SA --role roles/compute.networkUser
gcloud projects add-iam-policy-binding somaz-hp --member serviceAccount:$GCP_API_SA --role roles/compute.networkUser

# roles/compute.networkUser 권한 부여 확인
gcloud projects get-iam-policy mgmt-2023 --flatten="bindings[].members" --format='table(bindings.role,bindings.members)' | grep 'roles/compute.networkUser'

 

 

6.  서비스 프로젝트 GKE API SA 와 GCP API SA에 나머지 기타 권한 부여(호스트 프로젝트에 부여)

gcloud projects add-iam-policy-binding mgmt-2023 --member serviceAccount:$GKE_SA --role roles/compute.networkAdmin
gcloud projects add-iam-policy-binding mgmt-2023 --member serviceAccount:$GCP_API_SA --role roles/compute.viewer
gcloud projects add-iam-policy-binding mgmt-2023 --member serviceAccount:$GKE_SA --role roles/editor

 

 

7. Terraform 사용 시 사용하는 SA에게 `roles/compute.xpnAdmin(= Compute 공유 VPC 관리자)` 권한 부여(조직에 부여)

# Google 사용자에게 부여
gcloud organizations add-iam-policy-binding [ORGANIZATION_ID] \
    --member="user:[USER_EMAIL]" \
    --role="roles/compute.xpnAdmin"

# Google 서비스 어카운트(SA)에게 부여
gcloud organizations add-iam-policy-binding [ORGANIZATION_ID] \
    --member="serviceAccount:[SERVICE_ACCOUNT]" \
    --role="roles/compute.xpnAdmin"

 

 

8. Terraform으로 클러스터 생성 후에 Terraform GKE SA에게 Artifact Registry가 있는 프로젝트(대부분 호스트 프로젝트 사용)에 `roles/artifactregistry.reader(= Artifact Registry 리더)` 권한 부여(호스트 프로젝트에 부여)

 

 

Terraform GKE ServiceAccount

  • `tf-gke-<cluster name>-<random>@<project>.iam.gserviceaccount.com`
gcloud projects add-iam-policy-binding somaz-hp --member serviceAccount:tf-gke-somaz-sp-dev-gke-tz9q@somaz-sp-dev.iam.gserviceaccount.com --role roles/artifactregistry.reader

gcloud projects get-iam-policy somaz-hp --flatten="bindings[].members" --format='table(bindings.role,bindings.members)' | grep 'roles/artifactregistry.reader'
roles/artifactregistry.reader              serviceAccount:tf-gke-somaz-sp-dev-gke-tz9q@somaz-sp-dev.iam.gserviceaccount.com

 

 


Reference

https://cloud.google.com/vpc/docs/shared-vpc?hl=ko 

https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-shared-vpc?hl=ko 

 

728x90
반응형