본문으로 건너뛰기
1.3 학습 환경 구성

1.3 학습 환경 구성

이 노트의 실습은 로컬 머신 위에 만드는 일회용 클러스터로 진행한다. 필요한 것은 세 가지다. 클러스터에 명령을 보내는 kubectl, 컨테이너를 실행할 Docker, 그리고 Docker 컨테이너를 노드 삼아 클러스터를 만들어 주는 kind다. 이 조합은 만들고 지우는 비용이 작아서, 실습 중에 클러스터 상태가 이상해지면 원인 추적에 매달리는 대신 지우고 다시 만들면 된다.

kubectl 설치와 kubeconfig 구조

kubectl은 API 서버를 호출하는 공식 CLI다.

# macOS
brew install kubectl

# Linux (x86_64)
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

kubectl이 어느 클러스터에 어떤 신원으로 접속할지는 kubeconfig 파일(기본 위치 ~/.kube/config)이 결정한다. 파일 안에는 세 종류의 목록이 있다. clusters는 API 서버 주소와 CA 인증서를, users는 클라이언트 인증서나 토큰 같은 인증 수단을, contexts는 cluster 하나와 user 하나(그리고 기본 namespace)를 묶은 조합을 담는다. kubectl은 언제나 current-context가 가리키는 context 하나를 통해 동작한다.

    flowchart TD
  CUR["current-context"] --> CTX["context"]
  CTX --> CL["cluster<br/>API 서버 주소 + CA"]
  CTX --> US["user<br/>인증 수단"]
  CTX --> NS["기본 namespace"]
  

클러스터를 여러 개 다룰 때도 접속 정보를 매번 지정하지 않고 context만 전환하면 된다.

kubectl config get-contexts                            # 등록된 context 목록
kubectl config use-context kind-lab                    # context 전환
kubectl config set-context --current --namespace=dev   # 현재 context의 기본 namespace 변경

kind로 멀티 노드 클러스터 만들기

kind(Kubernetes in Docker)는 Docker 컨테이너 하나를 노드 하나로 삼아 클러스터를 구성한다. 기본값은 단일 노드지만, 이 노트에서는 스케줄링과 노드 관리 실습을 위해 처음부터 control-plane 하나에 worker 둘을 붙인 3노드 구성으로 만든다.

kind 설치

# macOS
brew install kind

Linux는 릴리스 페이지(https://github.com/kubernetes-sigs/kind/releases)의 바이너리를 내려받아 실행 권한을 주고 PATH에 두면 된다.

config 파일 작성

노드 구성을 파일로 선언한다.

# kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
  - role: worker
  - role: worker

클러스터 생성

kind create cluster --name lab --config kind-config.yaml
Creating cluster "lab" ...
 ✓ Ensuring node image (kindest/node:v1.33.1)
 ✓ Preparing nodes
 ✓ Writing configuration
 ✓ Starting control-plane
 ✓ Installing CNI
 ✓ Installing StorageClass
 ✓ Joining worker nodes
Set kubectl context to "kind-lab"

생성이 끝나면 kind가 kubeconfig에 kind-lab이라는 context를 등록하고 current-context로 지정한다. 위에서 본 cluster, user, context 삼각형이 자동으로 채워지는 셈이다.

노드 확인

kubectl get nodes
NAME                STATUS   ROLES           AGE    VERSION
lab-control-plane   Ready    control-plane   2m1s   v1.33.1
lab-worker          Ready    <none>          98s    v1.33.1
lab-worker2         Ready    <none>          98s    v1.33.1

세 노드가 모두 Ready면 준비가 끝났다.

kind의 노드는 실제 서버가 아니라 Docker 컨테이너다. 노드 안을 들여다보려면 SSH 대신 docker exec -it lab-worker bash를 실행한다. 노드 장애 실습도 docker stop lab-worker로 재현할 수 있다.

minikube와의 비교

로컬 클러스터 도구로는 minikube도 널리 쓰인다.

항목kindminikube
노드 형태Docker 컨테이너VM 또는 컨테이너 (드라이버 선택)
멀티 노드config 파일로 선언--nodes 플래그
addon 관리없음 (직접 설치)minikube addons 내장
LoadBalancer별도 구성 필요minikube tunnel 내장

minikube는 대시보드와 addon이 내장돼 있어 처음 접하는 사람에게 편의 기능이 많고, kind는 클러스터 구성이 파일 하나로 선언되고 생성과 삭제가 빨라 반복 실습과 CI에 알맞다. 이 노트는 멀티 노드 선언이 간단한 kind를 기준으로 진행하지만, 실습 대부분은 어느 쪽에서든 그대로 동작한다.

자동완성과 alias, 재생성

kubectl 명령은 길고 리소스 이름에는 임의 문자열이 붙으므로 셸 자동완성을 켜 두는 편이 좋다.

# zsh (~/.zshrc)
source <(kubectl completion zsh)
alias k=kubectl          # zsh는 alias에도 자동완성이 그대로 적용된다

# bash (~/.bashrc)
source <(kubectl completion bash)
alias k=kubectl
complete -o default -F __start_kubectl k

환경을 지우고 다시 만드는 명령은 다음과 같다.

kind delete cluster --name lab                               # 삭제
kind create cluster --name lab --config kind-config.yaml     # 재생성

학습용 클러스터는 소모품으로 취급한다. 이상해진 클러스터의 원인을 끝까지 추적하는 것도 공부지만, 초반에는 재생성이 시간을 아낀다. config 파일이 남아 있는 한 같은 구성이 몇 분 안에 다시 나오고, 그 위에서 실습을 처음부터 재현하는 습관은 이후 매니페스트를 파일로 관리하는 선언형 운영 감각과도 이어진다.