Programming/IaC

[IaC] GKE configuration deep dive

Hayley Shim 2023. 10. 28. 17:53

안녕하세요, 테라폼 스터디를 마무리하며 이전에 작성한 [gcp] GKE Implementation & CLI Configuration , [IaC] GKE configuration 글을 참고하여 테라폼으로 GCP GKE 설정하는 방법에 대해 보다 자세히 설명합니다.

우선, HashiCorp의 GKE guide에 따라 GKE에 대해 설명하겠습니다. Google Kubernetes Engine (GKE) 는 Google Cloud 상에서 컨테이너화된 애플리케이션을 배포,관리, 스케일링 하기 위한 매니지드 쿠버네티스 서비스입니다.

사전 작업

VPC-native Clusters

GKE에서는 한 Pod에서 다른 Pod로 트래픽을 라우팅하는 방법에 따라 클러스터를 구분할 수 있습니다.

  • VPC 기반(VPC-native) 클러스터 : 별칭 IP 주소 범위(alias IP ranges)를 사용하는 클러스터
  • 내부 IP 주소의 범위를 가상 머신(VM)의 네트워크 인터페이스에 별칭으로 할당할 수 있습니다.
  • 한 VM에서 여러 서비스를 실행하는 경우에는 각각에 서로 다른 내부 IP 주소를 할당할 수 있습니다.
  # Configuration of cluster IP allocation for VPC-native clusters.
  # Adding this block enables IP aliasing, making the cluster VPC-native instead of routes-based.
  ip_allocation_policy {
    # cluster_ipv4_cidr_block  = "240.0.0.0/18"
    # services_ipv4_cidr_block = "240.1.0.0/18"
    cluster_secondary_range_name = "gke-pod"
    services_secondary_range_name = "gke-service"
  }
  • 모든 서브넷에는 해당 서브넷을 정의하는 내부 IP 주소 범위인 기본 CIDR(primary CIDR) 범위가 있습니다. 각 VM 인스턴스는 이 범위에서 기본 내부 IP 주소를 가져옵니다. 기본 범위의 별칭 IP 범위를 할당할 수도 있고, 서브넷에 보조 범위(secondary range)를 추가하여 이 보조 범위에서 별칭 IP 범위를 할당할 수도 있습니다.

기본 및 보조 CIDR 범위와 VM 별칭 IP 범위

  • 기본 CIDR 범위 10.1.0.0/16은 서브넷의 일부로 구성됨
  • 보조 CIDR 범위 10.2.0.0/20은 서브넷의 일부로 구성됨
  • VM 기본 IP 10.1.0.2는 기본 CIDR 범위 10.1.0.0/16에서 할당되고, 별칭 IP 범위 10.2.1.0/24는 보조 CIDR 범위 10.2.0.0/20에서 VM에 할당됨
  • 별칭 IP 범위의 주소는 VM에 호스팅되는 컨테이너의 IP 주소로 사용됨

VPC-native Clusters의 이점

  • 포드 IP 주소는 기본적으로 연결된 클러스터의 VPC 네트워크와 기타 VPC 네트워크 내에서 VPC 네트워크 피어링을 통해 라우팅됩니다.
  • 포드 IP 주소는 클러스터에서 포드가 생성되기 전에 VPC 네트워크에서 예약되어 있습니다. 이를 통해 VPC 네트워크의 다른 리소스와의 충돌을 방지하고 IP 주소 할당을 보다 효율적으로 계획할 수 있습니다.
  • 포드 IP 주소 범위는 커스텀 정적 경로에 의존하지 않으며, 시스템 생성 및 커스텀 정적 경로 할당량을 소비하지 않습니다. 대신 자동 생성된 서브넷 경로가 VPC 기반 클러스터의 라우팅을 처리합니다.
  • 클러스터 노드의 IP 주소 대신 포드 IP 주소 범위에만 적용되는 방화벽 규칙을 만들 수 있습니다.
  • 일반적으로 포드 IP 주소 범위와 서브넷 보조 IP 주소 범위는 Cloud Router를 사용하여 Cloud VPN 또는 Cloud Interconnect와 연결된 온프레미스 네트워크에서 액세스할 수 있습니다.
  • 네트워크 엔드포인트 그룹(NEG)과 같은 일부 기능은 VPC 기반 클러스터에서만 작동합니다.

기본 클러스터 네트워크 모드

VPC 네이티브는 GKE 버전 1.21.0-gke.1500 이상의 모든 클러스터에 대한 기본 네트워크 모드입니다.

기본 클러스터 네트워크 모드

VPC 기반 클러스터의 IP 주소 범위

  • 모든 노드 IP 주소에 서브넷의 기본 IP 주소 범위를 사용합니다.
  • 모든 포드 IP 주소에 보조 IP 범위 한 개를 사용합니다.
  • 모든 서비스(클러스터 IP) 주소에 다른 보조 IP 주소 범위를 사용합니다.

