GCP

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

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

 

Overview

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

GKE 아키텍처 예시

 

 

 

 

📅 관련 글

2023.04.06 - [GCP] - GCP란? - 서비스 계정 & Project 생성 / SDK(gcloud) 설치

2023.04.06 - [GCP] - GCP IAM이란?

2023.04.12 - [GCP] - GCP - SDK(gcloud) 계정 2개 등록하기

2023.05.05 - [GCP] - GCP vs AWS 리소스 비교

2023.05.19 - [GCP] - GCP BigQuery란? & Data Warehouse

2023.09.23 - [GCP] - BigQuery와 DataFlow를 활용한 Data ETL(GCP)

2023.10.03 - [GCP] - Shared VPC를 사용하여 GKE 클러스터 생성시 IAM 설정

2023.12.18 - [GCP] - GCP를 활용한 데이터 자동화(MongoDB, CloudSQL, GA, Dune)

2024.01.20 - [GCP] - Terraform 으로 GCS 생성후 Cloud CDN 생성(GCP)

2024.03.04 - [GCP] - GCP에서 딥러닝을 위한 GPU VM 서버 만들기(GCP)

2024.04.24 - [Migration] - AWS에서 GCP로 마이그레이션하는 방법 및 고려사항

 

 

 

 

 


 

 

공유 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

 

 

 

 

 


 

 

 

 

마무리

공유 VPC를 활용한 GKE 클러스터 구축은 네트워크 리소스를 중앙에서 효율적으로 관리하면서도, 서비스 프로젝트별로 독립적인 리소스 운영이 가능하도록 설계할 수 있는 강력한 방법이다.

 

이번 글에서는 공유 VPC의 개념부터 GKE 클러스터 설정을 위한 IAM 역할 부여, Terraform을 통한 자동화까지 주요 단계를 다뤘다. 이를 통해 보다 보안성이 강화된 네트워크 환경을 구축하고, 조직 내 여러 프로젝트가 원활하게 협업할 수 있도록 지원할 수 있다.

 

공유 VPC를 활용하면 네트워크 관리 복잡도를 줄이고, 중앙에서 보안 및 트래픽을 제어할 수 있는 장점이 있는 만큼,

GCP 환경에서 효율적인 클러스터 운영을 고려하는 조직이라면 적극적으로 도입을 검토할 필요가 있다.

 

 

 

 

 

 


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
반응형