🏠 목록 KIND Lab Usage Guide 📄 MD 원본 📁 Files 🔒 Private 🌓 테마

KIND Lab Usage Guide

Verified: 2026-03-02 환경: Ubuntu 24.04 LTS, Docker 29.2.1, KIND v0.31.0


도구 요약

도구 경로 용도
kind /usr/local/bin/kind 클러스터 생성/삭제/관리
kubectl /usr/local/bin/kubectl (alias: k) K8s 리소스 조작
helm /usr/local/bin/helm 차트 기반 앱 배포
kubectl krew ~/.krew/bin/ kubectl 플러그인 매니저
kubectl ctx krew 플러그인 컨텍스트 전환
kubectl ns krew 플러그인 네임스페이스 전환
k9s ~/.local/bin/k9s 터미널 기반 K8s 대시보드

클러스터 라이프사이클

클러스터 생성

구성 파일 위치: ~/kind-configs/

# 단일 노드 (기본)
kind create cluster --config ~/kind-configs/single-node.yaml --image kindest/node:v1.34.3

# 멀티 워커 (CP1 + Worker3)
kind create cluster --config ~/kind-configs/multi-worker.yaml --image kindest/node:v1.34.3

# HA 구성 (CP3 + Worker3)
kind create cluster --config ~/kind-configs/ha-control-plane.yaml --image kindest/node:v1.34.3

--image 태그를 변경하면 다른 K8s 버전으로 생성할 수 있다. 사용 가능한 이미지 목록: https://github.com/kubernetes-sigs/kind/releases

클러스터 목록 확인

kind get clusters

클러스터 삭제

# 특정 클러스터 삭제
kind delete cluster --name lab

# 전체 삭제
kind delete clusters --all

클러스터 재생성 (초기화)

KIND는 상태 초기화 기능이 없으므로, 삭제 후 재생성한다:

kind delete cluster --name lab && \
kind create cluster --config ~/kind-configs/single-node.yaml --image kindest/node:v1.34.3

컨텍스트/네임스페이스 전환

KIND 클러스터의 컨텍스트 이름은 kind-<클러스터명> 형식이다.

# 컨텍스트 목록 및 전환
kubectl ctx              # 목록 표시 (fzf 설치 시 인터랙티브 선택)
kubectl ctx kind-lab     # kind-lab으로 전환

# 네임스페이스 전환
kubectl ns               # 목록 표시
kubectl ns kube-system   # kube-system으로 전환
kubectl ns -             # 이전 네임스페이스로 복귀

Helm 사용

# 리포지토리 추가
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

# 차트 검색
helm search repo nginx

# 설치
helm install my-nginx bitnami/nginx -n default

# 목록 확인
helm list -A

# 삭제
helm uninstall my-nginx -n default

k9s 사용

# 현재 컨텍스트로 실행
k9s

# 특정 컨텍스트 지정
k9s --context kind-lab

# 특정 네임스페이스로 시작
k9s -n kube-system

k9s 핵심 단축키

동작
: 리소스 타입 입력 (:pod, :svc, :deploy 등)
/ 필터링 (이름 검색)
d describe
l 로그 보기
s 셸 접속 (exec)
e YAML 편집
ctrl-d 삭제
ctrl-k kill (강제 삭제)
esc 뒤로 가기
ctrl-c 종료

Docker 이미지를 KIND로 로드

로컬에서 빌드한 이미지를 KIND 클러스터에서 사용하려면:

# 로컬 이미지를 KIND 노드로 로드
kind load docker-image my-app:latest --name lab

# 로드된 이미지 확인
docker exec lab-control-plane crictl images | grep my-app

Pod에서 사용할 때 imagePullPolicy: Never 또는 IfNotPresent로 설정해야 한다.


포트 포워딩

KIND 노드는 Docker 컨테이너이므로 외부 접근에는 포트 포워딩이 필요하다.

방법 1: kubectl port-forward (임시)

kubectl port-forward svc/my-service 8080:80
# localhost:8080으로 접근 가능

방법 2: KIND 구성에서 extraPortMappings (영구)

클러스터 생성 시 구성 파일에 포트 매핑을 추가한다:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: lab
nodes:
  - role: control-plane
    extraPortMappings:
      - containerPort: 30000
        hostPort: 30000
        protocol: TCP
networking:
  podSubnet: "10.244.0.0/16"
  serviceSubnet: "10.96.0.0/12"

NodePort 서비스(30000번)를 호스트에서 직접 접근할 수 있다. 이미 생성된 클러스터에는 적용할 수 없으므로 재생성이 필요하다.


트러블슈팅

노드가 NotReady

# 원인 확인
kubectl describe node lab-control-plane | grep -A5 Conditions

# 시스템 Pod 상태 확인
kubectl get pods -n kube-system

보통 CNI(kindnet)나 CoreDNS가 아직 초기화 중일 때 발생하며, 1-2분 대기하면 해결된다.

Docker 리소스 부족

# Docker가 사용 중인 리소스 확인
docker system df

# 사용하지 않는 이미지/컨테이너 정리
docker system prune -f

클러스터 접근 불가

# Docker 컨테이너 상태 확인
docker ps -a | grep kind

# 컨테이너가 중지된 경우 재시작
docker start lab-control-plane

# kubeconfig 컨텍스트 확인
kubectl config get-contexts

로그 확인

# KIND 노드의 kubelet 로그
docker exec lab-control-plane journalctl -u kubelet --no-pager -n 50

# 특정 시스템 컴포넌트 로그
kubectl logs -n kube-system -l component=etcd
kubectl logs -n kube-system -l k8s-app=kube-dns

구성 파일 레퍼런스

파일 구성 용도
single-node.yaml CP 1 (워커 겸용) 일반 실험, 앱 배포 연습
multi-worker.yaml CP 1 + Worker 3 스케줄링, CNI, Gateway API 실험
ha-control-plane.yaml CP 3 + Worker 3 HA, etcd, leader election 스터디

모든 파일은 ~/kind-configs/에 위치한다.