
쿠버네티스 클러스터를 구성하는 방식은 다양하게 있다. 클라우드 벤더사에서 제공하는 서비스와 테스트용인 minikube 등 여러 방식이 존재하는데 On-premise 환경에서 클러스터를 구성할 경우 대표적으로 kubeadm과 kubespray를 사용한다.
kubeadm는 명령어를 통해 수동으로 모듈을 하나씩 설치해주어야하지만 kubespray는 kubeadm을 이용한 클러스터 구성방법에서 ansible을 활용해 자동화한 오픈소스이다.
일전에는 kubeadm을 사용하여 각 구성 요소를 직접 설치해보았다면 이번에는 kubespray를 통해 간편하게 구축할 수 있는 과정을 알아보겠다.
GCP의 인스턴스를 생성해 쿠버네티스 클러스터를 설치해보자. 마스터 노드 1대, 워커 노드 3대로 구성하고 나중에 개발한 프로젝트를 올려줄 것이기 때문에 쿠버네티스가 돌아갈 수 있는 최소 사양(2Core 2GB)에서 메모리를 조금 더 늘려주었다.
| 용도 | IP | 스펙 |
|---|---|---|
| Kubespray, Ansible | 10.178.0.3 | 2Core 2GB |
| Marster Node | 10.178.0.4 | 2Core 4GB |
| Worker1 Node | 10.178.0.5 | 2Core 4GB |
| Worker2 Node | 10.178.0.6 | 2Core 4GB |
| Worker3 Node | 10.178.0.7 | 2Core 4GB |
OS는 Ubuntu 24.04 버전으로 전부 통일하여 맞춰주었따.
본격적으로 클러스터를 설치하기 전에 필요한 기초 설정을 모든 서버에서 진행해야한다.
$ sudo apt update
// swap 끄기
$ swapoff -a
$ sed -i 's/.*swap.*/#&/' /etc/fstab
// 방화벽 끄기
$ systemctl stop ufw
// selinud 끄기
$ sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
로컬 방화벽의 경우 계속 꺼두면 보안에 문제가 발생할 수 있기때문에 나중에 꼭 규칙을 정의해서 사용해야한다.
모든 과정을 root 사용자로 진행하기 위해 ssh 설정을 변경해야한다. 아래 링크를 참고하여 설정해주면 될 것이다.
kubespray로 클러스터를 구성하기 위해 필요한 패키지(python, ansible 등) 설치를 진행한다.
Ansible이 각 서버와 통신하여 클러스터를 설치할 수 있도록 모든 노드에 ssh 접속을 허용해야한다.
그러기 위해서 kubespray 서버에서 ssh 접속을 위한 key를 생성하고 각 노드에 키 값을 등록하도록 하자.
// ssh public key 생성
$ ssh-keygen -t rsa -b 2048
// public key 복사
$ cat ~/.ssh/id_rsa.pub
ssh-copy-id root@IP 명령어를 사용해서 키를 복사할 수 있지만 잘 안될 경우 각 노드에 접속해서 직접 복사/붙여넣기 해주는게 훨씬 잘되더라...
// 모든 노드에서 진행하기
$ vim ~/.ssh/authorized_keys
$ git clone -b v2.27.0 https://github.com/kubernetes-sigs/kubespray.git
$ cd kubespray // 원활한 작업을 위해 디렉토리 이동
$ apt install -y python3-pip
requirements.txt에는 kubespray로 쿠버네티스 클러스터 구성을 위해서 필요한 패키지들이 한 데 모여있다.
$ pip3 install -r requirements.txt
pip3 명령어로 필요한 패키지들을 한번에 설치해주는 작업을 하다보니 externally-managed-environment에 관한 에러가 발생하여 설치가 안되는 문제가 발생했다.
이런저런 구글링을 했을때 OS 구동에 필요한 파이썬 패키지들에 영향을 줄 수 있어 임의로 패키지를 설치하는 것을 막아둔 것이라는 이야기가 있는데
$ python3 -m pip config set global.break-system-packages true
설치 권한을 풀어주는 명령어를 사용하는 것으로 설치가 정상적으로 이루어질 수 있도록 할 수 있다.
kubespray가 제공하는 sample 파일을 복사하여 각 노드들과 통신이 가능하도록 인벤토리 설정을 해준다.
$ cp -rpf inventory/sample/ inventory/mycluster
복사한 폴더의 inventory/mycluster/inventory.ini 에서 아래와 같이 설치할 서버들을 구성해주면 된다.
[all]
k8smaster ansible_host=10.178.0.4 ip=10.178.0.4
k8sworker1 ansible_host=10.178.0.5 ip=10.178.0.5
k8sworker2 ansible_host=10.178.0.6 ip=10.178.0.6
k8sworker3 ansible_host=10.178.0.7 ip=10.178.0.7
[kube_control_plane]
k8smaster
[etcd]
k8smaster
[calico_rr]
[kube_node]
k8sworker1
k8sworker2
k8sworker3
[k8s_cluster:children]
kube_control_plane
kube_node
calico_rr
클러스터 설치 명령어를 실행하기 전에 각 노드들과 통신이 잘 되고 있는지 Ping을 통해 확인하는 것이 좋다.
$ ansible all -m ping -i inventory/testcluster/inventory.ini

이제 준비한 파일들을 이용하여 Ansible을 구동하고 클러스터를 설치해보도록 하자.
$ ansible-playbook -i inventory/mycluster/inventory.ini cluster.yml -b --become-user root -e ansible_ssh_timeout=50 -vvv


inventory.ini에 설정한 대로 master 1대와 worker 3대로 구성된 클러스터가 설치된 것을 확인할 수 있다.

[참고자료]
https://kubernetes.io/ko/docs/setup/production-environment/tools/kubespray/
https://velog.io/@imsooyeon/k8s-kubespray%EB%A1%9C-%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0
https://blog.naver.com/kim1417/223493704161