Kubespray로 KVM 기반 쿠버네티스 프로덕션 환경 구축하기

쿠버네티스를 프로덕션 환경에 설치하는 방법 중 하나로 Kubespray를 이용해보겠습니다. 이번 가이드는 5대의 KVM 가상 머신을 사용하여 3대의 마스터 노드2대의 워커 노드로 클러스터를 구성하는 과정을 다룹니다. 여기에서는 배포 노드를 별도로 사용하지 않고, master001 노드에서 설치를 진행합니다.

 

 

호스트 네임 설정:

  • 마스터 노드: kube-master001, kube-master002, kube-master003
  • 워커 노드: kube-worker001, kube-worker002

 

1. 기본 패키지 설치

설치를 시작하기 위해 master001 노드에서 기본 패키지를 설치합니다.

sudo apt update && sudo apt install -y python3-pip

2. pip 최신 버전으로 업그레이드

pip을 최신 버전으로 업그레이드합니다.

pip3 install --upgrade pip

 

3. pip 버전 확인

설치된 pip 버전을 확인해보세요.

root@kube-master001:~# pip -V
pip 23.1.2 from /usr/local/lib/python3.10/dist-packages/pip (python 3.10)

 

4. Kubespray 클론

Kubespray를 GitHub에서 클론합니다.

git clone https://github.com/kubernetes-sigs/kubespray.git

 

5. 의존성 패키지 설치

Kubespray 디렉토리로 이동하여 필요한 패키지를 설치합니다.

cd /root/kubespray
pip install -r requirements.txt

 

6. hosts 파일 설정

/etc/hosts 파일에 각 노드의 IP와 호스트 네임을 추가합니다.

vim /etc/hosts
10.10.10.11   kube-master001
10.10.10.12   kube-master002
10.10.10.13   kube-master003
10.10.10.14   kube-worker001
10.10.10.15   kube-worker002

 

7. 인벤토리 생성

기본 인벤토리 샘플을 복사해 새로운 인벤토리를 생성합니다.

cd /root/kubespray
cp -r inventory/sample inventory/gnetworks

 

8. 인벤토리 설정

인벤토리 파일을 편집하여 노드 구성을 설정합니다.

vim ~/kubespray/inventory/gnetworks/inventory.ini

[all]
kube-master001
kube-master002
kube-master003
kube-worker001
kube-worker002

[kube_control_plane]
kube-master001
kube-master002
kube-master003

[etcd]
kube-master001
kube-master002
kube-master003

[kube_node]
kube-worker001
kube-worker002

[calico_rr]

[k8s_cluster:children]
kube_control_plane
kube_node
calico_rr

 

9. SSH 키 구성

Ansible 설치를 위해 SSH 키를 구성합니다. 아래 스크립트를 사용하거나 수동으로 설정할 수 있습니다.

cat << EOF > ssh-key-copy.sh
#!/bin/sh
apt install -y sshpass
ssh-keygen
for (( i=46; i<=48; i++))
do
sshpass -p "gjsxj001" ssh-copy-id -o StrictHostKeyChecking=no root@211.39.158.\$i 
done
for (( i=53; i<=54; i++))
do
sshpass -p "gjsxj001" ssh-copy-id -o StrictHostKeyChecking=no root@211.39.158.\$i 
done
EOF

 

10. YAML 파일 환경 구성

환경 설정 파일을 편집하여 필요한 기능을 활성화합니다.

vim /root/kubespray/inventory/gnetworks/group_vars/k8s_cluster/k8s-cluster.yml

  • Kubernetes Audit Log 활성화:
    yaml

    kubernetes_audit: true
  • 컨테이너 런타임: containerd가 기본값으로 설정되어 있습니다.
    container_manager: containerd
  • 네트워크 플러그인: calico가 기본값으로 설정됩니다.
    kube_network_plugin: calico
  • 쿠버네티스 버전: Kubespray가 지원하는 최신 버전(현재 기준 v1.26.6)을 설정합니다.
    kube_version: v1.26.6
  • 추가 기능 활성화:
    dashboard_enabled: true
    metrics_server_enabled: true
    helm_enabled: true
    ingress_nginx_enabled: true

11. 쿠버네티스 배포

모든 구성이 완료되었으면 Ansible Playbook을 실행해 쿠버네티스를 설치합니다.

