본문 바로가기

컴퓨터/클라우드

[GCP Associate Cloud Engineer] Google Kubernetes Engine(GKE)

Google Kubernetes Engine(GKE)

GCP에서 제공하는 관리형 Kubernetes 서비스로, 컨테이너 오케스트레이션을 단순화하고 효율적으로 실행할 수 있도록 돕는다. 

관리형 서비스이기 때문에 클러스터의 운영 및 관리를 자동화해 사용자의 부담을 줄인다.

 

GKE의 주요 특징

 

 - 자동 복구(Auto-repair): 노드가 장애를 일으키면 자동으로 복구.

 - 자동 업그레이드(Auto-upgrade): 클러스터를 항상 최신 Kubernetes 버전으로 자동 업그레이드.

 - Pod 자동 확장(Pod Auto-scaling): 특정 마이크로서비스의 Pod 수를 자동으로 증가/감소.

 - 클러스터 자동 확장(Cluster Auto-scaling): 클러스터 내 노드(Node) 수를 자동으로 증가/감소하여 여러 마이크로서비스가 클러스터에서 실행될 때 리소스 수요에 따라 노드 추가.

 - Cloud Logging 및 Monitoring 통합: GKE는 Cloud Logging과 Cloud Monitoring을 쉽게 활성화할 수 있어 Kubernetes 클러스터와 애플리케이션 로그 및 메트릭을 한눈에 확인 가능.

 - Container Optimized OS: Google이 개발한 컨테이너 최적화 운영체제로 보안 강화 및 컨테이너 실행에 최적화된 환경 제공.

 - 스토리지 옵션: Persistent Disk 및 Local SSD를 클러스터 노드에 부착하여 데이터 영속성 및 고성능 로컬 스토리지 제공.

 

GKE 사용 예시

 

다중 마이크로서비스 관리: 다양한 마이크로서비스를 클러스터에 배포 및 운영.

자동 확장 활용: 트래픽 급증에 따른 리소스 자동 조정.

로그 및 모니터링: 애플리케이션 상태 및 성능을 실시간으로 모니터링.

무중단 배포: 업데이트 및 배포 중 서비스 중단 방지.

Kubernetes 클러스터를 생성

Kubernetes Engine을 사용하기 전에, Kubernetes Engine API를 활성화해야 한다.

그 후 Kubernetes Engine으로 이동하여 클러스터를 생성한다.

클러스터 생성할 때 모드를 정할 수 있는데 기본적으로 Autopilot으로 설정되어있고 사용자가 원하면 Standard로 전환이 가능하다.

Standard 모드: 사용자가 클러스터와 노드를 직접 관리.

Standard모드로 전환

Autopilot 모드: GKE가 클러스터와 노드 관리를 완전히 자동화.

Autopilot은 운영 비용을 줄이고 관리 부담을 최소화하기 위한 옵션이다.

 

클러스터 생성후 연결을 하려면 gcloud를 통해 아래와 같이 연결하면 된다.

 

kubernetes 클러스터에 연결

그리고 연결된 클러스터에서 애플리케이션을 배포하기 위해서 kubectl을 사용해서 아래와 같은 명령어를 입력하면 된다.

kubectl create deployment hello-world-rest-api --image=in28min/hello-world-rest-api:0.0.1.RELEASE

클러스터에 배포

 

kubectl Kubernetes CLI도구로 Kubernetes 클러스터와 상호작용하기 위해 사용

create deployment 새로운 Deployment를 생성

hello-world-rest-api 생성될 Deployment의 이름

--image=in28min/hello-world-rest-api:0.0.1.RELEASE Deployment에서 사용할 컨테이너 이미지 지정

in28min/hello-world-rest-api: Docker 이미지의 이름으로 in28min은 Docker Hub의 사용자 이름 또는 리포지토리 이름

:0.0.1.RELEASE: 이미지 태그로 특정 버전의 이미지를 지정

 

#  Deployment 확인
kubectl get deployment

현재 클러스터 내에 존재하는 Deployment 목록을 확인

 

Deployment를 외부에 노출

# hello-world-rest-api Deployment를 외부 네트워크에 노출
kubectl expose deployment hello-world-rest-api --type=LoadBalancer --port=8080

 

 

--type=LoadBalancer GCP에서 외부 IP 주소를 생성해 트래픽을 라우팅

--port=8080 클라이언트가 접속할 포트를 지정

# 생성된 서비스(Service) 목록과 외부 IP를 확인
kubectl get services

# 서비스의 상태 변화를 실시간으로 관찰
kubectl get services --watch

 

실행 확인

그 후 IP주소를 통해서 서비스의 외부 IP와 포트를 사용해 애플리케이션이 정상적으로 작동하는지 확인할 수 있다.

curl 35.184.204.214:8080/hello-world

 

 

웹 IP 연결 화면

Deployment 확장

kubectl scale deployment hello-world-rest-api --replicas=3