VPC 기반 클러스터의 IP 주소 범위

*기본 IP 주소 범위와 보조 IP 주소 범위가 겹치는 서브넷을 만들 수 없습니다.

이외에도 VPC 네트워크의 커스텀 정적 경로를 사용하는 경로 기반 클러스터가 있습니다.

ip_allocation_policy블록을 지정하거나 기존 서브넷에서 보조 범위를 사용하여 VPC 기반 클러스터를 생성하는 것이 좋습니다 .

 

Node Pool Management

테라폼에서 google_container_cluster resource와 별개로 google_container_node_pool resource를 사용하여 node pool을 관리하는 것을 추천합니다. 이는 네트워킹 및 Kubernetes 기능과 같은 클러스터 수준 구성을 노드 구성에서 분리합니다. 또한 클러스터가 실수로 삭제되지 않도록 하는 데 도움이 됩니다.

아래는 일반적으로 google_container_cluster 리소스에서 node 설정을 하는 예시입니다.

 

아래는 google_container_cluster 와 google_container_node_pool 리소스에 대해 다양한 argument를 사용한 예에 대해 설명합니다.

 

Argument Reference

  • name : 프로젝트 및 location 내에서 고유한 클러스터의 이름
  • location - 클러스터 마스터가 생성될 위치(region 또는 zone) 및 기본 노드 위치. zone(예: us-central1-a)을 지정하면 클러스터는 단일 클러스터 마스터가 있는 영역 클러스터가 됨. region(예: us-west1)을 지정하면 클러스터는 리전의 여러 영역에 분산된 여러 마스터와 해당 영역의 기본 노드 위치가 있는 리전 클러스터가 됨
  • remove_default_node_pool - true인 경우, 클러스터 생성 시 기본 노드 풀을 삭제. default node pool 없이 google_container_node_pool 리소스를 사용하는 경우, initial_node_count  1이상으로 설정하는 것과 함께 true 로 설정해야 함.
  • default_max_pods_per_node - 이 클러스터의 노드당 기본 최대 Pod 수. IP 별칭이 활성화되지 않은 클러스터인 “경로 기반” 클러스터에서는 작동하지 않음
  • initial_node_count - 이 클러스터의 기본 노드 풀에서 생성할 노드 수. 리전 또는 다중 영역 클러스터에서 이는 zone당 노드 수. node_pool 이 설정되지 않은 경우 설정해야 함. default node pool이 없는 google_container_node_pool 개체를 사용하는 경우, remove_default_node_pool  true 로 설정하는 것과 함께 이 값을 1 이상으로 설정해야 함
  • min_master_version - 마스터의 최소 버전. GKE는 마스터를 새 버전으로 자동 업데이트하므로 현재 마스터 버전을 보장하지 않음. 설정하지 않으면, GKE에서 클러스터 버전을 최신 공식 출시 버전(반드시 최신 버전일 필요는 없음)으로 설정.
  • networking_mode - 클러스터의 포드 IP에 별칭 IP 또는 경로를 사용할지 여부를 결정. 옵션은 VPC_NATIVE or ROUTES. VPC_NATIVE IP 별칭을 활성화하고, ip_allocation_policy block 을 정의해야 함. 기본적으로, 이 필드가 지정되지 않고 ip_allocation_policy 블록이 설정되지 않은 경우 GKE ROUTES-based cluster 를 생성해야 함
  • release_channel - GKE 클러스터의 자동 업그레이드를 더 세부적으로 제어할 수 있는 출시 채널 기능의 구성 옵션
  • ip_allocation_policy - VPC 기반 클러스터에 대한 클러스터 IP 할당 구성. 이 블록을 추가하면 IP 별칭이 활성화되어 클러스터가 경로 기반이 아닌 VPC 기반이 됨
  • private_cluster_config - 비공개 클러스터, 비공개 노드가 있는 클러스터에 대한 구성
  • network_policy : enabled - (필수) 클러스터에서 네트워크 정책이 활성화되었는지 여부
  • authenticator_groups_config -(선택사항) Google Groups for GKE 기능에 대한 구성
  • master_auth :client_certificate_config - (필수) 이 클러스터에 대해 클라이언트 인증서 승인이 활성화되었는지 여부
  • addons_config - (선택사항) GKE에서 지원하는 부가기능 구성
 

참고

hashicorp : Using GKE with Terraform

hashicorp : google_container_cluster

GCP docs : VPC 기반 클러스터 만들기

GKE code example : Google Kubernetes Engine (GKE) Module

프로덕션을 위한 Google Kubernetes Engine 환경 준비

GCP docs : GKE 개요

 

GKE 개요  |  Google Kubernetes Engine(GKE)  |  Google Cloud

GKE의 이점을 알아봅니다.

cloud.google.com

 

 

blog migration project

written in 2022.12.11

https://medium.com/techblog-hayleyshim/iac-gke-configuration-deep-dive-c6a4e9b786c6