Kind로 로컬 환경에서 다중 노드 Kubernetes 클러스터 구축 및 관리
Kubernetes 클러스터를 로컬 환경에서 쉽고 빠르게 구축하고 관리하고 싶으신가요? Kind를 사용하여 다중 노드 Kubernetes 클러스터를 구축하고, Portainer를 통해 이를 손쉽게 관리하는 방법입니다. 초보자도 따라할 수 있도록 단계별로 설명하고, 필요한 명령어와 코드 샘플을 포함하고 있습니다.
- Kubernetes 기본 지식: Kubernetes의 개념과 기본 사용법에 대한 이해가 필요합니다.
- Docker 설치 및 기본 사용법: Docker가 시스템에 설치되어 있어야 하며, 컨테이너를 다루는 기본적인 명령어를 알고 있어야 합니다.
Kubernetes는 컨테이너화된 애플리케이션의 배포, 스케일링 및 관리를 자동화하는 데 필수적인 도구입니다. 그러나 로컬 환경에서 다중 노드 클러스터를 구축하고 관리하는 것은 복잡하고 시간이 많이 소요될 수 있습니다. Kind와 Portainer를 사용하면 이러한 과정을 단순화하여 개발 및 테스트 환경을 효율적으로 구성할 수 있습니다.
Kind 소개
Kind(Kubernetes IN Docker)는 Docker 컨테이너를 사용하여 Kubernetes 클러스터를 생성하는 도구입니다. 이는 Kubernetes의 기능을 로컬에서 테스트하거나 CI 환경에서 사용하기에 적합합니다. Kind를 사용하면 복잡한 설정 없이도 간단한 구성 파일로 다중 노드 클러스터를 만들 수 있습니다.
Kind를 사용하기 위해서는 먼저 Docker와 kubectl이 설치되어 있어야 합니다.
Docker 설치
Docker는 컨테이너를 생성하고 관리하는 데 필요한 핵심 도구입니다.
sudo apt-get update
sudo apt-get install -y \
ca-certificates \
curl \
gnupg \
lsb-release
Docker 공식 GPG 키를 추가합니다.
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
Docker 저장소를 설정합니다.
echo \
"deb [arch=$(dpkg --print-architecture signed-by=/etc/apt/keyrings/docker.gpg) \
https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Docker 엔진을 설치합니다.
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
Docker가 제대로 설치되었는지 확인합니다.
sudo docker run hello-world
kubectl 설치
kubectl은 Kubernetes 클러스터를 제어하는 명령줄 도구입니다.
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
실행 권한을 부여합니다.
chmod +x ./kubectl
바이너리를 시스템 PATH에 이동합니다.
sudo mv ./kubectl /usr/local/bin/kubectl
kubectl 버전을 확인합니다.
kubectl version --client
Kind 설치
curl -Lo ./kind "https://kind.sigs.k8s.io/dl/$(curl -s https://api.github.com/repos/kubernetes-sigs/kind/releases/latest | grep tag_name | cut -d '\"' -f 4)/kind-linux-amd64"
실행 권한을 부여합니다.
chmod +x ./kind
바이너리를 시스템 PATH에 이동합니다.
sudo mv ./kind /usr/local/bin/kind
Kind 버전을 확인합니다.
kind --version
Kind를 사용하는 이유
- 다중 클러스터 지원: Kind는 로컬 환경에서 여러 개의 클러스터를 동시에 실행할 수 있습니다.
- 간단한 설정: YAML 파일을 사용하여 클러스터 구성을 쉽게 정의할 수 있습니다.
- 빠른 프로비저닝: Docker 컨테이너를 사용하므로 클러스터 생성과 삭제가 빠릅니다.
예를 들어, 다음과 같이 여러 클러스터를 생성할 수 있습니다.
kind create cluster --name my-cluster
kind create cluster --name another-cluster
위의 명령어를 실행하면 두 개의 클러스터가 동시에 실행됩니다.
Kind 클러스터 구성
1개의 마스터 노드와 2개의 워커 노드를 포함하는 클러스터를 구성해보겠습니다.
클러스터 구성 파일 생성(kind-config.yaml)
cat > kind-config.yaml <<EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
EOF
클러스터 생성
kind create cluster --name k8s-playground --config kind-config.yaml
클러스터 노드 확인
kubectl get nodes
출력 예시
NAME STATUS ROLES AGE VERSION
k8s-playground-control-plane Ready control-plane 1m v1.25.0
k8s-playground-worker Ready <none> 1m v1.25.0
k8s-playground-worker2 Ready <none> 1m v1.25.0
Portainer는 컨테이너 환경을 쉽게 관리할 수 있는 오픈 소스 도구입니다. Docker, Docker Swarm, Kubernetes 등을 지원하며, 사용자 친화적인 웹 UI를 통해 복잡한 명령어 없이도 클러스터를 관리할 수 있습니다.
Portainer 설치
Portainer Helm 저장소 추가 및 업데이트
helm repo add portainer https://portainer.github.io/k8s/
helm repo update
Portainer 설치
helm install portainer portainer/portainer \
--create-namespace \
--namespace portainer \
--set service.type=NodePort \
--set service.nodePort=30777 \
--set ingress.enabled=false
Portainer 서비스 확인
kubectl get svc -n portainer
출력 예시
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
portainer NodePort xxx.xxx.xxx.xxx <none> 9000:30777/TCP 1m
Portainer 접속
브라우저에서 localhost:30777
로 접속하여 Portainer 대시보드에 접근합니다.
- 관리자 계정을 생성합니다.
- "Get Started"를 클릭합니다.
- 로컬 Kubernetes 환경이 자동으로 연결됩니다.
Kind와 Portainer를 사용하여 로컬 환경에서 다중 노드 Kubernetes 클러스터를 구축하고 관리하는 방법을 통해 개발 및 테스트 환경에서 효율적으로 Kubernetes를 활용할 수 있습니다.
Kind와 Portainer를 설치하고 클러스터를 구성한 후, 실제 애플리케이션을 배포하여 로컬 개발 환경에서 테스트해보겠습니다.
Nginx 웹 서버 배포
1. Nginx 배포 생성
간단한 Nginx 웹 서버를 배포합니다.
kubectl create deployment nginx-deployment --image=nginx
2. 배포 확인
배포된 파드를 확인합니다.
kubectl get pods
출력 예시
NAME READY STATUS RESTARTS AGE
nginx-deployment-xxxxxxxxxx-xxxxx 1/1 Running 0 10s
애플리케이션 접근을 위한 서비스 생성
파드에 접근하기 위해 서비스를 생성합니다.
1. 서비스 생성
NodePort 타입의 서비스를 생성합니다.
kubectl expose deployment nginx-deployment --type=NodePort --port=80
2. 서비스 확인
서비스 정보를 확인합니다.
kubectl get svc
출력 예시
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 10m
nginx-deployment NodePort 10.96.123.456 <none> 80:XXXXX/TCP 1m
NodePort 번호를 확인합니다. 위 출력에서 XXXXX
부분이 NodePort 번호입니다.
3. 로컬에서 애플리케이션 접속
클러스터의 노드 IP와 NodePort를 사용하여 브라우저에서 Nginx 서버에 접속합니다.
먼저, Kind 클러스터의 노드 IP를 확인합니다.
docker ps
Kind 노드 컨테이너의 ID를 확인한 후, IP를 조회합니다.
docker inspect <노드 컨테이너 ID> | grep IPAddress
예를 들어, IP가 172.18.0.2
이고 NodePort가 30080
이라면 브라우저에서 http://172.18.0.2:30080
으로 접속합니다.
참고: Kind 클러스터의 NodePort는 호스트 시스템의 localhost와 매핑되지 않습니다. 이를 해결하기 위해 port-forward를 사용하거나 Ingress를 설정할 수 있습니다.
4. 포트 포워딩을 통한 접근
간단하게 포트 포워딩을 사용하여 로컬호스트에서 파드에 접근할 수 있습니다.
kubectl port-forward svc/nginx-deployment 8080:80
이제 브라우저에서 http://localhost:8080
으로 접속하면 Nginx 환영 페이지를 볼 수 있습니다.
개발 및 디버깅
로컬 환경에서 애플리케이션을 개발하고 디버깅하는 방법은 다음과 같습니다.
1. 로컬 이미지 빌드 및 사용
Kind 클러스터에서 로컬 Docker 이미지를 사용하려면 이미지 빌드 후 Kind 노드로 이미지를 로드해야 합니다.
이미지 빌드
docker build -t my-app:latest .
이미지를 Kind 클러스터에 로드
kind load docker-image my-app:latest --name k8s-playground
배포 파일 작성 (deployment.yaml)
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-deployment
spec:
replicas: 1
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app-container
image: my-app:latest
ports:
- containerPort: 8080
애플리케이션 배포
kubectl apply -f deployment.yaml
2. 디버깅
파드에 직접 접속하여 로그를 확인하거나 셸을 실행할 수 있습니다.
로그 확인
kubectl logs <파드 이름>
셸 접속
kubectl exec -it <파드 이름> -- /bin/bash
CI/CD 파이프라인과의 통합
로컬에서 CI/CD 파이프라인을 테스트하려면 Kind 클러스터를 활용할 수 있습니다.
- Jenkins, GitLab CI 등과 연동: 로컬에서 실행되는 CI/CD 도구와 Kind 클러스터를 연결하여 배포 파이프라인을 테스트합니다.
- 자동화 스크립트 작성: 스크립트를 통해 클러스터 생성, 애플리케이션 배포, 테스트 실행, 클러스터 삭제까지 자동화할 수 있습니다.
예를 들어, 다음과 같이 스크립트를 작성할 수 있습니다.
#!/bin/bash
# 클러스터 생성
kind create cluster --name ci-cluster
# 애플리케이션 배포
kubectl apply -f deployment.yaml
# 테스트 실행
kubectl wait --for=condition=available --timeout=60s deployment/my-app-deployment
kubectl run test-pod --image=alpine --restart=Never -- sh -c "wget -qO- http://my-app-service:8080"
# 클러스터 삭제
kind delete cluster --name ci-cluster
로컬에서 Kind와 Portainer를 사용하여 실제 애플리케이션을 배포하고 관리하는 방법을 통해 개발 과정에서 빠르게 피드백을 얻고, Kubernetes 환경에 익숙해질 수 있습니다.
추가 학습 자료
- Kubernetes 공식 문서: https://kubernetes.io/ko/docs/home/
- Docker 공식 문서: https://docs.docker.com/get-started/
- Portainer 문서: https://documentation.portainer.io/v2.0/
- Helm 차트 작성 가이드: https://helm.sh/docs/chart_template_guide/