Chapter 5

쿠버네티스 설치

  • 5.1 쿠버네티스 설치 환경의 종류
  • 5.2 Minikube로 로컬 환경 구축
  • 5.3 kubeadm으로 클러스터 구축
  • 5.4 kops로 AWS 클러스터 구축
  • 5.5 GKE로 관리형 클러스터 사용

도커 스웜이 도커의 내장 오케스트레이션이라면, **쿠버네티스(Kubernetes, K8s)**는 구글이 만들고 CNCF가 관리하는 업계 표준 컨테이너 오케스트레이션 플랫폼이야. 여기서부터 쿠버네티스 파트가 시작되는데, 먼저 설치 환경부터 잡아야 하거든.

쿠버네티스를 사용하는 방법은 크게 세 가지로 나뉘어. 로컬 개발 환경으로는 Minikube(로컬에 단일 노드 클러스터를 띄우는 방식), Docker Desktop 내장 K8s, kind(도커 컨테이너 안에 쿠버네티스 노드를 띄우는 방식)가 있어. 자체 구축(On-premise)은 kubeadm이라는 공식 설치 도구를 쓰고, 클라우드 관리형 서비스로는 GKE(구글), EKS(AWS), AKS(Azure)가 있지. kops라는 도구는 AWS에 쿠버네티스 클러스터를 자동으로 프로비저닝해주는 거야. 프로덕션이라면 관리형 서비스를 쓰는 게 압도적으로 편해 — 마스터 노드 관리를 클라우드가 알아서 해주니까. 학습 목적이라면 Minikube나 kubeadm으로 충분하고.

Minikube는 로컬에서 쿠버네티스를 가장 쉽게 시작하는 방법이야:

# 설치 (macOS)
brew install minikube

# 클러스터 시작
minikube start

# 상태 확인
minikube status

# 대시보드 열기
minikube dashboard

내부적으로 VM이나 도커 컨테이너를 이용해서 단일 노드 클러스터를 만들어. --driver 옵션으로 docker, virtualbox, hyperkit 등을 선택할 수 있지. minikube start를 하면 kubectl이 자동으로 Minikube 클러스터를 가리키도록 설정돼. 한계는 단일 노드라서 멀티 노드 환경의 스케줄링이나 노드 장애 복구 같은 건 테스트할 수 없다는 건데, 기본 개념을 익히기에는 충분해.

kubeadm은 실제 서버에 쿠버네티스를 설치하는 공식 도구야. 최소 2대의 서버(마스터 1 + 워커 1)가 필요하지. 모든 노드에서 사전 준비를 해야 해:

# 스왑 비활성화 (쿠버네티스는 스왑을 싫어한다)
sudo swapoff -a

# 컨테이너 런타임 설치 (containerd)
sudo apt install containerd

# kubeadm, kubelet, kubectl 설치
sudo apt install kubeadm kubelet kubectl

마스터 노드를 초기화하면:

sudo kubeadm init --pod-network-cidr=10.244.0.0/16

초기화가 완료되면 kubeconfig 설정 명령어와 워커 노드 조인 명령어가 출력돼. 여기서 중요한 건, 쿠버네티스는 네트워크 기능을 직접 구현하지 않고 CNI(Container Network Interface) 플러그인에 위임한다는 거야. Flannel, Calico, Weave 등이 있고, 하나를 골라서 설치해야 파드 간 통신이 가능해져:

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

워커 노드는 이렇게 조인하면 돼:

sudo kubeadm join 마스터IP:6443 --token xxx --discovery-token-ca-cert-hash sha256:yyy

kubeadm은 유연하지만, 마스터 노드의 고가용성(HA) 구성이나 인증서 관리 같은 운영 작업을 직접 해야 한다는 부담이 있어.

kops(Kubernetes Operations)는 AWS에 프로덕션 수준의 쿠버네티스 클러스터를 자동으로 만들어주는 도구야:

# S3 버킷 생성 (kops 상태 저장용)
aws s3 mb s3://my-kops-state

# 클러스터 생성
kops create cluster \
  --name=my-cluster.k8s.local \
  --state=s3://my-kops-state \
  --zones=ap-northeast-2a \
  --node-count=3 \
  --node-size=t3.medium \
  --master-size=t3.medium

# 실제 AWS 리소스 프로비저닝
kops update cluster --name my-cluster.k8s.local --yes

EC2 인스턴스, VPC, 보안 그룹, IAM 역할 등을 자동으로 생성해주고, kops delete cluster로 모든 AWS 리소스를 한 번에 정리할 수 있어서 테스트 후 비용을 절약할 수 있지. 다만 kops는 AWS에 특화된 도구라서, GCP나 Azure를 쓴다면 해당 클라우드의 관리형 서비스를 쓰는 게 나아.

GKE는 구글 클라우드의 관리형 쿠버네티스 서비스야. 마스터 노드를 구글이 관리해주니까, 사용자는 워커 노드와 워크로드에만 집중하면 돼:

# 클러스터 생성
gcloud container clusters create my-cluster \
  --zone=asia-northeast3-a \
  --num-nodes=3

# kubectl 연결
gcloud container clusters get-credentials my-cluster --zone=asia-northeast3-a

이러면 끝이야. kubeadm처럼 CNI 설치, 인증서 관리, 마스터 HA 구성 같은 걸 신경 쓸 필요가 없지. GKE는 자동 업그레이드, 자동 복구, 로깅/모니터링 통합 같은 기능도 기본 제공해. AWS의 EKS, Azure의 AKS도 비슷한 경험을 제공하고, 프로덕션에서 쿠버네티스를 운영할 거라면 관리형 서비스가 운영 부담을 크게 줄여줘.


정리

5장 읽고 기억할 거 세 가지:

  1. 학습용은 Minikube, 자체 구축은 kubeadm, 프로덕션은 관리형 서비스(GKE/EKS/AKS). 상황에 맞는 설치 방법을 선택하면 된다.
  2. kubeadm으로 설치하면 CNI 플러그인을 별도로 설치해야 한다. 쿠버네티스는 네트워크를 직접 구현하지 않고 플러그인에 위임.
  3. 관리형 서비스는 마스터 노드를 클라우드가 관리해준다. 인증서, HA, 업그레이드 같은 운영 부담이 대폭 줄어든다.