ansible-playbook -i inventory/gnetworks/inventory.ini cluster.yml

 

12. 설치 확인

설치가 완료되면 노드 상태를 확인합니다.

root@kube-master001:~# kubectl get nodes -o wide

NAME             STATUS   ROLES           AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
kube-master001   Ready    control-plane   22h   v1.26.6   10.10.10.11     <none>        Ubuntu 22.04.1 LTS   5.15.0-56-generic   containerd://1.7.2
kube-master002   Ready    control-plane   22h   v1.26.6   10.10.10.12     <none>        Ubuntu 22.04.1 LTS   5.15.0-56-generic   containerd://1.7.2
kube-master003   Ready    control-plane   22h   v1.26.6   10.10.10.13     <none>        Ubuntu 22.04.1 LTS   5.15.0-56-generic   containerd://1.7.2
kube-worker001   Ready    <none>          22h   v1.26.6   10.10.10.14     <none>        Ubuntu 22.04.1 LTS   5.15.0-56-generic   containerd://1.7.2
kube-worker002   Ready    <none>          22h   v1.26.6   10.10.10.15     <none>        Ubuntu 22.04.1 LTS   5.15.0-56-generic   containerd://1.7.2

 

이로써 KVM 기반의 쿠버네티스 프로덕션 환경을 Kubespray로 성공적으로 구축했습니다!

 

😳 주의사항 : 설정 오류도 클러스터 구축에 영향을 줄 수 있습니다. 아래 항목을 확인해 보세요:

1. 호스트 파일 설정

  • /etc/hosts 파일에 각 노드의 IP와 호스트 네임이 제대로 매핑되어 있는지 다시 한번 확인하세요.
  • 각 노드에서 이 설정을 반영했는지 확인해야 합니다. 모든 노드에서 ping kube-master001 같은 명령어를 실행해 연결이 정상적인지 테스트해 보세요.

2. SSH 키 구성

  • SSH 키 복사가 제대로 되었는지 확인하세요. 모든 노드에 SSH로 비밀번호 없이 접속할 수 있어야 합니다.
    ssh root@kube-master002
    ssh root@kube-worker001
  • 접속이 되지 않는다면, ssh-key-copy.sh 스크립트에 오류가 없는지 검토하거나 SSH 구성 설정을 점검해야 합니다.

3. Ansible 인벤토리 설정

  • inventory.ini 파일에서 각 섹션에 맞게 노드가 올바르게 할당되었는지 확인하세요.
  • kube_control_plane, etcd, kube_node 섹션에 누락된 노드가 없는지 점검합니다. 예를 들어, 마스터 노드는 반드시 kube_control_planeetcd에 포함되어야 합니다.

4. YAML 설정 확인

  • k8s-cluster.yml 파일에서 주요 옵션들이 원하는 값으로 설정되었는지 확인합니다.
    • kube_version이 설치 시점에 Kubespray가 지원하는 최신 버전으로 맞춰져 있는지 확인합니다.
    • kube_network_plugincalico로 설정된 것이 맞는지, 그리고 네트워크 플러그인에 따라 추가 설정이 필요한지 검토합니다.
  • 추가로 활성화한 기능들이 true로 설정되었는지도 체크해 주세요:
    dashboard_enabled: true
    metrics_server_enabled: true
    helm_enabled: true
    ingress_nginx_enabled: true

5. Ansible Playbook 실행 전 확인 사항

  • Ansible이 설치된 상태에서 ansible --version 명령어로 버전을 확인하고, Ansible이 올바르게 설치되었는지 점검합니다.
  • Playbook 실행 전에 ansible -m ping all -i inventory/gnetworks/inventory.ini 명령어로 모든 노드가 응답하는지 확인합니다. 모든 노드가 “pong” 응답을 보내야 정상입니다.

6. 설치 후 점검

  • kubectl get nodes 명령어를 실행했을 때 모든 노드가 Ready 상태인지 확인하세요. 상태가 NotReady로 표시된다면, 네트워크 설정이나 다른 구성 요소에 문제가 있을 수 있습니다.
  • 네트워크 플러그인(예: Calico)이 제대로 작동하는지 확인합니다:
    kubectl get pods -n kube-system

    모든 시스템 파드가 Running 상태인지 확인하세요.

쿠버네티스 DOCS : https://kubernetes.io/ko/docs/setup/production-environment/tools/kubespray/