[Kubernetes] Cluster: Kubespray를 이용해 클러스터 구성하기 - 4.1. 클러스터 배포 - 인벤토리 구성 및 변수 수정
서종호(가시다)님의 On-Premise K8s Hands-on Study 4주차 학습 내용을 기반으로 합니다.
TL;DR
이번 글에서는 Kubespray 클러스터 배포를 위한 인벤토리를 구성한다.
- 샘플 인벤토리 복사:
cp -rfp로sample→mycluster복사 - inventory.ini 작성: 단일 노드 클러스터 구성
- Ansible 그룹 구조:
kube_control_plane,etcd,kube_node그룹과[etcd:children]패턴 이해 - 변수 수정: CNI, kube-proxy 모드, 인증서 자동 갱신 등 설정 변경
인벤토리 구성
샘플 인벤토리 복사
Kubespray는 inventory/sample/ 디렉토리에 샘플 인벤토리를 제공한다. 이를 복사하여 커스텀 인벤토리를 생성한다.
cp -rfp /root/kubespray/inventory/sample /root/kubespray/inventory/mycluster
참고:
-r(recursive),-f(force),-p(preserve)로 디렉토리 전체를 원본 메타데이터(권한, 소유자, 시간)와 함께 복사한다.
inventory.ini 수정
복사한 inventory.ini를 단일 노드 클러스터 구성에 맞게 수정한다:
cat << EOF > /root/kubespray/inventory/mycluster/inventory.ini
k8s-ctr ansible_host=192.168.10.10 ip=192.168.10.10
[kube_control_plane]
k8s-ctr
[etcd:children]
kube_control_plane
[kube_node]
k8s-ctr
EOF
cat /root/kubespray/inventory/mycluster/inventory.ini
# k8s-ctr ansible_host=192.168.10.10 ip=192.168.10.10
#
# [kube_control_plane]
# k8s-ctr
#
# [etcd:children]
# kube_control_plane
#
# [kube_node]
# k8s-ctr
인벤토리 구조 분석
호스트 정의
k8s-ctr ansible_host=192.168.10.10 ip=192.168.10.10
| 항목 | 값 | 설명 |
|---|---|---|
k8s-ctr |
- | 호스트 별칭 (Ansible에서 사용할 이름) |
ansible_host |
192.168.10.10 |
SSH 연결 대상 IP 주소 |
ip |
192.168.10.10 |
Kubespray가 사용하는 노드 IP (클러스터 내부 통신) |
참고:
ansible_host는 Ansible이 SSH 연결 시 사용하는 주소이고,ip는 Kubespray가 클러스터 구성 시 사용하는 노드 주소다. 단일 NIC 환경에서는 동일하지만, 멀티 NIC 환경에서는 다를 수 있다.
중요:
ip변수를 반드시 지정해야 한다. VirtualBox는 첫 번째 NIC로 NAT 인터페이스(10.0.2.15)를 사용하는데,ip를 생략하면 Kubespray가 이 주소를 사용하여 클러스터 구성에 실패한다. 맛보기 실습에서 직접 겪었던 문제다.
그룹 정의
이 인벤토리에는 다음 그룹들이 정의되어 있다:
| 그룹 | 유형 | 설명 |
|---|---|---|
all |
암시적(예약) | Ansible 기본 그룹, 모든 호스트 자동 포함 |
kube_control_plane |
명시적 | Kubernetes Control Plane 노드 |
etcd |
중첩 그룹 | etcd 클러스터 노드 (children으로 정의) |
kube_node |
명시적 | Kubernetes Worker 노드 |
그룹 상세 분석
all 그룹
k8s-ctr ansible_host=192.168.10.10 ip=192.168.10.10
그룹 선언 없이 정의된 호스트는 암시적으로 all 그룹에 포함된다. all은 Ansible이 예약한 기본 그룹으로, 인벤토리의 모든 호스트가 자동으로 포함된다.
kube_control_plane 그룹
[kube_control_plane]
k8s-ctr
Kubernetes Control Plane 컴포넌트(kube-apiserver, kube-controller-manager, kube-scheduler)가 설치될 노드를 정의한다.
etcd 그룹 (children)
[etcd:children]
kube_control_plane
[etcd:children]은 중첩 그룹(Nested Group)을 정의한다. 직접 호스트를 나열하지 않고, 다른 그룹을 자식으로 포함한다.
참고: 중첩 그룹에 대한 자세한 설명은 Ansible 인벤토리 - 중첩 그룹 (children)을 참고하자.
이 설정의 의미는 다음과 같다:
etcd그룹은kube_control_plane그룹의 모든 호스트를 상속받는다kube_control_plane에k8s-ctr이 있으므로,etcd그룹에도k8s-ctr이 포함된다
중첩 그룹 패턴을 사용하는 이유는 아래와 같다:
| 장점 | 설명 |
|---|---|
| 유연성 | etcd 클러스터 = Control Plane 노드로 자동 연동 |
| 유지보수 | Control Plane 노드 변경 시 etcd 멤버십 자동 변경 |
| 중복 제거 | 같은 호스트를 여러 그룹에 중복 정의할 필요 없음 |
프로덕션 환경에서는 etcd를 별도 노드에 구성하기도 한다. 그 경우 [etcd:children] 대신 직접 호스트를 나열하면 된다:
# 별도 etcd 클러스터 구성 예시
[etcd]
etcd-1 ansible_host=192.168.10.20
etcd-2 ansible_host=192.168.10.21
etcd-3 ansible_host=192.168.10.22
kube_node 그룹
[kube_node]
k8s-ctr
Kubernetes Worker 노드(kubelet, kube-proxy)가 설치될 노드를 정의한다. 이번 실습에서는 단일 노드 클러스터이므로 Control Plane과 동일한 k8s-ctr을 지정한다.
그룹 구성 확인
ansible 명령어 그룹 구성을 확인한다.
ansible -i /root/kubespray/inventory/mycluster/inventory.ini etcd --list-hosts
# hosts (1):
# k8s-ctr
ansible -i /root/kubespray/inventory/mycluster/inventory.ini kube_control_plane --list-hosts
# hosts (1):
# k8s-ctr
ansible -i /root/kubespray/inventory/mycluster/inventory.ini kube_node --list-hosts
# hosts (1):
# k8s-ctr
ansible -i /root/kubespray/inventory/mycluster/inventory.ini all --list-hosts
# hosts (1):
# k8s-ctr
최종 그룹 멤버십
| 그룹 | 멤버 | 비고 |
|---|---|---|
all |
k8s-ctr |
모든 호스트 자동 포함 |
kube_control_plane |
k8s-ctr |
직접 정의 |
etcd |
k8s-ctr |
kube_control_plane에서 상속 |
kube_node |
k8s-ctr |
직접 정의 |
단일 노드 클러스터이므로 모든 그룹이 k8s-ctr 하나로만 구성된다. 실제 프로덕션 환경에서는 각 그룹에 여러 노드를 분산 배치한다.
변수 수정
인벤토리 구성 후, 클러스터 설정을 변경하려면 group_vars 파일을 수정한다.
참고: 변수 배치 전략과 각 변수의 상세 설명은 변수 분석 시리즈를 참고하자.
수정할 설정
| 변수 | 기본값 | 변경값 | 이유 |
|---|---|---|---|
kube_network_plugin |
calico |
flannel |
더 간단한 CNI 테스트 |
kube_proxy_mode |
ipvs |
iptables |
기본적인 모드로 변경 |
enable_nodelocaldns |
true |
false |
단순화를 위해 비활성화 |
auto_renew_certificates |
false |
true |
인증서 자동 갱신 활성화 |
변수 수정
# k8s-cluster.yml 수정
sed -i 's|kube_network_plugin: calico|kube_network_plugin: flannel|g' \
inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml
sed -i 's|kube_proxy_mode: ipvs|kube_proxy_mode: iptables|g' \
inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml
sed -i 's|enable_nodelocaldns: true|enable_nodelocaldns: false|g' \
inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml
sed -i 's|auto_renew_certificates: false|auto_renew_certificates: true|g' \
inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml
# 주석 해제 (인증서 자동 갱신 스케줄)
sed -i 's|# auto_renew_certificates_systemd_calendar|auto_renew_certificates_systemd_calendar|g' \
inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml
수정 확인
grep -iE 'kube_network_plugin:|kube_proxy_mode|enable_nodelocaldns:|^auto_renew_certificates' \
inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml
kube_network_plugin: flannel
kube_proxy_mode: iptables
enable_nodelocaldns: false
auto_renew_certificates: true
auto_renew_certificates_systemd_calendar: "Mon *-*-1,2,3,4,5,6,7 03:00:00"
Flannel 설정 추가
CNI를 Flannel으로 변경했으므로, Flannel 전용 설정 파일도 수정한다:
# 현재 설정 확인
cat inventory/mycluster/group_vars/k8s_cluster/k8s-net-flannel.yml
# Flannel이 사용할 네트워크 인터페이스 지정
echo "flannel_interface: enp0s8" >> inventory/mycluster/group_vars/k8s_cluster/k8s-net-flannel.yml
# 수정 확인
grep "^[^#]" inventory/mycluster/group_vars/k8s_cluster/k8s-net-flannel.yml
참고:
flannel_interface는 Flannel이 VXLAN 통신에 사용할 네트워크 인터페이스를 지정한다. VirtualBox 환경에서는 Host-Only 네트워크 인터페이스(예:enp0s8)를 지정해야 노드 간 통신이 정상 동작한다.
결과
인벤토리 구성과 변수 수정이 완료되었다. 다음 글에서는 cluster.yml을 실행하여 클러스터를 배포한다.
댓글남기기