서버구축 (WEB,DB)

Kind로 로컬 환경에서 다중 노드 Kubernetes 클러스터 구축 및 관리

날으는물고기 2024. 11. 14. 00:49

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 대시보드에 접근합니다.

  1. 관리자 계정을 생성합니다.
  2. "Get Started"를 클릭합니다.
  3. 로컬 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 환경에 익숙해질 수 있습니다.

 

추가 학습 자료

728x90