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/kubectlkubectl이 어느 클러스터에 어떤 신원으로 접속할지는 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 kindLinux는 릴리스 페이지(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.yamlCreating 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 nodesNAME 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면 준비가 끝났다.
docker exec -it lab-worker bash를 실행한다. 노드 장애 실습도 docker stop lab-worker로 재현할 수 있다.minikube와의 비교
로컬 클러스터 도구로는 minikube도 널리 쓰인다.
| 항목 | kind | minikube |
|---|---|---|
| 노드 형태 | 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 파일이 남아 있는 한 같은 구성이 몇 분 안에 다시 나오고, 그 위에서 실습을 처음부터 재현하는 습관은 이후 매니페스트를 파일로 관리하는 선언형 운영 감각과도 이어진다.