RKE2 클러스터 설치하기

Kaite.Kang·2025년 3월 2일

개요

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)

  • RAM: 4GB Minimum (we recommend at least 8GB)
  • CPU: 2 Minimum (we recommend at least 4CPU)

클러스터 내 agent 노드(Worker) 수에 따라서 Server 노드(Master)에 권고하는 스펙이 있다.
클러스터 내 agent 노드 수가 0-225 이내 일때는 Server 노드의 스펙은 최소 CPU 2 core, RAM 4G를 권고한다.

Server CPUServer RAMNumber of Agents
24 GB0-225
48 GB226-450
816 GB451-1300
16+32 GB1300+

OS 설정

RKE2 클러스터를 설치하기 전에 필요한 기본적인 OS 설정을 진행한다. 테스트 환경은 Oracle VirtualBox 플랫폼의 vm으로 구성했고, OS는 RHEL8.10으로 설치했다.

1. Hosts 설정

모든 노드의 /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

2. Swap 비활성화

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

3. 네트워크 설정

각 노드의 IP를 설정한다.

# nmcli con mod enp0s3 ipv4.addr 10.10.0.11/24 ipv4.gateway 10.10.0.1

4. Chronyd 설정

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

5. firewalld 및 SELinux 비활성화

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 Node 구성하기

RKE2 Server를 설치해보자. RKE2 Server는 쿠버네티스의 Master Node와 같은 역할은 한다.

1. RKE2 설치 파일 다운로드

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

2. RKE2 설치

다운로드한 파일을 이용해 RKE2를 설치한다. install.sh 스크립트를 실행하여 설치를 진행한다.

# INSTALL_RKE2_ARTIFACT_PATH=./ sh -x install.sh

3. config.yaml 설정

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

4. RKE2-server 서비스 실행

RKE2-server 서비스를 실행하고, 서비스를 시스템 부팅 시 자동으로 시작하도록 설정한다.

# systemctl enable --now rke2-agent

# journalctl -u rke2-agent -f

5. kubeconfig 및 PATH 설정

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

6. 컨테이너 런타임 소켓 구성

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

7. 노드 및 Pod 상태 확인

설치가 완료된 후, 클러스터 노드와 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 Node 구성하기

RKE2 agent 를 설치해보자. RKE2-agent는 쿠버네티스의 Worker Node와 같은 역할은 한다.

1. 설치 파일 다운로드

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

2. RKE2 agent 설치하기

INSTALL_RKE2_TYPE="agent"로 설정하고 install.sh를 실행하면 rke2-agent 가 설치된다. 에이전트는 서버에서 실행 중인 RKE2 클러스터에 연결하여 클러스터를 관리하는 역할을 한다.

# INSTALL_RKE2_TYPE="agent" INSTALL_RKE2_ARTIFACT_PATH=./ sh -x install.sh

3 RKE2-agent 서비스 실행

설치 후, RKE2-agent 서비스를 활성화해야 한다.

# systemctl enable --now rke2-agent

서비스가 정상적으로 실행되고 있는지 확인하기 위해, journalctl 명령어를 통해 로그를 확인할 수 있다.

# journalctl -u rke2-agent -f

위 명령어는 실시간으로 RKE2 에이전트 로그를 출력해준다. 이를 통해 에이전트가 제대로 작동하는지 모니터링할 수 있다.

4 노드 및 Pod 상태 확인

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" 로 표시된다.

0개의 댓글