설치 환경 개요
※ 본 글에서는 실제 회사 내부 테스트 환경에서 RKE2를 설치하며 사용한 사양과 구성 정보를 바탕으로 작성되었습니다.
운영 환경 구성 시 참고용으로 활용하시되, 환경에 맞게 적절한 조정을 권장합니다.
서버 사양
- 모델: HPE ProLiant DL160 Gen10
- CPU: Intel(R) Xeon(R) Silver 4210R @ 2.40GHz
- RAM: 32GB
- 이더넷: Embedded 2-port 1GbE
클러스터 노드 구성
| 노드 이름 | IP 주소 |
| cluster-node-1 | 172.16.0.1 |
| cluster-node-2 | 172.16.0.2 |
| cluster-node-3 | 172.16.0.3 |
운영 체제 및 RKE2 버전
- OS: Ubuntu Server 22.04 LTS (Minimized Installation)
- RKE2: v1.31.4+rke2r1
사전 준비
네트워크 설정 (3대 노드에 설정, 아래 예시는 1대 기준)
아래의 내용을 3대 노드에 각각 IP에 맞게 적용합니다.
$ sudo vi /etc/netplan/00-installer-config.yaml
# 설정 시작
# This is the network config written by 'subiquity'
network:
ethernets:
eno1:
addresses:
- 172.16.0.1/24
nameservers:
addresses:
- 8.8.8.8
search:
- cluster-node-2
routes:
- to: default
via: 172.16.0.254
eno2:
dhcp4: true
# 네트워크 설정 확인 및 연결되지 않은 경우에 바로 부팅 되도록 설정
optional: true
version: 2
# 설정 끝
서버 업데이트 및 기본 구성요소 설치, Swap 제거 및 최신 커널 적용 후 재부팅
# 업데이트 및 구성요소 설치
$ sudo apt update && sudo apt upgrade -y
$ sudo apt install ubuntu-standard ubuntu-server curl wget git -y
# 설치시 유저를 생성하였다면 진행하지 않아도 됨
$ sudo useradd -m -s /bin/bash -G sudo locate && passwd locate
# 스왑 제거
$ swapoff -a
$ sudo vi /etc/fstab
# 설정 부분 - 해당 부분 찾아서 주석 처리
#/swap.img none swap sw 0 0
# 설정 끝
# 재부팅
$ sudo reboot
sshd 포트 변경
$ sudo vi /etc/ssh/sshd_config
# 설정 부분 - 해당 부분 찾아서 다음과 같이 변경
Port 50000
# 설정 끝
# sshd 서비스 재기동
$ sudo systemctl restart sshd
시간설정
# 한국으로 시간대 변경
$ sudo timedatectl set-timezone Asia/Seoul
# ntp 서비스 설치
$ sudo apt install ntp -y
vi /etc/ntp.conf
# 설정 파일안에 기존 pool 주소 주석 처리 후 한국 pool 주소 추가
#pool 0.ubuntu.pool.ntp.org iburst
#pool 1.ubuntu.pool.ntp.org iburst
#pool 2.ubuntu.pool.ntp.org iburst
#pool 3.ubuntu.pool.ntp.org iburst
server 3.kr.pool.ntp.org
server 1.asia.pool.ntp.org
server 3.asia.pool.ntp.org
# ntp 서비스 재기동
$ sudo systemctl enable ntp
$ sudo systemctl restart ntp
k8s 마스터 노드 설정
고가용성을 위해 마스터노드는 최소 3대로 설치 합니다.
RKE2에서 노드끼리 연결하기 위한 IP 주소에 대한 고가용성 설정
keepalived 설치 - 모든 노드에 동일하게 적용 (고가용성 처리)
$ sudo apt-get update && apt-get install -y keepalived
# rke2-server 프로세스 확인 스크립트 작성
$ sudo vi /etc/keepalived/check_rke2.sh
#!/bin/bash
systemctl is-active --quiet rke2-server
if [ $? -eq 0 ]; then
exit 0 # 정상 실행
else
exit 1 # 실패
fi
keepalived 설정, 스크립트 작성 - 노드마다 다르게 설정
# 다음 내용은 각각의 node에 다르게 작성
$ sudo vi /etc/keepalived/keepalived.conf
# -----------------------------------------------------------------------------
# 172.16.0.1(cluster-node-1) 적용
vrrp_script check_rke2_script {
script "/etc/keepalived/check_rke2.sh" # 절대 경로 지정
interval 10 # 10초마다 체크
weight -30 # RKE2가 죽으면 priority 낮춰서 VIP 반납
}
vrrp_instance VI_1 {
state MASTER # MASTER, BACKUP 중에서만 가능
interface eno1 # 네트워크 인터페이스
virtual_router_id 51 # VRRP 그룹 ID
priority 100 # 마스터노드는 우선순위 100
advert_int 1
authentication {
auth_type PASS
auth_pass locate-cluster
}
virtual_ipaddress {
**172.16.0.42**
}
track_script {
check_rke2_script # RKE2 상태 감지 스크립트 연결
}
}
# 적용 끝
# -----------------------------------------------------------------------------
# 172.16.0.2(cluster-node-2) 적용
vrrp_script check_rke2_script {
script "/etc/keepalived/check_rke2.sh" # 절대 경로 지정
interval 10 # 10초마다 체크
weight -30 # RKE2가 죽으면 priority 낮춰서 VIP 반납
}
vrrp_instance VI_1 {
state BACKUP
interface eno1 # 네트워크 인터페이스
virtual_router_id 51 # VRRP 그룹 ID
priority 90 # 우선순위 지정
advert_int 1
authentication {
auth_type PASS
auth_pass locate-cluster
}
virtual_ipaddress {
172.16.0.42
}
track_script {
check_rke2_script # RKE2 상태 감지 스크립트 연결
}
}
# -----------------------------------------------------------------------------
# 172.16.0.3. (cluster-node-3)
vrrp_script check_rke2_script {
script "/etc/keepalived/check_rke2.sh" # 절대 경로 지정
interval 10 # 10초마다 체크
weight -30 # RKE2가 죽으면 priority 낮춰서 VIP 반납
}
vrrp_instance VI_1 {
state BACKUP
interface eno1 # 네트워크 인터페이스
virtual_router_id 51 # VRRP 그룹 ID
priority 80 # 우선순위 지정
advert_int 1
authentication {
auth_type PASS
auth_pass locate-cluster
}
virtual_ipaddress {
172.16.0.42
}
track_script {
check_rke2_script # RKE2 상태 감지 스크립트 연결
}
}
# 설정 끝
# keepalived 시작
$ sudo systemctl enable keepalived --now
RKE2 설치 - 모든 노드에 동일하게 적용
관리자 권한으로 실행하여야 합니다.
# 관리자로 로그인 후 모든 노드에 설치해야 함
$ sudo su -
password:
root@cluster-node-1:~# curl -sfL <https://get.rke2.io> --output install.sh && chmod +x install.sh
root@cluster-node-1:~# INSTALL_RKE2_CHANNEL=v1.31.4+rke2r1 ./install.sh
root@cluster-node-1:~# systemctl enable rke2-server
(단독실행) REK2 사전 실행 - cluster-node-1에서 실행
노드끼리 연결을 위한 토큰을 위해 사전 실행 합니다.
# 제일 처음 설치하는 마스터노드 172.16.0.1(cluster-node-1)에서만 실행
root@cluster-node-1:~# systemctl start rke2-server
# 토큰 확인
root@cluster-node-1:~# cat /var/lib/rancher/rke2/server/node-token
RKE2 설정 생성 (공통) - 모든 노드에 동일하게 저장
root@cluster-node-1:~# mkdir -p /etc/rancher/rke2/
root@cluster-node-1:~# vi /etc/rancher/rke2/config.yaml
# 설정 파일
# keepalived에서 설정한 VIP
server: https://172.16.0.42:9345
# cluster-node-1에서 cat /var/lib/rancher/rke2/server/node-token 명령 결과 삽입
token:
tls-san:
- "172.16.0.1"
- "172.16.0.2"
- "172.16.0.3"
disable:
- rke2-ingress-nginx
# prometheus를 연결하기 위한 설정
kube-controller-manager-arg:
- "bind-address=0.0.0.0"
kube-scheduler-arg:
- "bind-address=0.0.0.0"
etcd-arg:
- "listen-metrics-urls=http://0.0.0.0:2381"
# 설정 끝
REK2 실행 - 모든 노드에 순차 실행
# cluster-node-2에서 실행
root@cluster-node-2:~# systemctl start rke2-server
# cluster-node-3에서 실행
root@cluster-node-3:~# systemctl start rke2-server
# 제일 처음 설치하는 172.16.0.1(cluster-node-1)는 이미 기동중이므로 재시작
root@cluster-node-1:~# systemctl restart rke2-server
# 로그 확인
root@cluster-node-1:~# sudo journalctl -u rke2-server -f
k8s 관리도구 설정 - cluster-node-1에서 실행
# kubectl 명령 추가
root@cluster-node-1:~# echo 'export PATH=$PATH:/var/lib/rancher/rke2/bin' >> ~/.bashrc
root@cluster-node-1:~# source ~/.bashrc
# kubectl 실행을 위한 인증파일 추가
root@cluster-node-1:~# mkdir ~/.kube
root@cluster-node-1:~# cp /etc/rancher/rke2/rke2.yaml .kube/config
설치된 노드 확인
root@cluster-node-1:~# kubectl get nodes -o wide
k8s 워커노드 설정 (선택사항 - 추가 노드가 있을 경우)
워커 노드 에이전트 설치
# curl -sfL <https://get.rke2.io> | INSTALL_RKE2_TYPE="agent" sh -
마스터 노드 연결을 위한 설정 생성
# mkdir -p /etc/rancher/rke2/
# vi /etc/rancher/rke2/config.yaml
# 설정 시작
server: https://172.16.0.42:9345 # keepalived에서 설정한 VIP
token: K10b... # 마스터노드의 토큰 등록
# 설정 끝
RKE2 에이전트 서비스 실행 (워커노드 설치)
# systemctl enable rke2-agent.service
# systemctl start rke2-agent.service
k8s 설치 확인( 마스터 노드에서 확인)
컨트롤 & 워커 노드 확인 - 관리자 권한으로 cluster-node-1에서 실행
root@cluster-node-1:~# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
cluster-node-1 Ready control-plane,etcd,master 135d v1.31.4+rke2r1 172.16.0.1 <none> Ubuntu 22.04.5 LTS 5.15.0-134-generic containerd://1.7.23-k3s2
cluster-node-2 Ready control-plane,etcd,master 135d v1.31.4+rke2r1 172.16.0.2 <none> Ubuntu 22.04.5 LTS 5.15.0-134-generic containerd://1.7.23-k3s2
cluster-node-3 Ready control-plane,etcd,master 135d v1.31.4+rke2r1 172.16.0.3 <none> Ubuntu 22.04.5 LTS 5.15.0-134-generic containerd://1.7.23-k3s2
k8s 필수 요소 설치 확인
root@cluster-node-1:~# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system cloud-controller-manager-cluster89 1/1 Running 0 2d11h
kube-system etcd-cluster89 1/1 Running 0 2d11h
kube-system helm-install-rke2-canal-zphfl 0/1 Completed 0 2d11h
kube-system helm-install-rke2-coredns-mvrkg 0/1 Completed 0 2d11h
kube-system helm-install-rke2-metrics-server-92g5t 0/1 Completed 0 2d11h
kube-system helm-install-rke2-snapshot-controller-crd-qmqpk 0/1 Completed 0 2d11h
kube-system helm-install-rke2-snapshot-controller-qbks8 0/1 Completed 1 2d11h
kube-system helm-install-rke2-snapshot-validation-webhook-qkt58 0/1 Completed 0 2d11h
kube-system kube-apiserver-cluster89 1/1 Running 0 2d11h
kube-system kube-controller-manager-cluster89 1/1 Running 0 2d11h
kube-system kube-proxy-cluster84 1/1 Running 0 19m
kube-system kube-proxy-cluster85 1/1 Running 0 19m
kube-system kube-proxy-cluster89 1/1 Running 0 2d11h
kube-system kube-scheduler-cluster89 1/1 Running 0 2d11h
kube-system rke2-canal-9fzvq 2/2 Running 0 19m
kube-system rke2-canal-tcqhq 2/2 Running 0 2d11h
kube-system rke2-canal-zgzfz 2/2 Running 0 19m
kube-system rke2-coredns-rke2-coredns-867d6d5c55-jh79z 1/1 Running 0 19m
kube-system rke2-coredns-rke2-coredns-867d6d5c55-x9qbt 1/1 Running 0 2d11h
kube-system rke2-coredns-rke2-coredns-autoscaler-54cfb678f-ttdwb 1/1 Running 0 2d11h
kube-system rke2-metrics-server-75866c5bb5-88629 1/1 Running 0 2d11h
kube-system rke2-snapshot-controller-577cdd5b98-cq774 1/1 Running 0 2d11h
kube-system rke2-snapshot-validation-webhook-855f5f7d76-4d2n8 1/1 Running 0 2d11h