Deployment를 3개의 복제본으로 확장하여 Pod가 3개 생성되어 트래픽을 분산 처리한다.

Deployment 확장

만약 한도를 넘어서 인스턴스를 생성하고 싶으면 클러스터의 스케일을 확장해야한다.

# 클러스터 스케일 확장
gcloud container clusters resize my-cluster --node-pool default-pool --num-nodes=2 --zone=us-central1-c

GKE 클러스터의 노드 풀을 2개의 노드로 확장하고, Deployment가 확장된 만큼 실행할 수 있는 인프라를 확보한다.

 

오토스케일링 설정

kubectl autoscale deployment hello-world-rest-api --max=4 --cpu-percent=70

# HPA의 상태 확인
kubectl get hpa

Horizontal Pod Autoscaler(HPA)를 설정하여 CPU 사용률이 70%를 넘을 경우 최대 4개의 Pod까지 자동으로 확장

설정 확인

 

ConfigMap 생성 및 확인

kubectl create configmap hello-world-config --from-literal=RDS_DB_NAME=todos

# Configmap 목록 확인
kubectl get configmap

# Configmap 세부정보 확인
kubectl describe configmap hello-world-config

ConfigMap을 생성하여 환경 변수를 저장

RDS_DB_NAME=todos 환경 변수를 생성

 

configmap 확인

 

Secret 생성 및 확인

kubectl create secret generic hello-world-secrets-1 --from-literal=RDS_PASSWORD=dummytodos

# Secret 목록 확인
kubectl get secret

#Secret 세부정보 확인
kubectl describe secret hello-world-secrets-1

Secret을 생성하여 민감한 데이터를 안전하게 저장한다.

여기서는 RDS_PASSWORD=dummytodos를 저장

 

Secret 확인

 

클러스터

 

클러스터는 애플리케이션을 실행하는 환경으로 쿠버네티스에서 애플리케이션을 배포하려면 먼저 클러스터를 생성해야 한다.

클러스터는 컴퓨트 엔진 인스턴스의 그룹으로 구성되어 있다.

 

마스터 노드

 

API 서버

클러스터 내외부의 모든 통신을 관리하는 곳으로 사용자가 kubectl 명령어를 실행하면, 요청은 API 서버로 전달된다.

 

스케줄러(Scheduler)

워커 노드 중에서 어떤 노드에 작업을 배치할지 결정한다.

예를 들어, 10개의 워커 노드 중 3개의 파드를 배포하려면 스케줄러가 이를 결정한다.

 

컨트롤 매니저(Control Manager)

배포 및 ReplicaSet을 관리한다.

파드가 비정상일 경우 이를 대체하거나 복구한다.

 

ETCD

클러스터의 상태를 저장하는 분산 데이터베이스이다.

고가용성을 제공하기 위해 사용된다.

 

워커 노드

 

워커 노드는 파드가 실제로 실행되는 곳이다.

 

쿠블릿(Kubelet)

마스터 노드와 통신하며 작업을 수행한다.

 

컨테이너 런타임

파드를 실행하기 위한 컨테이너 엔진(Docker 등)을 제공한다.

 

클러스터의 유형

 

Zonal 클러스터

하나의 단일 존에서만 실행되는 것으로 마스터 노드와 워커 노드가 모두 같은 존에 위치한다.

멀티존도 가능한데, 이 경우 마스터 노드는 단일 존에 있으나 워커 노드는 여러 존에 배포된다.

 

Regional 클러스터

하나의 리전 내 여러 존에 마스터 노드 복제본이 배포된다.

고가용성을 위해 마스터 노드가 여러 존에 배치된다. 이를 통해 마스터 노드의 장애로 인해 클러스터 전체가 중단되는 것을 방지한다.

 

Private 클러스터

가상 사설 네트워크 내부에서 실행되는 클러스터이다.

외부 인터넷에 직접 노출되지 않고, 내부 네트워크를 통해 관리된다.

 

Alpha 클러스터

쿠버네티스의 알파 API를 테스트하기 위한 클러스터이다.

새롭게 추가된 쿠버네티스 기능을 실험적으로 테스트할 때 사용된다.

 

Pod 세부 정보 확인

kubectl get pods -o wide

현재 실행 중인 Pod와 IP 주소, 배치된 노드 등의 세부 정보를 확인

pod 확인

 

이미지 업데이트

kubectl set image deployment hello-world-rest-api hello-world-rest-api=in28min/hello-world-rest-api:0.0.2.RELEASE

Deployment에서 실행 중인 컨테이너의 이미지를 새 버전(0.0.2.RELEASE)으로 업데이트

이미지 업데이트

 

 

 

삭제

# 프로젝트 및 리소스 삭제
gcloud projects list

# Service 삭제
kubectl delete service hello-world-rest-api

# Deploymeny 삭제
kubectl delete deployment hello-world-rest-api

# 클러스터 삭제
gcloud container clusters delete my-cluster --zone us-central1-c