RKE2(Rancher Kubernetes Engine 2)는 Rancher Labs에서 개발한 Kubernetes 배포 및 관리 플랫폼이다. 특히 RKE2 위에 Rancher를 많이 구성하는 것 같다. RKE2는 미국 정부의 보안 규정을 준수하는 플랫폼이라고 소개하는 것을 보아서 Kubernetes 배포판에 비해 특히 보안과 안정성을 더해서 패키징 된 것 같다.
클러스터 내 모든 노드는 최소 CPU 2 core, RAM 4G를 되야하며, 최적화를 위한 권고 사양은 CPU 4 core, RAM 8G이다.
(참고: https://docs.rke2.io/install/requirements#linuxwindows)
클러스터 내 agent 노드(Worker) 수에 따라서 Server 노드(Master)에 권고하는 스펙이 있다.
클러스터 내 agent 노드 수가 0-225 이내 일때는 Server 노드의 스펙은 최소 CPU 2 core, RAM 4G를 권고한다.
| Server CPU | Server RAM | Number of Agents |
|---|---|---|
| 2 | 4 GB | 0-225 |
| 4 | 8 GB | 226-450 |
| 8 | 16 GB | 451-1300 |
| 16+ | 32 GB | 1300+ |
RKE2 클러스터를 설치하기 전에 필요한 기본적인 OS 설정을 진행한다. 테스트 환경은 Oracle VirtualBox 플랫폼의 vm으로 구성했고, OS는 RHEL8.10으로 설치했다.
모든 노드의 /etc/hosts 파일에 RKE2 노드 정보를 추가한다. 각 노드의 IP 주소와 호스트명을 매핑한다. 본 테스트에서는 master 노드 1개, worker 노드 2개로 구성했다.
# cat /etc/hosts
10.10.0.11 rke2-m1
10.10.0.12 rke2-w1
10.10.0.13 rke2-w2
RKE2는 swap을 사용하지 않으므로, swap을 비활성화해야 한다. swapoff 명령어로 swap을 비활성화하고, /etc/fstab에서 swap 항목을 주석 처리한다.
# swapoff --all
# cat /etc/fstab | grep swap
#UUID=fe44516b-5def-4599-817f-6018f5e1fc72 none swap defaults 0 0
각 노드의 IP를 설정한다.
# nmcli con mod enp0s3 ipv4.addr 10.10.0.11/24 ipv4.gateway 10.10.0.1
RKE2 노드 및 Rancher에서 관리되는 Downstream Cluster 노드는 모두 시간 동기화가 필요하다. 기본적으로 chronyd 서비스가 활성화되어 있으며, 시간 동기화를 확인할 수 있다.
# systemctl status chronyd
● chronyd.service - NTP client/server
Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2025-02-25 15:46:05 KST; 13min ago
# chronyc sources
RKE2 설치를 위해 firewalld와 SELinux를 비활성화해야 한다.
# setenforce 0
# getenforce
Permissive
# vi /etc/selinux/config
SELINUX=disabled
# systemctl is-active firewalld
inactive
# systemctl is-enabled firewalld
disabled
RKE2 Server를 설치해보자. RKE2 Server는 쿠버네티스의 Master Node와 같은 역할은 한다.
RKE2 설치 파일을 다운로드한다. 최신 버전인 v1.30.3+rke2r1을 사용한다.
# curl -OLs https://github.com/rancher/rke2/releases/download/v1.30.3%2Brke2r1/rke2-images.linux-amd64.tar.zst
# curl -OLs https://github.com/rancher/rke2/releases/download/v1.30.3%2Brke2r1/rke2.linux-amd64.tar.gz
# curl -OLs https://github.com/rancher/rke2/releases/download/v1.30.3%2Brke2r1/sha256sum-amd64.txt
# curl -sfL https://get.rke2.io --output install.sh
다운로드한 파일을 이용해 RKE2를 설치한다. install.sh 스크립트를 실행하여 설치를 진행한다.
# INSTALL_RKE2_ARTIFACT_PATH=./ sh -x install.sh
RKE2의 설정 파일인 config.yaml을 작성한다.
config.yaml 파일 대신 명령줄 인수와 환경 변수를 대신 사용할 수 있다. 명령줄이나 환경 변수는 systemd 서비스로 설치된 RKE2가 활용하기가 쉽지 않기 때문에 수세에서 권고하는 방법은 config.yaml 파일을 사용하는 방법이다.
RKE2 구성 파일은 수동으로 만들어야 한다. RKE2를 시작한 후 config.yaml 이 변경되면 서비스를 다시 시작해야 변경된 값을 적용할 수 있다.
config 파일 작성 예시는 이 링크를 참고할 수 있다.
# mkdir -p /etc/rancher/rke2
# cat <<EOF> /etc/rancher/rke2/config.yaml
token: mytoken
cni: "calico"
tls-san:
- 10.10.0.11
- 10.10.0.12
- 10.10.0.13
- rke2-m1
- rke2-w1
- rke2-w2
- rancher-mng-cluster
disable-cloud-controller: true
write-kubeconfig-mode: "0644"
selinux: false
EOF
RKE2-server 서비스를 실행하고, 서비스를 시스템 부팅 시 자동으로 시작하도록 설정한다.
# systemctl enable --now rke2-agent
# journalctl -u rke2-agent -f
RKE2 설치 후 kubectl 명령어를 사용할 수 있도록 환경 변수를 설정한다.
# yum install bash-completion -y
# echo 'export PATH=$PATH:/var/lib/rancher/rke2/bin' >> ~/.bashrc
# echo 'export KUBECONFIG=/etc/rancher/rke2/rke2.yaml' >> ~/.bashrc
# echo 'alias k=kubectl' >> ~/.bashrc
# source ~/.bashrc
RKE2는 기본적으로 containerd를 사용하지만, 잘못된 소켓 연결로 인해 오류가 발생할 수 있다. 소켓을 명시적으로 지정하여 에러를 해결해보자.
# crictl ps
WARN[0000] runtime connect using default endpoints: [unix:///var/run/dockershim.sock unix:///run/containerd/containerd.sock unix:///run/crio/crio.sock unix:///var/run/cri-dockerd.sock]. As the default settings are now deprecated, you should set the endpoint instead.
ERRO[0000] validate service connection: validate CRI v1 runtime API for endpoint "unix:///var/run/dockershim.sock": rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing: dial unix /var/run/dockershim.sock: connect: no such file or directory"
ERRO[0000] validate service connection: validate CRI v1 runtime API for endpoint "unix:///run/containerd/containerd.sock": rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing: dial unix /run/containerd/containerd.sock: connect: no such file or directory"
ERRO[0000] validate service connection: validate CRI v1 runtime API for endpoint "unix:///run/crio/crio.sock": rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing: dial unix /run/crio/crio.sock: connect: no such file or directory"
ERRO[0000] validate service connection: validate CRI v1 runtime API for endpoint "unix:///var/run/cri-dockerd.sock": rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing: dial unix /var/run/cri-dockerd.sock: connect: no such file or directory"
FATA[0000] validate service connection: validate CRI v1 runtime API for endpoint "unix:///var/run/cri-dockerd.sock": rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing: dial unix /var/run/cri-dockerd.sock: connect: no such file or directory"
# crictl config --set runtime-endpoint=unix:///run/k3s/containerd/containerd.sock
# crictl ps
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID POD
822a6b7fcbea4 7a5c239991f6b 8 minutes ago Running kube-controller-manager 12 337144e4c8446 kube-controller-manager-rke2-m1
02ef302698b5f ac4b460566ae9 9 minutes ago Running tigera-operator 5 f58b86c8edd6e tigera-operator-6c58658696-v49m7
30428d5662851 1ef6c138bd5f2 9 minutes ago Running rke2-snapshot-controller 3 ee6daf896ba35 rke2-snapshot-controller-7dcf5d5b46-jrjsv
ab3aa3fcde99d 7a5c239991f6b 9 minutes ago Running kube-scheduler 4 895dcd45dd173 kube-scheduler-rke2-m1
1b7a88a7e1d33 7a5c239991f6b 9 minutes ago Running kube-apiserver 3 f828b8f6c1340 kube-apiserver-rke2-m1
f2e41dde5e19b f4a42eedee373 10 minutes ago Running rke2-ingress-nginx-controller 2 5f7afc87fd654 rke2-ingress-nginx-controller-mxppb
62201ee88ede1 5c6ffd2b2a1d0 10 minutes ago Running calico-node 2 596abb2f95f80 calico-node-8s4k8
eadca45fe8fa9 3e4fd05c0c1c0 10 minutes ago Running calico-kube-controllers 2 557f99d302a39 calico-kube-controllers-7497fc4576-q56k6
b7599a470c62c 00df8b41cfd2e 10 minutes ago Running coredns 2 8caf6384a345b rke2-coredns-rke2-coredns-64dcf4f58b-9f4rp
956745b43a6ce ff52c2bcf9f88 10 minutes ago Running rke2-snapshot-validation-webhook 2 bdf326e0075a3 rke2-snapshot-validation-webhook-bf7bbd6fc-lwzsf
df932ef2d7da0 cd00dc5289588 10 minutes ago Running autoscaler 2 f25acb0d03ba9 rke2-coredns-rke2-coredns-autoscaler-5749cd7b8b-5l298
7304f368572e6 6d80f01a1966b 10 minutes ago Running metrics-server 2 86f49f49b08be rke2-metrics-server-868fc8795f-nwzfd
dccad82da325b 3497a01296944 10 minutes ago Running etcd 7 8f7de766de7bb etcd-rke2-m1
733d41f6497ef b542f80277bc5 11 minutes ago Running calico-typha 2 9ed6f84584ad8 calico-typha-57b7c48884-9bjgv
171badbffd32c 7a5c239991f6b 12 minutes ago Running kube-proxy 3 8dfbbc79fcd18 kube-proxy-rke2-m1
설치가 완료된 후, 클러스터 노드와 Pod 상태를 확인해보자.
# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
rke2-m1 Ready control-plane,etcd,master 3m28s v1.30.3+rke2r1 10.10.0.11 <none> Red Hat Enterprise Linux 8.10 (Ootpa) 4.18.0-553.el8_10.x86_64 containerd://1.7.17-k3s1
# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
etcd-rke2-m1 1/1 Running 0 3m25s
helm-install-rke2-calico-crd-wx22w 0/1 Completed 0 3m44s
helm-install-rke2-calico-ln74l 0/1 Completed 2 3m44s
helm-install-rke2-coredns-k4qlj 0/1 Completed 0 3m44s
helm-install-rke2-ingress-nginx-nt2h9 0/1 Completed 0 3m44s
helm-install-rke2-metrics-server-sb2tj 0/1 Completed 0 3m44s
helm-install-rke2-snapshot-controller-crd-qzz8n 0/1 Completed 0 3m44s
helm-install-rke2-snapshot-controller-pmpgv 0/1 Completed 0 3m44s
helm-install-rke2-snapshot-validation-webhook-csctc 0/1 Completed 0 3m44s
kube-apiserver-rke2-m1 1/1 Running 0 3m52s
kube-controller-manager-rke2-m1 1/1 Running 0 3m58s
kube-proxy-rke2-m1 1/1 Running 0 3m54s
kube-scheduler-rke2-m1 1/1 Running 0 3m58s
rke2-coredns-rke2-coredns-64dcf4f58b-9f4rp 1/1 Running 0 3m34s
rke2-coredns-rke2-coredns-autoscaler-5749cd7b8b-5l298 1/1 Running 0 3m34s
rke2-ingress-nginx-controller-mxppb 1/1 Running 0 105s
rke2-metrics-server-868fc8795f-nwzfd 1/1 Running 0 115s
rke2-snapshot-controller-7dcf5d5b46-jrjsv 1/1 Running 0 117s
rke2-snapshot-validation-webhook-bf7bbd6fc-lwzsf 1/1 Running 0 2m2s
RKE2 agent 를 설치해보자. RKE2-agent는 쿠버네티스의 Worker Node와 같은 역할은 한다.
RKE2 에이전트 설치를 위한 파일을 다운로드한다.
# curl -OLs https://github.com/rancher/rke2/releases/download/v1.30.3%2Brke2r1/rke2-images.linux-amd64.tar.zst
# curl -OLs https://github.com/rancher/rke2/releases/download/v1.30.3%2Brke2r1/rke2.linux-amd64.tar.gz
# curl -OLs https://github.com/rancher/rke2/releases/download/v1.30.3%2Brke2r1/sha256sum-amd64.txt
# curl -sfL https://get.rke2.io --output install.sh
INSTALL_RKE2_TYPE="agent"로 설정하고 install.sh를 실행하면 rke2-agent 가 설치된다. 에이전트는 서버에서 실행 중인 RKE2 클러스터에 연결하여 클러스터를 관리하는 역할을 한다.
# INSTALL_RKE2_TYPE="agent" INSTALL_RKE2_ARTIFACT_PATH=./ sh -x install.sh
설치 후, RKE2-agent 서비스를 활성화해야 한다.
# systemctl enable --now rke2-agent
서비스가 정상적으로 실행되고 있는지 확인하기 위해, journalctl 명령어를 통해 로그를 확인할 수 있다.
# journalctl -u rke2-agent -f
위 명령어는 실시간으로 RKE2 에이전트 로그를 출력해준다. 이를 통해 에이전트가 제대로 작동하는지 모니터링할 수 있다.
RKE2 에이전트가 설치된 후, 클러스터에 정상적으로 연결되어 있는지 확인해보자.
아래 명령어는 Master 노드인 RKE2-Server 노드에서 수행하면 된다.
# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
rke2-m1 Ready control-plane,etcd,master 4d10h v1.30.3+rke2r1 10.10.0.11 <none> Red Hat Enterprise Linux 8.10 (Ootpa) 4.18.0-553.el8_10.x86_64 containerd://1.7.17-k3s1
rke2-w1 Ready <none> 24m v1.30.3+rke2r1 10.10.0.12 <none> Red Hat Enterprise Linux 8.10 (Ootpa) 4.18.0-553.el8_10.x86_64 containerd://1.7.17-k3s1
rke2-w2 Ready <none> 4m27s v1.30.3+rke2r1 10.10.0.13 <none> Red Hat Enterprise Linux 8.10 (Ootpa) 4.18.0-553.el8_10.x86_64 containerd://1.7.17-k3s1
위 명령어로 RKE2 클러스터의 모든 노드 상태를 확인할 수 있다. 정상적으로 구성되었다면 모든 노드가 "Ready" 로 표시된다.