배경
서비스를 컨테이너로 배포하면 격리된 환경에서 어느 한 기술에 종속되지 않아 서비스를 최적화할 수 있고, 쿠버네티스를 사용하면 이러한 컨테이너들에 대한 관리(장애 복구 등)가 편리해지기 때문에, GCP(Google Cloud Platform)의 GKE(Google Kubernetes Engine)를 사용해 구축하기로 했습니다.
근데 막상 클러스터를 만들려 하니 쿠버네티스를 잘 모를 뿐더러 생소한 옵션과 기능들이 즐비해 있어서 한 번 정리해두면 나중에 도움이 될 것 같아 글을 작성하게 되었습니다.
목적
- GKE에 대해 알아본다.
- GKE 클러스터(Standard) 생성과 단계들에 대해 알아본다.
GKE?
GKE는 GCP에서 제공하는 서비스 중 하나이며, 쿠버네티스 환경을 빠르게 구축하고 쉽게 관리할 수 있도록 도와주는 관리형 쿠버네티스 서비스입니다. VM 인스턴스를 여러 개 만들어서 Control Plane/Worker Node를 직접 구성할 수도 있겠지만, GKE를 사용하면 모니터링 가시화라든지 콘솔을 통해 쉽게 관리하고 관리 받을 수 있는 장점이 있습니다. 대신 비용에 관리비($73/월)가 추가되는 단점이 있습니다. GKE 클러스터 아키텍쳐는 아래와 같습니다.
GCP 유저는 GCP 쉘을 통해 클러스터에 액세스할 수 있습니다.
클러스터어 접근하는 방법은 '클러스터 메뉴 > 생성한 클러스터를 클릭'하면 상단에 보이는 연결 버튼에서 알려주는 명령 줄을 복사해 GCP 쉘에 붙여넣으면 됩니다.
GKE에서 클러스터를 생성하면 기본적으로 Zonal/Regional 타입에 따라 Control Plane 생성되며, 서비스 노드 사이에는 표시되지 않습니다. Zonal과 Regional에 대한 건 클러스터 생성 단계에서 알아보겠습니다.
GKE 비용
클러스터 종류는 Autopilot과 Standard 모드가 있는데, 이 모드에 따라 가격 책정도 다릅니다.
Autopilot 모드는 시간당 $0.10의 고정 비용과 pod의 실제 리소스(CPU/RAM/Storage) 사용량에 대해서만 비용이 청구되는 반면, Standard 모드는 시간당 $0.10의 고정 비용과 VM 인스턴스에 대해 요금이 청구되며 리소스를 사용하든 하지 않든 유지에 대한 고정적 비용이 청구됩니다. 즉, Autopilot 모드는 pod가 실제 사용한 리소스만 청구되기 때문에 비교적 더 저렴하다는 걸 알 수 있습니다.
https://cloud.google.com/kubernetes-engine/pricing?hl=ko%EF%BB%BF#standard_mode
서버 구성에 따라 구글 클라우드 서비스의 비용을 계산해주는 계산기도 참고하면 좋습니다.
https://cloud.google.com/products/calculator?hl=ko
GKE 클러스터 생성
새 클러스터를 만들기 위해 'GCP 메뉴 > Kubernetes Engine > 클러스터'로 이동
상단의 만들기 버튼을 클릭합니다.
만들기 버튼을 누르면 아래와 같이 Autopilot/Standard 모드를 선택하라는 모달이 나타납니다.
아래와 같은 비교 창을 보려면 우측 하단의 "비교" 버튼을 누르면 됩니다.
Autopilot 모드는 노드, 확장, 보안 등을 사전 구성된 설정을 바탕으로 구글이 클러스터를 관리해주는 작업 모드이고, 앞서 살펴봤듯이 비용면에서 더 저렴합니다. Standard 모드는 이러한 구성을 직접 세팅해야 하지만 클러스터를 좀 더 유연하게 관리할 수 있다는 장점이 있습니다. 하지만 Autopilot 모드에서도 자동 구성된 내용을 직접 수정할 수 있기 때문에 유연성이 나쁘지는 않다고 생각합니다.
이 글에선, 좀 더 자세한 옵션들을 살펴볼 수 있는 Standard 모드의 단계를 살펴보겠습니다.
1. 클러스터 기본사항
클러스터의 기본사항을 설정할 수 있는 단계입니다.
위치 유형
Control Plane의 위치를 설정합니다.
클러스터를 생성한 후엔 수정할 수 없습니다.
- 영역(Zonal): 1개의 Zone에 1개의 Control Plane이 존재하는 형태입니다. Control Plane이 하나이므로 Control Plane의 고가용성을 보장하지 않습니다.
- 리전(Regional): 여러 개의 Zone에 Control Plane이 존재하는 형태입니다. Control Plane의 고가용성(한 Control Plane이 문제가 생기면 대체 등)을 보장하지만 비용이 증가합니다.
제어 영역 버전
- 정적 버전: 호환성 이유로 쿠버네티스 특정 버전으로 설치가 필요한 경우 선택, 수동 업그레이드 가능
- 출시 채널: 구글이 자동으로 쿠버네티스를 업그레이드 하도록 설정(보안 상 자동 업그레이드를 권장)
2. 노드 풀
노드 그룹을 설정하는 단계입니다.
노드 풀 세부 정보
노드 풀의 기본 사항을 설정하는 단계입니다.
압축 배치
GKE 클러스터의 노드 또는 워크로드가 영역 내에서 물리적으로 서로 더 가깝게 배치되도록 설정합니다.
설정하려면 노드의 머신 유형 e2-standard-4 이상이 필요합니다.
클러스터 자동 확장 처리 사용 설정
워크로드 사용이 증가하면 노드를 자동으로 늘려주는 오토 스케일링 사용 여부를 설정합니다.
노드 위치 지정
노드의 영역을 직접 지정할지 설정합니다. 지정하지 않으면 노드의 영역이 자동으로 배치됩니다.
자동화
노드를 자동 업그레이드 해서 최신 상태로 유지할지 설정합니다.
노드 풀 업그레이드 전략
- 일시 급증 업그레이드: 노드의 쿠버네티스 버전이 업그레이드되면, 노드를 몇 개까지 더 늘리고 줄일 수 있는지를 설정합니다. 최대 일시 급증 개수가 1이라는 말은 업그레이드 도중 추가로 1개의 노드를 더 생성할 수 있다는 뜻입니다. 최대 사용 불가가 0이라는 말은 노드 업그레이드 도중 사용할 수 없는 최대 노드 수가 0개라는 뜻입니다.
- 블루 그린 업그레이드: 노드 업그레이드 시 무중단 배포 전략인 블루/그린 방식을 사용하지만, 비용이 증가합니다.
노드/네트워킹/보안/메타데이터
노드의 하드웨어 스펙 등 상세 설정을 합니다. 노드 풀에 노드가 추가되면, 이러한 설정이 적용되어 추가됩니다.
가장 저렴하면서 쿠버네티스를 감당할 수 있는 사양은 1 CPU/1.7GB Memory/32GB Disk입니다.
3. 자동화
유지보수 정책
GKE가 자동으로 클러스터 업그레이드를 진행할 시간을 지정할 수 있습니다.
자동 확장
- 수직형 포드 자동 확장 사용 설정: 수직형 포드 자동 확장이란 말은 포드의 CPU/메모리에 대한 리소스를 자동 확장하는 기능입니다. 반대로 수평형 포드 자동 확장이 있는데, 이는 포드의 수를 자동으로 확장해주는 기능입니다.
- 노드 자동 프로비저닝 사용 설정: 워크로드 니즈에 따라 노드 풀을 자동으로 생성/삭제하여 노드 풀을 관리해주는 설정입니다.
4. 네트워킹
클러스터 내 구성요소들이 서로 통신하는 방식과 클라이언트와 애플리케이션이 통신하는 방식을 설정합니다.
IPv4 네트워크 액세스
클러스터 보안 강화를 위해 꼭 필요한 경우를 제외하고는 In/Out 바운드 연결을 제한하는 것이 좋습니다.
- 공개 클러스터: 외부에서 워크로드로의 액세스를 허용합니다.
- 비공개 클러스터: 외부에서 워크로드로의 액세스를 차단하고, 노드들이 내부 IP 주소만 가지게 되어 외부 인터넷으로부터 격리됩니다. 노드들이 외부 인터넷에 접근이 필요하다면 Cloud NAT를 통해 외부 인터넷으로 통신이 가능하며, 외부에서 접속이 필요한 경우 LoadBalancer 타입의 서비스를 통해 접속이 가능합니다.
- 제어 영역 IP 범위: Control Plane과 노드 간 내부 통신을 위해 할당할 내부 CIDR(ex. 192.168.0.0/28)
Dataplane V2 사용 설정
데이터 플레인은 워커 노드로서 kubelet, kube-proxy를 사용해 API 서버와 노드 간 연결과 IP 변환, 라우팅 관리를 해주는 구성 요소입니다. 이를 사용하면 네트워크 보안, 확장성 향상을 기대할 수 있고, 향후 출시 버전에 기본적으로 사용 설정될 예정입니다.
5. 기능
Cloud Run for Anthos 사용 설정
Cloud Run for Anthos란 GKE 환경에서 동작하는 Cloud Run이며, Cloud Run은 컨테이너식 애플리케이션의 배포를 위한 서버리스 플랫폼입니다. 즉, 개발자의 생산성 향상을 위한 옵션이지만, 사용하려면 노드의 머신 유형 중 n1-standard-2 스펙 이상이 필요하기 때문에 비용이 더 발생하게 됩니다.
GKE 사용량 측정 사용 설정
클러스터 워크로드의 리소스 요청 및 실제 리소스 사용량에 대한 정보를 추적할 수 있게 해줍니다. 구체적으로는 CPU, GPU, TPU, 메모리, 스토리지, 선택적으로 네트워크 이그레스에 대한 정보를 추적할 수 있습니다. 데이터는 BigQuery에 저장되며 직접 쿼리해 확인할 수 있습니다.
Cloud Shell에서 명령어로 생성
아래는 비공개 클러스터를 만드는 예시입니다.
# 클러스터 전용 네트워크 생성
gcloud compute networks create {network-name} \
--subnet-mode custom
gcloud compute networks subnets create {subnet-name} \
--network {network-name} \
--region asia-northeast1 \
--range 10.2.204.0/22 \
--enable-private-ip-google-access
# 클러스터 생성
gcloud container clusters create "{cluster-name}" \
--zone "asia-northeast1-a" \
--cluster-version "latest" \
--machine-type "e2-micro" \
--disk-type "pd-standard" \
--disk-size "32" \
--scopes "https://www.googleapis.com/auth/compute","https://www.googleapis.com/auth/devstorage.read_only","https://www.googleapis.com/auth/logging.write","https://www.googleapis.com/auth/monitoring","https://www.googleapis.com/auth/servicecontrol","https://www.googleapis.com/auth/service.management.readonly","https://www.googleapis.com/auth/trace.append" \
--num-nodes "2" \
--enable-private-nodes \
--master-ipv4-cidr "172.16.0.0/28" \
--enable-ip-alias \
--network "projects/YOUR_PROJECT_ID/global/networks/{network-name}" \
--subnetwork "projects/YOUT_PROJECT_ID/regions/asia-northeast1/subnetworks/{subnet-name}" \
--max-nodes-per-pool "110" \
--no-enable-master-authorized-networks
--addons HorizontalPodAutoscaling,HttpLoadBalancing \
--enable-autoupgrade \
--enable-autorepair
관련 공식 문서는 아래 링크에서 참고해주세요.
https://cloud.google.com/sdk/gcloud/reference/container/clusters/create
SSH나 노드 외부 네트워크 연결 용으로 NAT 연결이 필요하다면 아래 링크를 참고해 주세요.
https://cloud.google.com/nat/docs/gke-example
마치며
이렇게 GKE와 GKE 클러스터 생성 단계 중 주요 기능에 대해 살펴봤습니다. 왜 구글이 Autopilot 모드를 새로 출시했는지 알 수 있을 만큼 클러스터 생성이 복잡하고 어려웠네요. 물론 CLI 환경에서 직접 설정하려면 더 복잡했겠지만요. 쿠버네티스와 더불어 GCP 공부도 열심히 해야겠다는 생각이 들었습니다.
'Container > Kubernetes' 카테고리의 다른 글
GKE http -> https 리디렉션 (0) | 2023.02.06 |
---|---|
[GKE] Ingress 구성 및 SSL 적용 (1) | 2023.01.21 |
GKE에서 PVC/PV 사용해보기 (1) | 2023.01.18 |
GKE에서 프런트/백엔드 (포드)통신 구조 만들기 (0) | 2023.01.16 |
GCP VM Instance에 Kubernetes 구축하기 (0) | 2023.01.03 |