개요
이전에 저는 앤서블로 쿠버네티스를 설치하는 방법에 대해서 기록하였습니다.
이번 게시글에서는 Kubespray
라는 앤서블 기반의 프로젝트를 활용하여 정말! 간편하게 쿠버네티스를 설치하는 방법에 대해서 기록해보려고 합니다.
Kubespray란 무엇일까요? 🤔
Kubespray는 앤서블 플레이북을 기반으로 운영 환경 수준의 쿠버네티스 클러스터를 쉽고 안정적으로 배포하고 관리할 수 있게 해주는 오픈소스 프로젝트입니다.
복잡한 설치 과정을 미리 작성된 자동화 스크립트(플레이북)를 실행하는 것만으로 대체할 수 있죠.
Kubespray의 핵심 장점!
- ⚙️ 자동화와 일관성: 수동 작업에서 발생하는 실수를 원천 차단하고, 언제나 동일한 구성의 클러스터를 만들 수 있습니다.
- 🎨 유연한 맞춤 설정: Calico, Cilium, Flannel 등 다양한 CNI(네트워크 플러그인)와 클라우드 환경, 다양한 리눅스 배포판(Ubuntu, CentOS 등)을 지원하며, 원하는 구성 요소를 변수 설정만으로 쉽게 변경할 수 있습니다.
- 🚀 운영 환경 수준의 구성: 단순히 쿠버네티스만 설치하는 것이 아니라, 운영에 필요한 다양한 구성(HA 구성, 인증서 관리 등)을 포함하여 안정적인 클러스터 구축이 가능합니다.
- 🔄 클러스터 생명주기 관리: 신규 노드를 추가하거나(Scale-Out), 클러스터 버전을 업그레이드하는 복잡한 작업도 Kubespray를 통해 자동화할 수 있습니다.
Kubespray 동작 원리 및 예시
Kubespray의 핵심은 인벤토리(Inventory) 파일 에 원하는 클러스터의 구성을 정의하는 것입니다.
어떤 서버가 마스터 노드가 될지, 어떤 서버가 워커 노드가 될지 등을 ini
형식의 파일에 간단히 명시하기만 하면 됩니다.
앤서블은 이 인벤토리 파일을 읽어서. 각 서버의 역할에 맞는 플레이북을 자동으로 실행하여 쿠버네티스 클러스터를 구성합니다.
인벤토리 파일 예시 (inventory.ini
)
예를 들어, 1개의 마스터 노드와 1개의 워커 노드를 가진 클러스터를 구성한다고 가정해 보겠습니다.
# ## 인벤토리 설정 ##
[all]
master ansible_host=192.168.219.140 ip=192.168.10.11 ansible_user=master
node ansible_host=192.168.219.141 ip=192.168.10.21 ansible_user=node
# ## 역할(Role) 정의 ##
# 쿠버네티스 컨트롤 플레인 및 etcd 역할을 할 노드 그룹
[kube_control_plane]
master
[etcd]
master
# 쿠버네티스 워커 노드 역할을 할 노드 그룹
[kube_node]
node
# 위 그룹들을 모두 포함하는 k8s 클러스터 그룹
[k8s_cluster:children]
kube_control_plane
kube_node
이렇게 서버 IP와 역할을 정의해두기만 하면, kubespray
가 나머지 복잡한 설치 과정은 모두 알아서 처리해줍니다!
Kubespray로 쿠버네티스 클러스터 구축하기 🚀
이제 직접 kubespray를 사용하여 쿠버네티스 클러스터를 구축해보겠습니다.
0. 사전 준비물
- 1. 앤서블 컨트롤 노드: 앤서블 명령을 실행할 PC 또는 서버
- 2. 타겟 노드: 쿠버네티스 마스터/워커 노드가 될 서버들
- 3. SSH 키 기반 통신: 컨트롤 노드에서 모든 타겟 노드로 비밀번호 없이 SSH 접속이 가능해야 함. (
ssh-copy-id
사용) - 4. 파이썬: 컨트롤 노드에 Python 3와 pip가 설치되어 있어야 함. (최신 배포판에는 Python3가 탑재되어 있음.)
위 구성이 완료되었다면, 아래 앤서블 ad-hoc을 실행하여 정상적으로 앤서블 서버와 관리 노드간 통신이 되는지 테스트해봅시다.
ansible -i inventory.ini kube_node -m ping
node | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
1. Kubespray 다운로드 및 의존성 설치
먼저 컨트롤 노드에서 Kubespray 프로젝트를 클론하고, 필요한 파이썬 라이브러리를 설치합니다.
# Kubespray 소스 코드 다운로드
git clone https://github.com/kubernetes-sigs/kubespray.git
# 프로젝트 디렉토리로 이동
cd kubespray
# 가상 환경을 만들겠습니다.
python3 -m venv venv
source venv/bin/activate
# 필요한 파이썬 라이브러리 설치
pip install --upgrade pip
pip install ansible-core==2.17.3
pip install -r requirements.txt
2. 인벤토리 구성
Kubespray에서 기본적으로 제공되는 샘플 인벤토리를 복사하여 저만의 클러스터 구성을 만들어주겠습니다.
# 샘플 인벤토리를 'mycluster' 라는 이름으로 복사
cp -rfp inventory/sample inventory/mycluster
이제 inventory/mycluster/inventory.ini
파일을 열고, 위에서 설명한 예시처럼 자신의 서버 IP와 역할을 맞게 수정합니다.
3. [선택] 클러스터 설정 커스터마이징
kubespray는 매우 상세한 설정 변경을 지원합니다.
예를 들어, 네트워크 플러그인을 기본값인 Calico에서 Cilium으로 바꾸고 싶다면 아래 파일에서 변수 하나만 수정하면 됩니다.
- 파일 위치:
inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml
- 변경 내용:
kube_network_plugin: calico
->kube_network_plugin: cilium
이 외에도 쿠버네티스 버전, 대시보드 설치 여부 등 거의 모든 설정을 group_vars
디렉토리 안의 *.yml
파일들에서 변경할 수 있습니다.
4. 플레이북 실행
모든 준비가 끝났습니다. 이제 아래 명령어로 앤서블 플레이북을 실행하면 설치가 자동으로 시작됩니다.
ansible-playbook -i inventory/mycluster/inventory.ini --become --become-user=root --ask-become-pass cluster.yml
5. 클러스터 설치 확인
설치가 완료되면 마스터 노드에 접속하여 클러스터가 정상적으로 생성되었는지 확인합니다.
# 모든 노드가 'Ready' 상태인지 확인
kubectl get nodes -o wide
# 시스템 파드들이 모두 'Running' 상태인지 확인
kubectl get pods -A