Cloudnet K8s Deploy 7주차 스터디를 진행하며 정리한 글입니다.
RKE2 소개

RKE2(Rancher Kubernetes Engine 2)는 SUSE가 제공하는 엔터프라이즈용 Kubernetes 배포판입니다. 기존 RKE를 보안 중심으로 재설계한 버전으로, CIS Benchmark를 기본적으로 고려해 구성되어 있습니다. Docker 대신 containerd를 사용하며, 컨트롤 플레인 구성 요소가 패키징되어 있어 설치와 운영이 비교적 단순합니다. 폐쇄망 환경도 지원해 금융·공공기관과 같은 보안 요구사항이 높은 환경에 적합합니다.
RKE2 실습
[root@k8s-node1 ~]# curl -sfL https://get.rke2.io --output install.sh
[root@k8s-node1 ~]# chmod +x install.sh
INSTALL_RKE2_CHANNEL=v1.33 ./install.sh
[INFO] using stable RPM repositories
[INFO] using 1.33 series from channel stable
Rancher RKE2 Common (v1.33) 62 B/s | 659 B 00:10
Rancher RKE2 Common (v1.33) 448 B/s | 2.4 kB 00:05
Importing GPG key 0xE257814A:
Userid : "Rancher (CI) <ci@rancher.com>"
Fingerprint: C8CF F216 4551 26E9 B9C9 18BE 925E A29A E257 814A
From : https://rpm.rancher.io/public.key
Rancher RKE2 Common (v1.33) 172 B/s | 2.6 kB 00:15
Rancher RKE2 1.33 (v1.33) 59 B/s | 659 B 00:11
Rancher RKE2 1.33 (v1.33) 467 B/s | 2.4 kB 00:05
Importing GPG key 0xE257814A:
Userid : "Rancher (CI) <ci@rancher.com>"
Fingerprint: C8CF F216 4551 26E9 B9C9 18BE 925E A29A E257 814A
From : https://rpm.rancher.io/public.key
Rancher RKE2 1.33 (v1.33) 382 B/s | 5.9 kB 00:15
Dependencies resolved.
===============================================================================================================================================================================================
Package Architecture Version Repository Size
===============================================================================================================================================================================================
Installing:
rke2-server aarch64 1.33.8~rke2r1-0.el9 rancher-rke2-1.33-stable 8.3 k
Installing dependencies:
rke2-common aarch64 1.33.8~rke2r1-0.el9 rancher-rke2-1.33-stable 25 M
rke2-selinux noarch 0.22-1.el9 rancher-rke2-common-stable 22 k
Transaction Summary
===============================================================================================================================================================================================
Install 3 Packages
Total download size: 25 M
Installed size: 113 M
Downloading Packages:
(1/3): rke2-server-1.33.8~rke2r1-0.el9.aarch64.rpm 1.6 kB/s | 8.3 kB 00:05
(2/3): rke2-selinux-0.22-1.el9.noarch.rpm 4.1 kB/s | 22 kB 00:05
(3/3): rke2-common-1.33.8~rke2r1-0.el9.aarch64.rpm 3.8 MB/s | 25 MB 00:06
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total 3.8 MB/s | 25 MB 00:06
Rancher RKE2 Common (v1.33) 471 B/s | 2.4 kB 00:05
Importing GPG key 0xE257814A:
Userid : "Rancher (CI) <ci@rancher.com>"
Fingerprint: C8CF F216 4551 26E9 B9C9 18BE 925E A29A E257 814A
From : https://rpm.rancher.io/public.key
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Running scriptlet: rke2-selinux-0.22-1.el9.noarch 1/3
Installing : rke2-selinux-0.22-1.el9.noarch 1/3
Running scriptlet: rke2-selinux-0.22-1.el9.noarch 1/3
Installing : rke2-common-1.33.8~rke2r1-0.el9.aarch64 2/3
Installing : rke2-server-1.33.8~rke2r1-0.el9.aarch64 3/3
Running scriptlet: rke2-server-1.33.8~rke2r1-0.el9.aarch64 3/3
Running scriptlet: rke2-selinux-0.22-1.el9.noarch 3/3
Running scriptlet: rke2-server-1.33.8~rke2r1-0.el9.aarch64 3/3
Verifying : rke2-selinux-0.22-1.el9.noarch 1/3
Verifying : rke2-common-1.33.8~rke2r1-0.el9.aarch64 2/3
Verifying : rke2-server-1.33.8~rke2r1-0.el9.aarch64 3/3
Installed:
rke2-common-1.33.8~rke2r1-0.el9.aarch64 rke2-selinux-0.22-1.el9.noarch rke2-server-1.33.8~rke2r1-0.el9.aarch64
Complete!
[root@k8s-node1 ~]# rke2 --version
rke2 version v1.33.8+rke2r1 (eb75e3c1774cee5a584259d6fee77eb8cfa9b430)
go version go1.24.12 X:boringcrypto
[root@k8s-node1 ~]# dnf repolist
repo id repo name
appstream Rocky Linux 9 - AppStream
baseos Rocky Linux 9 - BaseOS
extras Rocky Linux 9 - Extras
rancher-rke2-1.33-stable Rancher RKE2 1.33 (v1.33)
rancher-rke2-common-stable Rancher RKE2 Common (v1.33)
[root@k8s-node1 ~]# tree /etc/yum.repos.d/
/etc/yum.repos.d/
├── rancher-rke2.repo
├── rocky-addons.repo
├── rocky-devel.repo
├── rocky-extras.repo
└── rocky.repo
0 directories, 5 files
[root@k8s-node1 ~]# cat /etc/yum.repos.d/rancher-rke2.repo
[rancher-rke2-common-stable]
name=Rancher RKE2 Common (v1.33)
baseurl=https://rpm.rancher.io/rke2/stable/common/centos/9/noarch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://rpm.rancher.io/public.key
[rancher-rke2-1.33-stable]
name=Rancher RKE2 1.33 (v1.33)
baseurl=https://rpm.rancher.io/rke2/stable/1.33/centos/9/aarch64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://rpm.rancher.io/public.key
# 디렉터리 생성 확인
[root@k8s-node1 ~]# tree /etc/rancher/
/etc/rancher/
└── rke2
1 directory, 0 files
[root@k8s-node1 ~]# tree /var/lib/rancher/
/var/lib/rancher/
└── rke2
├── agent
│ ├── containerd
│ │ └── io.containerd.snapshotter.v1.overlayfs
│ │ └── snapshots
│ └── logs
├── data
└── server
8 directories, 0 files
# RKE2 설정 : cni 플러그인(canal) 등
[root@k8s-node1 ~]# cat << EOF > /etc/rancher/rke2/config.yaml
write-kubeconfig-mode: "0644"
debug: true
cni: canal
bind-address: 192.168.10.11
advertise-address: 192.168.10.11
node-ip: 192.168.10.11
disable-cloud-controller: true
disable:
- servicelb
- rke2-coredns-autoscaler
- rke2-ingress-nginx
- rke2-snapshot-controller
- rke2-snapshot-controller-crd
- rke2-snapshot-validation-webhook
EOF
# canal cni 플러그인 helm chart values 파일 작성
# https://docs.rke2.io/networking/basic_network_options
[root@k8s-node1 ~]# mkdir -p /var/lib/rancher/rke2/server/manifests/
[root@k8s-node1 ~]# cat << EOF > /var/lib/rancher/rke2/server/manifests/rke2-canal-config.yaml
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
name: rke2-canal
namespace: kube-system
spec:
valuesContent: |-
flannel:
iface: "enp0s9"
EOF
# coredns 의 autoscaler 미설치를 위한 helm chart values 파일 작성
[root@k8s-node1 ~]# cat << EOF > /var/lib/rancher/rke2/server/manifests/rke2-coredns-config.yaml
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
name: rke2-coredns
namespace: kube-system
spec:
valuesContent: |-
autoscaler:
enabled: false
EOF
# 모니터링 : 신규 터미널창
Every 2.0s: pstree -a k8s-node1: Mon Feb 23 06:01:54 2026
systemd no_timer_check --switched-root --system --deserialize 31
|-NetworkManager --no-daemon
| `-2*[{NetworkManager}]
|-VBoxService --pidfile /var/run/vboxadd-service.sh
| `-8*[{VBoxService}]
|-agetty -o -p -- \\u --noclear - linux
|-anacron -s
|-atd -f
|-auditd
| |-sedispatch
| `-2*[{auditd}]
|-chronyd -F 2
|-crond -n
|-dbus-broker-lau --scope system --audit
| `-dbus-broker --log 4 --controller 9 --machine-id 3b2405e60e2a4236814b5ee5095ec74f --max-bytes 536870912 --max-fds 4096 --max-matches 131072 --audit
|-gpg-agent --homedir /var/cache/dnf/rancher-rke2-common-stable-38dcbd8c1e621b96/pubring --use-standard-socket --daemon
| |-scdaemon --multi-server --homedir /var/cache/dnf/rancher-rke2-common-stable-38dcbd8c1e621b96/pubring
| | `-{scdaemon}
| `-{gpg-agent}
|-gpg-agent --homedir /var/cache/dnf/rancher-rke2-1.33-stable-ecd687a1e3012961/pubring --use-standard-socket --daemon
# RKE2 시작 : 2분 정도 소요 -> coredns 파드까지 정상화 대략 1~2분 추가 소요
[root@k8s-node1 ~]# systemctl enable --now rke2-server.service
Created symlink /etc/systemd/system/multi-user.target.wants/rke2-server.service → /usr/lib/systemd/system/rke2-server.service.
[root@k8s-node1 ~]# pstree -a | grep -v color | grep 'rke2$' -A5
|-rke2
| |-containerd -c /var/lib/rancher/rke2/agent/etc/containerd/config.toml
| | `-12*[{containerd}]
| |-kubelet --volume-plugin-dir=/var/lib/kubelet/volumeplugins --file-check-frequency=5s --sync-frequency=30s...
| | `-16*[{kubelet}]
| `-11*[{rke2}]
[root@k8s-node1 ~]# pstree -a | grep -v color | grep 'containerd-shim ' -A2
|-containerd-shim -namespace k8s.io -id88344110551ed4fde4bf09fd9c7
| |-etcd --config-file=/var/lib/rancher/rke2/server/db/etcd/config
| | `-9*[{etcd}]
--
|-containerd-shim -namespace k8s.io -idbb4b8065833472be21fe676308f
| |-kube-proxy --cluster-cidr=10.42.0.0/16 --conntrack-max-per-core=0 --conntrack-tcp-timeout-close-wait=0s...
| | `-7*[{kube-proxy}]
--
|-containerd-shim -namespace k8s.io -id1524b3e2df0bdd9e189009ae36f
| |-kube-apiserver --admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml --advertise-address=192.168.10.11...
| | `-11*[{kube-apiserver}]
--
|-containerd-shim -namespace k8s.io -ide0b4bdbe434721b4a1f44f0349e
| |-kube-scheduler --permit-port-sharing=true ...
| | `-9*[{kube-scheduler}]
--
|-containerd-shim -namespace k8s.io -id6f3b2d3a4c6a211ff764bc472f1
| |-kube-controller --permit-port-sharing=true --flex-volume-plugin-dir=/var/lib/kubelet/volumeplugins--terminated-pod-gc-thres
| | `-6*[{kube-controller}]
--
|-containerd-shim -namespace k8s.io -id0e4c3909fbf2e6f18bb5b436134
| |-pause
| `-10*[{containerd-shim}]
|-containerd-shim -namespace k8s.io -id68674ccda6bf02469a45f21cf6c
| |-pause
| `-10*[{containerd-shim}]
# 자격증명 파일 복사
[root@k8s-node1 ~]# ls -l /etc/rancher/rke2/rke2.yaml
-rw-r--r--. 1 root root 2973 Feb 23 06:02 /etc/rancher/rke2/rke2.yaml
[root@k8s-node1 ~]# cp /etc/rancher/rke2/rke2.yaml ~/.kube/config
# /etc/rancher 디렉터리 확인
[root@k8s-node1 ~]# tree /etc/rancher/
/etc/rancher/
├── node
│ └── password
└── rke2
├── config.yaml
├── rke2-pss.yaml
└── rke2.yaml
2 directories, 4 files
# 바이너리 파일 확인
[root@k8s-node1 ~]# tree /var/lib/rancher/rke2/bin/
/var/lib/rancher/rke2/bin/
├── containerd
├── containerd-shim-runc-v2
├── crictl
├── ctr
├── kubectl
├── kubelet
└── runc
0 directories, 7 files
# PATH 안 건드리고 표준 위치로 바이너리 노출 설정 : 심볼릭 링크 방식
[root@k8s-node1 ~]# ln -s /var/lib/rancher/rke2/bin/containerd /usr/local/bin/containerd
[root@k8s-node1 ~]# ln -s /var/lib/rancher/rke2/bin/kubectl /usr/local/bin/kubectl
[root@k8s-node1 ~]# ln -s /var/lib/rancher/rke2/bin/crictl /usr/local/bin/crictl
[root@k8s-node1 ~]# ln -s /var/lib/rancher/rke2/bin/runc /usr/local/bin/runc
[root@k8s-node1 ~]# ln -s /var/lib/rancher/rke2/bin/ctr /usr/local/bin/ctr
[root@k8s-node1 ~]# ln -s /var/lib/rancher/rke2/agent/etc/crictl.yaml /etc/crictl.yaml
[root@k8s-node1 ~]# runc --version
runc version 1.4.0
commit: v1.4.0-0-g8bd78a99
spec: 1.3.0
go: go1.24.11 X:boringcrypto
libseccomp: 2.5.4
[root@k8s-node1 ~]# containerd --version
containerd github.com/k3s-io/containerd v2.1.5-k3s1 e77c15f30e5162d6abab671b0d74ca2243e2916e
[root@k8s-node1 ~]# kubectl version
Client Version: v1.33.8+rke2r1
Kustomize Version: v5.6.0
Server Version: v1.33.8+rke2r1
# 편의성 설정
[root@k8s-node1 ~]# source <(kubectl completion bash)
alias k=kubectl
complete -F __start_kubectl k
echo 'source <(kubectl completion bash)' >> /etc/profile
echo 'alias k=kubectl' >> /etc/profile
echo 'complete -F __start_kubectl k' >> /etc/profile
[root@k8s-node1 ~]# kubectl cluster-info -v=6
I0223 06:09:46.771465 12296 loader.go:402] Config loaded from file: /root/.kube/config
I0223 06:09:46.772287 12296 envvar.go:172] "Feature gate default state" feature="InformerResourceVersion" enabled=false
I0223 06:09:46.772307 12296 envvar.go:172] "Feature gate default state" feature="InOrderInformers" enabled=true
I0223 06:09:46.772312 12296 envvar.go:172] "Feature gate default state" feature="WatchListClient" enabled=false
I0223 06:09:46.772315 12296 envvar.go:172] "Feature gate default state" feature="ClientsAllowCBOR" enabled=false
I0223 06:09:46.772319 12296 envvar.go:172] "Feature gate default state" feature="ClientsPreferCBOR" enabled=false
I0223 06:09:46.776487 12296 round_trippers.go:632] "Response" verb="GET" url="https://192.168.10.11:6443/api?timeout=32s" status="200 OK" milliseconds=3
I0223 06:09:46.778659 12296 round_trippers.go:632] "Response" verb="GET" url="https://192.168.10.11:6443/apis?timeout=32s" status="200 OK" milliseconds=0
I0223 06:09:46.789710 12296 round_trippers.go:632] "Response" verb="GET" url="https://192.168.10.11:6443/api/v1/namespaces/kube-system/services?labelSelector=kubernetes.io%2Fcluster-service%3Dtrue" status="200 OK" milliseconds=2
Kubernetes control plane is running at https://192.168.10.11:6443
CoreDNS is running at https://192.168.10.11:6443/api/v1/namespaces/kube-system/services/rke2-coredns-rke2-coredns:udp-53/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
# 노드, 파드 정보 확인
[root@k8s-node1 ~]# kubectl get node -owide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-node1 Ready control-plane,etcd,master 4m13s v1.33.8+rke2r1 192.168.10.11 <none> Rocky Linux 9.6 (Blue Onyx) 5.14.0-570.52.1.el9_6.aarch64 containerd://2.1.5-k3s1
[root@k8s-node1 ~]# helm list -A
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
rke2-canal kube-system 1 2026-02-22 21:07:14.396735594 +0000 UTC deployed rke2-canal-v3.31.3-build2026020600 v3.31.3
rke2-coredns kube-system 1 2026-02-22 21:07:14.422743523 +0000 UTC deployed rke2-coredns-1.45.201 1.13.1
rke2-metrics-server kube-system 1 2026-02-22 21:08:06.964477155 +0000 UTC deployed rke2-metrics-server-3.13.007 0.8.0
rke2-runtimeclasses kube-system 1 2026-02-22 21:08:08.967529212 +0000 UTC deployed rke2-runtimeclasses-0.1.000 0.1.0
[root@k8s-node1 ~]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system etcd-k8s-node1 1/1 Running 0 3m34s
kube-system helm-install-rke2-canal-cn9bh 0/1 Completed 0 4m9s
kube-system helm-install-rke2-coredns-t87xt 0/1 Completed 0 4m9s
kube-system helm-install-rke2-metrics-server-wpjzt 0/1 Completed 0 4m9s
kube-system helm-install-rke2-runtimeclasses-5pn9f 0/1 Completed 0 4m9s
kube-system kube-apiserver-k8s-node1 1/1 Running 0 3m34s
kube-system kube-controller-manager-k8s-node1 1/1 Running 0 3m34s
kube-system kube-proxy-k8s-node1 1/1 Running 0 3m34s
kube-system kube-scheduler-k8s-node1 1/1 Running 0 3m34s
kube-system rke2-canal-9wqbn 2/2 Running 0 2m54s
kube-system rke2-coredns-rke2-coredns-559595db99-lv2ww 1/1 Running 0 2m55s
kube-system rke2-metrics-server-fdcdf575d-vxcnw 1/1 Running 0 2m2s
# 디렉터리 확인
[root@k8s-node1 ~]# tree /var/lib/rancher/rke2 -L 1
/var/lib/rancher/rke2
├── agent
├── bin -> /var/lib/rancher/rke2/data/v1.33.8-rke2r1-1b2872361ec5/bin
├── data
└── server
4 directories, 0 files
# server 디렉터리
[root@k8s-node1 ~]# tree /var/lib/rancher/rke2/server/ -L 1
/var/lib/rancher/rke2/server/
├── agent-token -> /var/lib/rancher/rke2/server/token
├── cred
├── db
├── etc
├── manifests
├── node-token -> /var/lib/rancher/rke2/server/token
├── tls
└── token
5 directories, 3 files
[root@k8s-node1 ~]# ls -l /var/lib/rancher/rke2/server/
total 12
lrwxrwxrwx. 1 root root 34 Feb 23 06:02 agent-token -> /var/lib/rancher/rke2/server/token
drwx------. 2 root root 4096 Feb 23 06:02 cred
drwx------. 4 root root 35 Feb 23 06:05 db
drwx------. 2 root root 66 Feb 23 06:02 etc
drwxr-xr-x. 2 root root 180 Feb 23 06:05 manifests
lrwxrwxrwx. 1 root root 34 Feb 23 06:02 node-token -> /var/lib/rancher/rke2/server/token
drwx------. 6 root root 4096 Feb 23 06:02 tls
-rw-------. 1 root root 109 Feb 23 06:02 token
[root@k8s-node1 ~]# cat /var/lib/rancher/rke2/server/node-token
K10dc56af1974bf2a4a0dafabf6ada975428ac30b1cdfaee37aa24bab82bc13ba44::server:0f98c22f8008e212824486083fde55dd
[root@k8s-node1 ~]# cat /var/lib/rancher/rke2/server/token
K10dc56af1974bf2a4a0dafabf6ada975428ac30b1cdfaee37aa24bab82bc13ba44::server:0f98c22f8008e212824486083fde55dd
## helm chart manifests + values 포함
[root@k8s-node1 ~]# cat /var/lib/rancher/rke2/server/manifests/rke2-coredns.yaml
apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
annotations:
helm.cattle.io/chart-url: https://rke2-charts.rancher.io/assets/rke2-coredns/rke2-coredns-1.45.201.tgz
rke2.cattle.io/inject-cluster-config: "true"
name: rke2-coredns
namespace: kube-system
spec:
bootstrap: true
chartContent: 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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAOzBsQAAAADAIH/rXbOoBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAA7MGxAAAAAMAgf+tds6gGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkADswbEAAAAAwCB/612zqAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAOzBsQAAAADAIH/rXbOoBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAA7MGxAAAAAMAgf+tds6gGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkADswbEAAAAAwCB/612zqAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAOzBsQAAAADAIH/rXbOoBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAA7MGxAAAAAMAgf+tds6gGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkADswbEAAAAAwCB/612zqAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAOzBsQAAAADAIH/rXbOoBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAA7MGxAAAAAMAgf+tds6gGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkADswbEAAAAAwCB/612zqAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAOzBsQAAAADAIH/rXbOoBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAA7MGxAAAAAMAgf+tds6gGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkADswbEAAAAAwCB/612zqAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAOzBsQAAAADAIH/rXbOoBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAA7MGxAAAAAMAgf+tds6gGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkADswbEAAAAAwCB/612zqAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAOzBsQAAAADAIH/rXbOoBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAA7MGxAAAAAMAgf+tds6gGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkADswbEAAAAAwCB/612zqAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAOzBsQAAAADAIH/rXbOoBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAA7MGxAAAAAMAgf+tds6gGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkADswbEAAAAAwCB/612zqAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAOzBsQAAAADAIH/rXbOoBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAA7MGxAAAAAMAgf+tds6gGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkADtwbEAAAAAwCB/612zqAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ3sSQqgAAQAA=
set:
global.clusterCIDR: 10.42.0.0/16
global.clusterCIDRv4: 10.42.0.0/16
global.clusterDNS: 10.43.0.10
global.clusterDomain: cluster.local
global.rke2DataDir: /var/lib/rancher/rke2
global.serviceCIDR: 10.43.0.0/16
global.systemDefaultIngressClass: ingress-nginx
워커 노드 추가
[k8s-node1]
# A token that can be used to register other server or agent nodes
[root@k8s-node1 ~]# cat /var/lib/rancher/rke2/server/node-token
K10dc56af1974bf2a4a0dafabf6ada975428ac30b1cdfaee37aa24bab82bc13ba44::server:0f98c22f8008e212824486083fde55dd
# 노드(서버/에이전트)가 RKE2 클러스터에 조인할 때 사용하는 전용 관리/부트스트랩 API 포트 확인
[root@k8s-node1 ~]# ss -tnlp | grep 9345
LISTEN 0 4096 192.168.10.11:9345 0.0.0.0:* users:(("rke2",pid=6496,fd=6))
LISTEN 0 4096 127.0.0.1:9345 0.0.0.0:* users:(("rke2",pid=6496,fd=7))
LISTEN 0 4096 [::1]:9345 [::]:* users:(("rke2",pid=6496,fd=8))
[root@k8s-node1 ~]# watch -d 'kubectl get node; echo; kubectl get pod -n kube-system'
Every 2.0s: kubectl get node; echo; kubectl get pod -n kube-system k8s-node1: Mon Feb 23 06:15:40 2026
NAME STATUS ROLES AGE VERSION
k8s-node1 Ready control-plane,etcd,master 9m49s v1.33.8+rke2r1
NAME READY STATUS RESTARTS AGE
etcd-k8s-node1 1/1 Running 0 9m5s
helm-install-rke2-canal-cn9bh 0/1 Completed 0 9m40s
helm-install-rke2-coredns-t87xt 0/1 Completed 0 9m40s
helm-install-rke2-metrics-server-wpjzt 0/1 Completed 0 9m40s
helm-install-rke2-runtimeclasses-5pn9f 0/1 Completed 0 9m40s
kube-apiserver-k8s-node1 1/1 Running 0 9m5s
kube-controller-manager-k8s-node1 1/1 Running 0 9m5s
kube-proxy-k8s-node1 1/1 Running 0 9m5s
kube-scheduler-k8s-node1 1/1 Running 0 9m5s
rke2-canal-9wqbn 2/2 Running 0 8m25s
rke2-coredns-rke2-coredns-559595db99-lv2ww 1/1 Running 0 8m26s
rke2-metrics-server-fdcdf575d-vxcnw 1/1 Running 0 7m33s
---
[k8s-node2]
# Run the installer
[root@k8s-node2 ~]# curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE="agent" INSTALL_RKE2_CHANNEL=v1.33 sh -
[INFO] using stable RPM repositories
[INFO] using 1.33 series from channel stable
Rancher RKE2 Common (v1.33) 62 B/s | 659 B 00:10
Rancher RKE2 Common (v1.33) 472 B/s | 2.4 kB 00:05
Importing GPG key 0xE257814A:
Userid : "Rancher (CI) <ci@rancher.com>"
Fingerprint: C8CF F216 4551 26E9 B9C9 18BE 925E A29A E257 814A
From : https://rpm.rancher.io/public.key
Rancher RKE2 Common (v1.33) 166 B/s | 2.6 kB 00:16
Rancher RKE2 1.33 (v1.33) 64 B/s | 659 B 00:10
Rancher RKE2 1.33 (v1.33) 472 B/s | 2.4 kB 00:05
Importing GPG key 0xE257814A:
Userid : "Rancher (CI) <ci@rancher.com>"
Fingerprint: C8CF F216 4551 26E9 B9C9 18BE 925E A29A E257 814A
From : https://rpm.rancher.io/public.key
Rancher RKE2 1.33 (v1.33) 388 B/s | 5.9 kB 00:15
Dependencies resolved.
===============================================================================================================================================================================================
Package Architecture Version Repository Size
===============================================================================================================================================================================================
Installing:
rke2-agent aarch64 1.33.8~rke2r1-0.el9 rancher-rke2-1.33-stable 8.3 k
Installing dependencies:
rke2-common aarch64 1.33.8~rke2r1-0.el9 rancher-rke2-1.33-stable 25 M
rke2-selinux noarch 0.22-1.el9 rancher-rke2-common-stable 22 k
Transaction Summary
===============================================================================================================================================================================================
Install 3 Packages
Total download size: 25 M
Installed size: 113 M
Downloading Packages:
(1/3): rke2-selinux-0.22-1.el9.noarch.rpm 4.2 kB/s | 22 kB 00:05
(2/3): rke2-agent-1.33.8~rke2r1-0.el9.aarch64.rpm 1.5 kB/s | 8.3 kB 00:05
(3/3): rke2-common-1.33.8~rke2r1-0.el9.aarch64.rpm 4.0 MB/s | 25 MB 00:06
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total 4.0 MB/s | 25 MB 00:06
Rancher RKE2 Common (v1.33) 472 B/s | 2.4 kB 00:05
Importing GPG key 0xE257814A:
Userid : "Rancher (CI) <ci@rancher.com>"
Fingerprint: C8CF F216 4551 26E9 B9C9 18BE 925E A29A E257 814A
From : https://rpm.rancher.io/public.key
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Running scriptlet: rke2-selinux-0.22-1.el9.noarch 1/3
Installing : rke2-selinux-0.22-1.el9.noarch 1/3
Running scriptlet: rke2-selinux-0.22-1.el9.noarch 1/3
Installing : rke2-common-1.33.8~rke2r1-0.el9.aarch64 2/3
Installing : rke2-agent-1.33.8~rke2r1-0.el9.aarch64 3/3
Running scriptlet: rke2-agent-1.33.8~rke2r1-0.el9.aarch64 3/3
Running scriptlet: rke2-selinux-0.22-1.el9.noarch 3/3
Running scriptlet: rke2-agent-1.33.8~rke2r1-0.el9.aarch64 3/3
Verifying : rke2-selinux-0.22-1.el9.noarch 1/3
Verifying : rke2-agent-1.33.8~rke2r1-0.el9.aarch64 2/3
Verifying : rke2-common-1.33.8~rke2r1-0.el9.aarch64 3/3
Installed:
rke2-agent-1.33.8~rke2r1-0.el9.aarch64 rke2-common-1.33.8~rke2r1-0.el9.aarch64 rke2-selinux-0.22-1.el9.noarch
Complete!
[root@k8s-node2 ~]# TOKEN=K10dc56af1974bf2a4a0dafabf6ada975428ac30b1cdfaee37aa24bab82bc13ba44::server:0f98c22f8008e212824486083fde55dd
[root@k8s-node2 ~]# cat << EOF > /etc/rancher/rke2/config.yaml
server: https://192.168.10.11:9345
token: $TOKEN
EOF
[root@k8s-node2 ~]# systemctl enable --now rke2-agent.service
Created symlink /etc/systemd/system/multi-user.target.wants/rke2-agent.service → /usr/lib/systemd/system/rke2-agent.service.
---
[root@k8s-node1 ~]# kubectl get node -owide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-node1 Ready control-plane,etcd,master 21m v1.33.8+rke2r1 192.168.10.11 <none> Rocky Linux 9.6 (Blue Onyx) 5.14.0-570.52.1.el9_6.aarch64 containerd://2.1.5-k3s1
k8s-node2 Ready <none> 2m10s v1.33.8+rke2r1 192.168.10.12 <none> Rocky Linux 9.6 (Blue Onyx) 5.14.0-570.52.1.el9_6.aarch64 containerd://2.1.5-k3s1
---
[k8s-node2]
# 디렉터리 확인
[root@k8s-node2 ~]# tree /var/lib/rancher/rke2 -L 1
/var/lib/rancher/rke2
├── agent
├── bin -> /var/lib/rancher/rke2/data/v1.33.8-rke2r1-1b2872361ec5/bin
├── data
└── server
4 directories, 0 files
# rke2-agent
[root@k8s-node2 ~]# systemctl status rke2-agent.service --no-pager
● rke2-agent.service - Rancher Kubernetes Engine v2 (agent)
Loaded: loaded (/usr/lib/systemd/system/rke2-agent.service; enabled; preset: disabled)
Active: active (running) since Mon 2026-02-23 06:25:20 KST; 3min 8s ago
Docs: https://github.com/rancher/rke2#readme
Process: 6372 ExecStartPre=/sbin/modprobe br_netfilter (code=exited, status=0/SUCCESS)
Process: 6373 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)
Main PID: 6374 (rke2)
Tasks: 59
Memory: 2.2G
CPU: 37.756s
CGroup: /system.slice/rke2-agent.service
├─6374 "/usr/bin/rke2 agent"
├─6397 containerd -c /var/lib/rancher/rke2/agent/etc/containerd/config.toml
├─6455 kubelet --volume-plugin-dir=/var/lib/kubelet/volumeplugins --file-check-frequency=5s --sync-frequency=30s --config-dir=/var/lib/rancher/rke2/agent/etc/kubelet.conf.d --co…
├─6518 /var/lib/rancher/rke2/data/v1.33.8-rke2r1-1b2872361ec5/bin/containerd-shim-runc-v2 -namespace k8s.io -id 51b9f02e55775472f04a5e01fd88c2148cfd6d56ab2df6e59023b653d45e39a9 …
└─6520 /var/lib/rancher/rke2/data/v1.33.8-rke2r1-1b2872361ec5/bin/containerd-shim-runc-v2 -namespace k8s.io -id 677b5182e8e8a2247e49513207b6cb10d57fd11374e83da2bdae951223a2edbc …
Feb 23 06:24:56 k8s-node2 rke2[6374]: I0223 06:24:56.200674 6374 event.go:389] "Event occurred" object="k8s-node2" fieldPath="" kind="Node" apiVersion="" type="Normal" reas…by rke2 are OK"
Feb 23 06:25:20 k8s-node2 rke2[6374]: time="2026-02-23T06:25:20+09:00" level=error msg="Failed to process image event: failed to import /var/lib/rancher/rke2/agent/images/kube-proxy-image.tx…
Feb 23 06:25:20 k8s-node2 rke2[6374]: time="2026-02-23T06:25:20+09:00" level=info msg="Pulling images from /var/lib/rancher/rke2/agent/images/runtime-image.txt"
Feb 23 06:25:20 k8s-node2 rke2[6374]: time="2026-02-23T06:25:20+09:00" level=info msg="Pulling image index.docker.io/rancher/rke2-runtime:v1.33.8-rke2r1"
Feb 23 06:25:20 k8s-node2 rke2[6374]: time="2026-02-23T06:25:20+09:00" level=info msg="Running kubelet --alsologtostderr=false --config-dir=/var/lib/rancher/rke2/agent/etc/kubelet.conf.d --c…
Feb 23 06:25:20 k8s-node2 rke2[6374]: time="2026-02-23T06:25:20+09:00" level=info msg="Annotations and labels have been set successfully on node: k8s-node2"
Feb 23 06:25:20 k8s-node2 rke2[6374]: time="2026-02-23T06:25:20+09:00" level=info msg="rke2 agent is up and running"
Feb 23 06:25:20 k8s-node2 systemd[1]: Started Rancher Kubernetes Engine v2 (agent).
Feb 23 06:25:57 k8s-node2 rke2[6374]: time="2026-02-23T06:25:57+09:00" level=error msg="Failed to process image event: failed to import /var/lib/rancher/rke2/agent/images/runtime-image.txt: …
Feb 23 06:26:37 k8s-node2 rke2[6374]: time="2026-02-23T06:26:37+09:00" level=info msg="Tunnel authorizer set Kubelet Port 0.0.0.0:10250"
Hint: Some lines were ellipsized, use -l to show in full.
[root@k8s-node2 ~]# cat /usr/lib/systemd/system/rke2-agent.service
[Unit]
Description=Rancher Kubernetes Engine v2 (agent)
Documentation=https://github.com/rancher/rke2#readme
Wants=network-online.target
After=network-online.target
Conflicts=rke2-server.service
[Install]
WantedBy=multi-user.target
[Service]
Type=notify
EnvironmentFile=-/etc/default/%N
EnvironmentFile=-/etc/sysconfig/%N
EnvironmentFile=-/usr/lib/systemd/system/%N.env
KillMode=process
Delegate=yes
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0
Restart=always
RestartSec=5s
ExecStartPre=-/sbin/modprobe br_netfilter
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/bin/rke2 agent
ExecStopPost=-/bin/sh -c "systemd-cgls /system.slice/%n | grep -Eo '[0-9]+ (containerd|kubelet)' | awk '{print $1}' | xargs -r kill"
# PATH 안 건드리고 표준 위치로 노출 설정 : 심볼릭 링크 방식
[root@k8s-node2 ~]# ln -s /var/lib/rancher/rke2/bin/containerd /usr/local/bin/containerd
[root@k8s-node2 ~]# ln -s /var/lib/rancher/rke2/bin/crictl /usr/local/bin/crictl
[root@k8s-node2 ~]# ln -s /var/lib/rancher/rke2/agent/etc/crictl.yaml /etc/crictl.yaml
[root@k8s-node2 ~]# crictl ps
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID POD NAMESPACE
4010ec38f31bb fc62334b90cf6 2 minutes ago Running kube-flannel 0 51b9f02e55775 rke2-canal-522dn kube-system
d48f2671d4f9f 3b9613c95d89e 2 minutes ago Running calico-node 0 51b9f02e55775 rke2-canal-522dn kube-system
094341fc3e0ac 603f9fc02b584 3 minutes ago Running kube-proxy 0 677b5182e8e8a kube-proxy-k8s-node2 kube-system
[root@k8s-node2 ~]# crictl images
IMAGE TAG IMAGE ID SIZE
docker.io/rancher/hardened-calico v3.31.3-build20260206 3b9613c95d89e 217MB
docker.io/rancher/hardened-flannel v0.28.1-build20260206 fc62334b90cf6 19.8MB
docker.io/rancher/hardened-kubernetes v1.33.8-rke2r1-build20260210 603f9fc02b584 187MB
docker.io/rancher/mirrored-pause 3.6 7d46a07936af9 253kB
docker.io/rancher/rke2-runtime v1.33.8-rke2r1 35592a070625a 91.3MB
수동 업그레이드 v1.33 -> v1.34
# 모니터링
[root@k8s-node1 ~]# while true; do curl -s http://192.168.10.12:30000 | grep Hostname; date; sleep 1; done
Mon Feb 23 06:32:25 AM KST 2026
Mon Feb 23 06:32:26 AM KST 2026
Mon Feb 23 06:32:27 AM KST 2026
Mon Feb 23 06:32:28 AM KST 2026
...
# 버전 정보 확인
[root@k8s-node1 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-node1 Ready control-plane,etcd,master 27m v1.33.8+rke2r1
k8s-node2 Ready <none> 7m44s v1.33.8+rke2r1
[root@k8s-node1 ~]# rke2 --version
rke2 version v1.33.8+rke2r1 (eb75e3c1774cee5a584259d6fee77eb8cfa9b430)
go version go1.24.12 X:boringcrypto
[root@k8s-node1 ~]# curl -s https://update.rke2.io/v1-release/channels | jq .data
[
{
"id": "stable",
"type": "channel",
"links": {
"self": "https://update.rke2.io/v1-release/channels/stable"
},
"name": "stable",
"latest": "v1.34.4+rke2r1"
},
{
"id": "latest",
"type": "channel",
"links": {
"self": "https://update.rke2.io/v1-release/channels/latest"
},
"name": "latest",
"latest": "v1.35.1+rke2r1",
"latestRegexp": ".*",
"excludeRegexp": "(^[^+]+-|v1\\.25\\.5\\+rke2r1|v1\\.26\\.0\\+rke2r1)"
},
{
"id": "v1.18",
"type": "channel",
"links": {
"self": "https://update.rke2.io/v1-release/channels/v1.18"
},
"name": "v1.18",
"latest": "v1.18.20+rke2r1",
"latestRegexp": "v1\\.18\\..*",
"excludeRegexp": "^[^+]+-"
},
{
"id": "v1.19",
"type": "channel",
"links": {
"self": "https://update.rke2.io/v1-release/channels/v1.19"
},
"name": "v1.19",
"latest": "v1.19.16+rke2r1",
"latestRegexp": "v1\\.19\\..*",
"excludeRegexp": "(^[^+]+-|v1\\.19\\.13\\+rke2r1)"
},
{
"id": "testing",
"type": "channel",
"links": {
"self": "https://update.rke2.io/v1-release/channels/testing"
},
"name": "testing",
"latest": "v1.18.9-beta22+rke2",
"latestRegexp": "-(alpha|beta|rc)"
},
{
"id": "v1.20",
"type": "channel",
"links": {
"self": "https://update.rke2.io/v1-release/channels/v1.20"
},
"name": "v1.20",
"latest": "v1.20.15+rke2r2",
"latestRegexp": "v1\\.20\\..*",
"excludeRegexp": "(^[^+]+-|v1\\.20\\.9\\+rke2r1)"
},
{
"id": "v1.21",
"type": "channel",
"links": {
"self": "https://update.rke2.io/v1-release/channels/v1.21"
},
"name": "v1.21",
"latest": "v1.21.14+rke2r1",
"latestRegexp": "v1\\.21\\..*",
"excludeRegexp": "(^[^+]+-|v1\\.21\\.3\\+rke2r2)"
},
{
"id": "v1.22",
"type": "channel",
"links": {
"self": "https://update.rke2.io/v1-release/channels/v1.22"
},
"name": "v1.22",
"latest": "v1.22.17+rke2r1",
"latestRegexp": "v1\\.22\\..*",
"excludeRegexp": "^[^+]+-"
},
{
"id": "v1.23",
"type": "channel",
"links": {
"self": "https://update.rke2.io/v1-release/channels/v1.23"
},
"name": "v1.23",
"latest": "v1.23.17+rke2r1",
"latestRegexp": "v1\\.23\\..*",
"excludeRegexp": "^[^+]+-"
},
{
"id": "v1.24",
"type": "channel",
"links": {
"self": "https://update.rke2.io/v1-release/channels/v1.24"
},
"name": "v1.24",
"latest": "v1.24.17+rke2r1",
"latestRegexp": "v1\\.24\\..*",
"excludeRegexp": "(^[^+]+-|v1\\.24\\.9\\+rke2r1)"
},
{
"id": "v1.25",
"type": "channel",
"links": {
"self": "https://update.rke2.io/v1-release/channels/v1.25"
},
"name": "v1.25",
"latest": "v1.25.16+rke2r2",
"latestRegexp": "v1\\.25\\..*",
"excludeRegexp": "(^[^+]+-|v1\\.25\\.5\\+rke2r1)"
},
{
"id": "v1.26",
"type": "channel",
"links": {
"self": "https://update.rke2.io/v1-release/channels/v1.26"
},
"name": "v1.26",
"latest": "v1.26.15+rke2r1",
"latestRegexp": "v1\\.26\\..*",
"excludeRegexp": "(^[^+]+-|v1\\.26\\.0\\+rke2r1)"
},
{
"id": "v1.27",
"type": "channel",
"links": {
"self": "https://update.rke2.io/v1-release/channels/v1.27"
},
"name": "v1.27",
"latest": "v1.27.16+rke2r2",
"latestRegexp": "v1\\.27\\..*",
"excludeRegexp": "^[^+]+-"
},
{
"id": "v1.28",
"type": "channel",
"links": {
"self": "https://update.rke2.io/v1-release/channels/v1.28"
},
"name": "v1.28",
"latest": "v1.28.15+rke2r1",
"latestRegexp": "v1\\.28\\..*",
"excludeRegexp": "^[^+]+-"
},
{
"id": "v1.29",
"type": "channel",
"links": {
"self": "https://update.rke2.io/v1-release/channels/v1.29"
},
"name": "v1.29",
"latest": "v1.29.15+rke2r1",
"latestRegexp": "v1\\.29\\..*",
"excludeRegexp": "^[^+]+-"
},
{
"id": "v1.30",
"type": "channel",
"links": {
"self": "https://update.rke2.io/v1-release/channels/v1.30"
},
"name": "v1.30",
"latest": "v1.30.14+rke2r4",
"latestRegexp": "v1\\.30\\..*",
"excludeRegexp": "^[^+]+-"
},
{
"id": "v1.31",
"type": "channel",
"links": {
"self": "https://update.rke2.io/v1-release/channels/v1.31"
},
"name": "v1.31",
"latest": "v1.31.14+rke2r1",
"latestRegexp": "v1\\.31\\..*",
"excludeRegexp": "^[^+]+-"
},
{
"id": "v1.32",
"type": "channel",
"links": {
"self": "https://update.rke2.io/v1-release/channels/v1.32"
},
"name": "v1.32",
"latest": "v1.32.12+rke2r1",
"latestRegexp": "v1\\.32\\..*",
"excludeRegexp": "^[^+]+-"
},
{
"id": "v1.33",
"type": "channel",
"links": {
"self": "https://update.rke2.io/v1-release/channels/v1.33"
},
"name": "v1.33",
"latest": "v1.33.8+rke2r1",
"latestRegexp": "v1\\.33\\..*",
"excludeRegexp": "^[^+]+-"
},
{
"id": "v1.34",
"type": "channel",
"links": {
"self": "https://update.rke2.io/v1-release/channels/v1.34"
},
"name": "v1.34",
"latest": "v1.34.4+rke2r1",
"latestRegexp": "v1\\.34\\..*",
"excludeRegexp": "^[^+]+-"
},
{
"id": "v1.35",
"type": "channel",
"links": {
"self": "https://update.rke2.io/v1-release/channels/v1.35"
},
"name": "v1.35",
"latest": "v1.35.1+rke2r1",
"latestRegexp": "v1\\.35\\..*",
"excludeRegexp": "^[^+]+-"
}
]
# v1.34 버전 업그레이드! : 아래 Running scriptlet 과정에서 업그레이드 수행됨, app 통신 영향 없었음.
[root@k8s-node1 ~]# curl -sfL https://get.rke2.io | INSTALL_RKE2_CHANNEL=v1.34 sh -
[INFO] using stable RPM repositories
[INFO] using 1.34 series from channel stable
Importing GPG key 0xE257814A:
Userid : "Rancher (CI) <ci@rancher.com>"
Fingerprint: C8CF F216 4551 26E9 B9C9 18BE 925E A29A E257 814A
From : https://rpm.rancher.io/public.key
Error: Failed to download metadata for repo 'rancher-rke2-1.34-stable': repomd.xml GPG signature verification error: Bad GPG signature
Importing GPG key 0xE257814A:
Userid : "Rancher (CI) <ci@rancher.com>"
Fingerprint: C8CF F216 4551 26E9 B9C9 18BE 925E A29A E257 814A
From : https://rpm.rancher.io/public.key
Error: Failed to download metadata for repo 'rancher-rke2-1.34-stable': repomd.xml GPG signature verification error: Bad GPG signature
Rancher RKE2 1.34 (v1.34) 59 B/s | 659 B 00:11
Rancher RKE2 1.34 (v1.34) 471 B/s | 2.4 kB 00:05
Importing GPG key 0xE257814A:
Userid : "Rancher (CI) <ci@rancher.com>"
Fingerprint: C8CF F216 4551 26E9 B9C9 18BE 925E A29A E257 814A
From : https://rpm.rancher.io/public.key
Rancher RKE2 1.34 (v1.34) 235 B/s | 3.6 kB 00:15
Package rke2-server-1.33.8~rke2r1-0.el9.aarch64 is already installed.
Dependencies resolved.
===============================================================================================================================================================================================
Package Architecture Version Repository Size
===============================================================================================================================================================================================
Upgrading:
rke2-common aarch64 1.34.4~rke2r1-0.el9 rancher-rke2-1.34-stable 25 M
rke2-server aarch64 1.34.4~rke2r1-0.el9 rancher-rke2-1.34-stable 8.3 k
Transaction Summary
===============================================================================================================================================================================================
Upgrade 2 Packages
Total download size: 25 M
Downloading Packages:
(1/2): rke2-server-1.34.4~rke2r1-0.el9.aarch64.rpm 1.5 kB/s | 8.3 kB 00:05
(2/2): rke2-common-1.34.4~rke2r1-0.el9.aarch64.rpm 3.9 MB/s | 25 MB 00:06
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total 3.9 MB/s | 25 MB 00:06
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Upgrading : rke2-common-1.34.4~rke2r1-0.el9.aarch64 1/4
Upgrading : rke2-server-1.34.4~rke2r1-0.el9.aarch64 2/4
Running scriptlet: rke2-server-1.34.4~rke2r1-0.el9.aarch64 2/4
Running scriptlet: rke2-server-1.33.8~rke2r1-0.el9.aarch64 3/4
Cleanup : rke2-server-1.33.8~rke2r1-0.el9.aarch64 3/4
Running scriptlet: rke2-server-1.33.8~rke2r1-0.el9.aarch64 3/4
Running scriptlet: rke2-common-1.33.8~rke2r1-0.el9.aarch64 4/4
Cleanup : rke2-common-1.33.8~rke2r1-0.el9.aarch64 4/4
Running scriptlet: rke2-common-1.33.8~rke2r1-0.el9.aarch64 4/4
Verifying : rke2-common-1.34.4~rke2r1-0.el9.aarch64 1/4
Verifying : rke2-common-1.33.8~rke2r1-0.el9.aarch64 2/4
Verifying : rke2-server-1.34.4~rke2r1-0.el9.aarch64 3/4
Verifying : rke2-server-1.33.8~rke2r1-0.el9.aarch64 4/4
Upgraded:
rke2-common-1.34.4~rke2r1-0.el9.aarch64 rke2-server-1.34.4~rke2r1-0.el9.aarch64
Complete!
[root@k8s-node1 ~]# rke2 --version
rke2 version v1.34.4+rke2r1 (c6b97dc03cefec17e8454a6f45b29f4e3d0a81d6)
go version go1.24.12 X:boringcrypto
# 위 스크립트 설치 과정만으로 아래 처럼 파드들이 신규 재생성되었음
## 첫번쨰(etcd, apiserver, kube-proxy) -> 두번째(scheduler, kcm)
[root@k8s-node1 ~]# kubectl get pod -n kube-system --sort-by=.metadata.creationTimestamp | tac
helm-install-rke2-canal-9bdxv 0/1 Completed 0 54s
helm-install-rke2-coredns-nsmb5 0/1 Completed 0 54s
helm-install-rke2-metrics-server-ltsxc 0/1 Completed 0 54s
helm-install-rke2-runtimeclasses-98gw5 0/1 Completed 0 54s
kube-scheduler-k8s-node1 1/1 Running 0 71s
kube-controller-manager-k8s-node1 1/1 Running 0 73s
kube-proxy-k8s-node1 1/1 Running 0 102s
kube-apiserver-k8s-node1 1/1 Running 0 102s
etcd-k8s-node1 1/1 Running 0 102s
kube-proxy-k8s-node2 1/1 Running 0 13m
rke2-canal-522dn 2/2 Running 0 13m
rke2-metrics-server-fdcdf575d-vxcnw 1/1 Running 0 31m
rke2-canal-9wqbn 2/2 Running 0 32m
rke2-coredns-rke2-coredns-559595db99-lv2ww 1/1 Running 0 32m
NAME READY STATUS RESTARTS AGE
# repo 추가 및 기존 repo 삭제 확인
[root@k8s-node1 ~]# dnf repolist
repo id repo name
appstream Rocky Linux 9 - AppStream
baseos Rocky Linux 9 - BaseOS
extras Rocky Linux 9 - Extras
rancher-rke2-1.34-stable Rancher RKE2 1.34 (v1.34)
rancher-rke2-common-stable Rancher RKE2 Common (v1.34)
# kube-system 파드 별 컨테이너 이미지 정보 출력
[root@k8s-node1 ~]# kubectl get pods -n kube-system \
-o custom-columns=\
POD:.metadata.name,\
CONTAINERS:.spec.containers[*].name,\
IMAGES:.spec.containers[*].image
POD CONTAINERS IMAGES
etcd-k8s-node1 etcd index.docker.io/rancher/hardened-etcd:v3.6.7-k3s1-build20260126
helm-install-rke2-canal-9bdxv helm rancher/klipper-helm:v0.9.14-build20260210
helm-install-rke2-coredns-nsmb5 helm rancher/klipper-helm:v0.9.14-build20260210
helm-install-rke2-metrics-server-ltsxc helm rancher/klipper-helm:v0.9.14-build20260210
helm-install-rke2-runtimeclasses-98gw5 helm rancher/klipper-helm:v0.9.14-build20260210
kube-apiserver-k8s-node1 kube-apiserver index.docker.io/rancher/hardened-kubernetes:v1.34.4-rke2r1-build20260210
kube-controller-manager-k8s-node1 kube-controller-manager index.docker.io/rancher/hardened-kubernetes:v1.34.4-rke2r1-build20260210
kube-proxy-k8s-node1 kube-proxy index.docker.io/rancher/hardened-kubernetes:v1.34.4-rke2r1-build20260210
kube-proxy-k8s-node2 kube-proxy index.docker.io/rancher/hardened-kubernetes:v1.33.8-rke2r1-build20260210
kube-scheduler-k8s-node1 kube-scheduler index.docker.io/rancher/hardened-kubernetes:v1.34.4-rke2r1-build20260210
rke2-canal-522dn calico-node,kube-flannel rancher/hardened-calico:v3.31.3-build20260206,rancher/hardened-flannel:v0.28.1-build20260206
rke2-canal-9wqbn calico-node,kube-flannel rancher/hardened-calico:v3.31.3-build20260206,rancher/hardened-flannel:v0.28.1-build20260206
rke2-coredns-rke2-coredns-559595db99-lv2ww coredns rancher/hardened-coredns:v1.14.1-build20260206
rke2-metrics-server-fdcdf575d-vxcnw metrics-server rancher/hardened-k8s-metrics-server:v0.8.1-build20260206
# 노드 정보 확인
[root@k8s-node1 ~]# kubectl get node -owide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-node1 Ready control-plane,etcd,master 35m v1.34.4+rke2r1 192.168.10.11 <none> Rocky Linux 9.6 (Blue Onyx) 5.14.0-570.52.1.el9_6.aarch64 containerd://2.1.5-k3s1
k8s-node2 Ready <none> 16m v1.33.8+rke2r1 192.168.10.12 <none> Rocky Linux 9.6 (Blue Onyx) 5.14.0-570.52.1.el9_6.aarch64 containerd://2.1.5-k3s1
---
[k8s-node2]
[root@k8s-node2 ~]# rke2 --version
rke2 version v1.33.8+rke2r1 (eb75e3c1774cee5a584259d6fee77eb8cfa9b430)
go version go1.24.12 X:boringcrypto
[root@k8s-node2 ~]# curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE=agent INSTALL_RKE2_CHANNEL=v1.34 sh -
[INFO] using stable RPM repositories
[INFO] using 1.34 series from channel stable
Importing GPG key 0xE257814A:
Userid : "Rancher (CI) <ci@rancher.com>"
Fingerprint: C8CF F216 4551 26E9 B9C9 18BE 925E A29A E257 814A
From : https://rpm.rancher.io/public.key
Error: Failed to download metadata for repo 'rancher-rke2-1.34-stable': repomd.xml GPG signature verification error: Bad GPG signature
Importing GPG key 0xE257814A:
Userid : "Rancher (CI) <ci@rancher.com>"
Fingerprint: C8CF F216 4551 26E9 B9C9 18BE 925E A29A E257 814A
From : https://rpm.rancher.io/public.key
Error: Failed to download metadata for repo 'rancher-rke2-1.34-stable': repomd.xml GPG signature verification error: Bad GPG signature
Rancher RKE2 1.34 (v1.34) 63 B/s | 659 B 00:10
Rancher RKE2 1.34 (v1.34) 472 B/s | 2.4 kB 00:05
Importing GPG key 0xE257814A:
Userid : "Rancher (CI) <ci@rancher.com>"
Fingerprint: C8CF F216 4551 26E9 B9C9 18BE 925E A29A E257 814A
From : https://rpm.rancher.io/public.key
Rancher RKE2 1.34 (v1.34) 239 B/s | 3.6 kB 00:15
Package rke2-agent-1.33.8~rke2r1-0.el9.aarch64 is already installed.
Dependencies resolved.
=============================================================================================================================================================================================
Package Architecture Version Repository Size
=============================================================================================================================================================================================
Upgrading:
rke2-agent aarch64 1.34.4~rke2r1-0.el9 rancher-rke2-1.34-stable 8.3 k
rke2-common aarch64 1.34.4~rke2r1-0.el9 rancher-rke2-1.34-stable 25 M
Transaction Summary
=============================================================================================================================================================================================
Upgrade 2 Packages
Total download size: 25 M
Downloading Packages:
(1/2): rke2-agent-1.34.4~rke2r1-0.el9.aarch64.rpm 1.4 kB/s | 8.3 kB 00:05
(2/2): rke2-common-1.34.4~rke2r1-0.el9.aarch64.rpm 4.0 MB/s | 25 MB 00:06
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total 4.0 MB/s | 25 MB 00:06
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Upgrading : rke2-common-1.34.4~rke2r1-0.el9.aarch64 1/4
Upgrading : rke2-agent-1.34.4~rke2r1-0.el9.aarch64 2/4
Running scriptlet: rke2-agent-1.34.4~rke2r1-0.el9.aarch64 2/4
Running scriptlet: rke2-agent-1.33.8~rke2r1-0.el9.aarch64 3/4
Cleanup : rke2-agent-1.33.8~rke2r1-0.el9.aarch64 3/4
Running scriptlet: rke2-agent-1.33.8~rke2r1-0.el9.aarch64 3/4
Running scriptlet: rke2-common-1.33.8~rke2r1-0.el9.aarch64 4/4
Cleanup : rke2-common-1.33.8~rke2r1-0.el9.aarch64 4/4
Running scriptlet: rke2-common-1.33.8~rke2r1-0.el9.aarch64 4/4
Verifying : rke2-agent-1.34.4~rke2r1-0.el9.aarch64 1/4
Verifying : rke2-agent-1.33.8~rke2r1-0.el9.aarch64 2/4
Verifying : rke2-common-1.34.4~rke2r1-0.el9.aarch64 3/4
Verifying : rke2-common-1.33.8~rke2r1-0.el9.aarch64 4/4
Upgraded:
rke2-agent-1.34.4~rke2r1-0.el9.aarch64 rke2-common-1.34.4~rke2r1-0.el9.aarch64
Complete!
[root@k8s-node2 ~]# rke2 --version
rke2 version v1.34.4+rke2r1 (c6b97dc03cefec17e8454a6f45b29f4e3d0a81d6)
go version go1.24.12 X:boringcrypto
[root@k8s-node2 ~]# dnf repolist
repo id repo name
appstream Rocky Linux 9 - AppStream
baseos Rocky Linux 9 - BaseOS
extras Rocky Linux 9 - Extras
rancher-rke2-1.34-stable Rancher RKE2 1.34 (v1.34)
rancher-rke2-common-stable Rancher RKE2 Common (v1.34)
[root@k8s-node2 ~]# systemctl restart rke2-agent
---
[k8s-node1]
[root@k8s-node1 ~]# kubectl get node -owide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-node1 Ready control-plane,etcd,master 40m v1.34.4+rke2r1 192.168.10.11 <none> Rocky Linux 9.6 (Blue Onyx) 5.14.0-570.52.1.el9_6.aarch64 containerd://2.1.5-k3s1
k8s-node2 Ready <none> 21m v1.34.4+rke2r1 192.168.10.12 <none> Rocky Linux 9.6 (Blue Onyx) 5.14.0-570.52.1.el9_6.aarch64 containerd://2.1.5-k3s1
# 워커 노드에 kube-proxy 파드만 신규 재기동됨!
[root@k8s-node1 ~]# kubectl get pod -n kube-system --sort-by=.metadata.creationTimestamp | tac
kube-proxy-k8s-node2 1/1 Running 0 50s
kube-proxy-k8s-node1 1/1 Running 0 5m49s
helm-install-rke2-canal-9bdxv 0/1 Completed 0 8m22s
helm-install-rke2-coredns-nsmb5 0/1 Completed 0 8m22s
helm-install-rke2-metrics-server-ltsxc 0/1 Completed 0 8m22s
helm-install-rke2-runtimeclasses-98gw5 0/1 Completed 0 8m22s
kube-scheduler-k8s-node1 1/1 Running 0 8m39s
kube-controller-manager-k8s-node1 1/1 Running 0 8m41s
kube-apiserver-k8s-node1 1/1 Running 0 9m10s
etcd-k8s-node1 1/1 Running 0 9m10s
rke2-canal-522dn 2/2 Running 0 21m
rke2-metrics-server-fdcdf575d-vxcnw 1/1 Running 0 38m
rke2-canal-9wqbn 2/2 Running 0 39m
rke2-coredns-rke2-coredns-559595db99-lv2ww 1/1 Running 0 39m
NAME READY STATUS RESTARTS AGE
자동 업그레이드 v1.34 -> v1.35
# system-upgrade-controller 설치
[root@k8s-node1 ~]# kubectl apply -f https://github.com/rancher/system-upgrade-controller/releases/latest/download/crd.yaml -f https://github.com/rancher/system-upgrade-controller/releases/latest/download/system-upgrade-controller.yaml
customresourcedefinition.apiextensions.k8s.io/plans.upgrade.cattle.io created
namespace/system-upgrade created
serviceaccount/system-upgrade created
role.rbac.authorization.k8s.io/system-upgrade-controller created
clusterrole.rbac.authorization.k8s.io/system-upgrade-controller created
clusterrole.rbac.authorization.k8s.io/system-upgrade-controller-drainer created
rolebinding.rbac.authorization.k8s.io/system-upgrade created
clusterrolebinding.rbac.authorization.k8s.io/system-upgrade created
clusterrolebinding.rbac.authorization.k8s.io/system-upgrade-drainer created
configmap/default-controller-env created
deployment.apps/system-upgrade-controller created
# 확인
[root@k8s-node1 ~]# kubectl get deploy,pod,cm -n system-upgrade
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/system-upgrade-controller 1/1 1 1 82s
NAME READY STATUS RESTARTS AGE
pod/system-upgrade-controller-5f667989c7-kdsgf 1/1 Running 0 82s
NAME DATA AGE
configmap/default-controller-env 11 82s
configmap/kube-root-ca.crt 1 82s
# 계획 작성 후 실행 및 확인
# plan 작성 및 실행
[root@k8s-node1 ~]# cat << EOF | kubectl apply -f -
apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
name: server-plan
namespace: system-upgrade
spec:
concurrency: 1
cordon: true
nodeSelector:
matchExpressions:
- key: node-role.kubernetes.io/control-plane
operator: In
values:
- "true"
serviceAccountName: system-upgrade
upgrade:
image: rancher/rke2-upgrade
EOFhannel: https://update.rke2.io/v1-release/channels/latest # version: v1.35.0+rke2r3 , curl -s https://update.rke2.io/v1-release/channels | jq .data
plan.upgrade.cattle.io/server-plan created
plan.upgrade.cattle.io/agent-plan created
[root@k8s-node1 ~]# kubectl get node -owide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-node1 Ready control-plane,etcd,master 54m v1.35.1+rke2r1 192.168.10.11 <none> Rocky Linux 9.6 (Blue Onyx) 5.14.0-570.52.1.el9_6.aarch64 containerd://2.1.5-k3s1
k8s-node2 Ready <none> 34m v1.35.1+rke2r1 192.168.10.12 <none> Rocky Linux 9.6 (Blue Onyx) 5.14.0-570.52.1.el9_6.aarch64 containerd://2.1.5-k3s1
Cluster API 소개


Cluster API(CAPI)는 Kubernetes 클러스터 자체를 Kubernetes 리소스로 관리하기 위한 프로젝트입니다.
Kubernetes SIG Cluster Lifecycle에서 개발했으며, 클러스터 생성·업그레이드·삭제 같은 라이프사이클을 선언적으로 관리할 수 있게 합니다.
일반적인 애플리케이션을 Pod로 관리하듯, Cluster API는 Cluster, Machine, MachineDeployment 같은 CRD를 통해 쿠버네티스 클러스터를 코드로 관리합니다. 관리 클러스터(Management Cluster)에서 다른 워크로드 클러스터를 생성하고 제어하는 구조가 기본 개념입니다. AWS, Azure, vSphere 등 다양한 인프라에 대해 Provider 구조를 제공해 멀티 클라우드 환경에서도 일관된 방식으로 클러스터를 운영할 수 있습니다.
Cluster API 실습
kind k8s에 관리용 management 클러스터 설치 init
> kind create cluster --name myk8s --image kindest/node:v1.35.0 --config - <<EOF 07:28:04
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
extraMounts:
- hostPath: /var/run/docker.sock
containerPath: /var/run/docker.sock
extraPortMappings:
# sample app
- containerPort: 30000
hostPort: 30000
# kube-ops-view
- containerPort: 30001
hostPort: 30001
EOF
Creating cluster "myk8s" ...
✓ Ensuring node image (kindest/node:v1.35.0) 🖼
✓ Preparing nodes 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
Set kubectl context to "kind-myk8s"
You can now use your cluster with:
kubectl cluster-info --context kind-myk8s
Thanks for using kind! 😊
# (옵션) kube-ops-view
> helm repo add geek-cookbook https://geek-cookbook.github.io/charts/ ○ kind-myk8s 07:29:08
helm install kube-ops-view geek-cookbook/kube-ops-view --version 1.2.2 \
--set service.main.type=NodePort,service.main.ports.http.nodePort=30001 \
--set env.TZ="Asia/Seoul" --namespace kube-system
"geek-cookbook" already exists with the same configuration, skipping
NAME: kube-ops-view
LAST DEPLOYED: Mon Feb 23 07:29:11 2026
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
1. Get the application URL by running these commands:
export NODE_PORT=$(kubectl get --namespace kube-system -o jsonpath="{.spec.ports[0].nodePort}" services kube-ops-view)
export NODE_IP=$(kubectl get nodes --namespace kube-system -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT
> brew install clusterctl
> clusterctl version -o json | jq 14s 07:29:41
{
"clusterctl": {
"major": "1",
"minor": "12",
"gitVersion": "v1.12.3",
"gitCommit": "Homebrew",
"gitTreeState": "clean",
"buildDate": "2026-02-17T10:43:04Z",
"goVersion": "go1.26.0",
"compiler": "gc",
"platform": "darwin/arm64"
}
}
# [Docker 프로바이더] Initialize the management cluster : 현재 k8s 를 관리 클러스터로 변환
## Docker 프로바이더는 프로덕션 환경에 사용하도록 설계되지 않았으며 개발 환경 전용
## ClusterTopology관리형 토폴로지 및 ClusterClass 지원을 활성화하는 데 필요한 기능은 다음과 같이 활성화
## https://cluster-api.sigs.k8s.io/tasks/experimental-features/experimental-features
> export CLUSTER_TOPOLOGY=true
> clusterctl init --infrastructure docker
Fetching providers
Installing cert-manager version="v1.19.3"
Waiting for cert-manager to be available...
spec.privateKey.rotationPolicy: In cert-manager >= v1.18.0, the default value changed from `Never` to `Always`.
Installing provider="cluster-api" version="v1.12.3" targetNamespace="capi-system"
spec.privateKey.rotationPolicy: In cert-manager >= v1.18.0, the default value changed from `Never` to `Always`.
Installing provider="bootstrap-kubeadm" version="v1.12.3" targetNamespace="capi-kubeadm-bootstrap-system"
spec.privateKey.rotationPolicy: In cert-manager >= v1.18.0, the default value changed from `Never` to `Always`.
Installing provider="control-plane-kubeadm" version="v1.12.3" targetNamespace="capi-kubeadm-control-plane-system"
spec.privateKey.rotationPolicy: In cert-manager >= v1.18.0, the default value changed from `Never` to `Always`.
Installing provider="infrastructure-docker" version="v1.12.3" targetNamespace="capd-system"
spec.privateKey.rotationPolicy: In cert-manager >= v1.18.0, the default value changed from `Never` to `Always`.
Your management cluster has been initialized successfully!
You can now create your first workload cluster by running the following:
clusterctl generate cluster [name] --kubernetes-version [version] | kubectl apply -f -
> kubectl get crd 29s ○ kind-myk8s 07:30:55
NAME CREATED AT
certificaterequests.cert-manager.io 2026-02-22T22:30:33Z
certificates.cert-manager.io 2026-02-22T22:30:33Z
challenges.acme.cert-manager.io 2026-02-22T22:30:33Z
clusterclasses.cluster.x-k8s.io 2026-02-22T22:30:51Z
clusterissuers.cert-manager.io 2026-02-22T22:30:33Z
clusterresourcesetbindings.addons.cluster.x-k8s.io 2026-02-22T22:30:51Z
clusterresourcesets.addons.cluster.x-k8s.io 2026-02-22T22:30:51Z
clusters.cluster.x-k8s.io 2026-02-22T22:30:51Z
devclusters.infrastructure.cluster.x-k8s.io 2026-02-22T22:30:54Z
devclustertemplates.infrastructure.cluster.x-k8s.io 2026-02-22T22:30:54Z
devmachines.infrastructure.cluster.x-k8s.io 2026-02-22T22:30:55Z
devmachinetemplates.infrastructure.cluster.x-k8s.io 2026-02-22T22:30:55Z
dockerclusters.infrastructure.cluster.x-k8s.io 2026-02-22T22:30:55Z
dockerclustertemplates.infrastructure.cluster.x-k8s.io 2026-02-22T22:30:55Z
dockermachinepools.infrastructure.cluster.x-k8s.io 2026-02-22T22:30:55Z
dockermachinepooltemplates.infrastructure.cluster.x-k8s.io 2026-02-22T22:30:55Z
dockermachines.infrastructure.cluster.x-k8s.io 2026-02-22T22:30:55Z
dockermachinetemplates.infrastructure.cluster.x-k8s.io 2026-02-22T22:30:55Z
extensionconfigs.runtime.cluster.x-k8s.io 2026-02-22T22:30:52Z
ipaddressclaims.ipam.cluster.x-k8s.io 2026-02-22T22:30:52Z
ipaddresses.ipam.cluster.x-k8s.io 2026-02-22T22:30:52Z
issuers.cert-manager.io 2026-02-22T22:30:33Z
kubeadmconfigs.bootstrap.cluster.x-k8s.io 2026-02-22T22:30:53Z
kubeadmconfigtemplates.bootstrap.cluster.x-k8s.io 2026-02-22T22:30:53Z
kubeadmcontrolplanes.controlplane.cluster.x-k8s.io 2026-02-22T22:30:54Z
kubeadmcontrolplanetemplates.controlplane.cluster.x-k8s.io 2026-02-22T22:30:54Z
machinedeployments.cluster.x-k8s.io 2026-02-22T22:30:52Z
machinedrainrules.cluster.x-k8s.io 2026-02-22T22:30:52Z
machinehealthchecks.cluster.x-k8s.io 2026-02-22T22:30:52Z
machinepools.cluster.x-k8s.io 2026-02-22T22:30:52Z
machines.cluster.x-k8s.io 2026-02-22T22:30:52Z
> kubectl get pod -A ○ kind-myk8s 07:31:54
NAMESPACE NAME READY STATUS RESTARTS AGE
capd-system capd-controller-manager-54755cdd6-k6h72 1/1 Running 0 60s
capi-kubeadm-bootstrap-system capi-kubeadm-bootstrap-controller-manager-94d8964d9-vh5qz 1/1 Running 0 62s
capi-kubeadm-control-plane-system capi-kubeadm-control-plane-controller-manager-6796744c76-qs7zm 1/1 Running 0 61s
capi-system capi-controller-manager-59c5798655-hnnqx 1/1 Running 0 63s
cert-manager cert-manager-845844dd8-hq627 1/1 Running 0 81s
cert-manager cert-manager-cainjector-7b5d65fbcb-qnld4 1/1 Running 0 81s
cert-manager cert-manager-webhook-6fcf4cb6c-9n94f 1/1 Running 0 81s
kube-system coredns-7d764666f9-5nlsf 1/1 Running 0 3m30s
kube-system coredns-7d764666f9-z6hdf 1/1 Running 0 3m30s
kube-system etcd-myk8s-control-plane 1/1 Running 0 3m39s
kube-system kindnet-npqqh 1/1 Running 0 3m30s
kube-system kube-apiserver-myk8s-control-plane 1/1 Running 0 3m38s
kube-system kube-controller-manager-myk8s-control-plane 1/1 Running 0 3m38s
kube-system kube-ops-view-5c64986f74-twskv 1/1 Running 0 2m44s
kube-system kube-proxy-tt8bp 1/1 Running 0 3m30s
kube-system kube-scheduler-myk8s-control-plane 1/1 Running 0 3m38s
local-path-storage local-path-provisioner-67b8995b4b-vcdgh 1/1 Running 0 3m30s
관리용 management k8s 클러스터 정보 확인
## capd-system, capi-(kueadm-X/Y, system), cert-manager 네임스페이스가 생성
> kubectl describe -n capi-system deployment.apps/capi-controller-manager | grep feature-gates ○ kind-myk8s 07:31:55
--feature-gates=MachinePool=true,ClusterTopology=true,RuntimeSDK=false,MachineSetPreflightChecks=true,MachineWaitForVolumeDetachConsiderVolumeAttachments=true,PriorityQueue=false,ReconcilerRateLimiting=false,InPlaceUpdates=false,MachineTaintPropagation=false
# 프로바이더 (타입별)확인 : CAPI 구성요소가 설치된 상태
> kubectl get providers.clusterctl.cluster.x-k8s.io -A ○ kind-myk8s 07:33:08
NAMESPACE NAME AGE TYPE PROVIDER VERSION
capd-system infrastructure-docker 2m14s InfrastructureProvider docker v1.12.3
capi-kubeadm-bootstrap-system bootstrap-kubeadm 2m16s BootstrapProvider kubeadm v1.12.3
capi-kubeadm-control-plane-system control-plane-kubeadm 2m15s ControlPlaneProvider kubeadm v1.12.3
capi-system cluster-api 2m16s CoreProvider cluster-api v1.12.3
# CAPI의 핵심 컨트롤러 집합 : Cluster / MachineDeployment / MachineSet / Machine CRD 관리, 전체 reconcile orchestration 담당
> kubectl get providers -n capi-system cluster-api -o yaml ○ kind-myk8s 07:33:19
apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3
kind: Provider
metadata:
creationTimestamp: "2026-02-22T22:30:53Z"
generation: 1
labels:
cluster.x-k8s.io/provider: cluster-api
clusterctl.cluster.x-k8s.io: ""
clusterctl.cluster.x-k8s.io/core: inventory
name: cluster-api
namespace: capi-system
resourceVersion: "950"
uid: 60d648d5-ff16-4364-a65a-3c229685137d
providerName: cluster-api
type: CoreProvider
version: v1.12.3
# 노드를 Kubernetes로 부팅시키는 역할 : cloud-init user-data 생성, kubeadm join/init config 생성
> kubectl get providers -n capi-kubeadm-bootstrap-system bootstrap-kubeadm -o yaml ○ kind-myk8s 07:34:00
apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3
kind: Provider
metadata:
creationTimestamp: "2026-02-22T22:30:53Z"
generation: 1
labels:
cluster.x-k8s.io/provider: bootstrap-kubeadm
clusterctl.cluster.x-k8s.io: ""
clusterctl.cluster.x-k8s.io/core: inventory
name: bootstrap-kubeadm
namespace: capi-kubeadm-bootstrap-system
resourceVersion: "1021"
uid: 34a3a4da-2b1d-48d4-bd42-f5d63642a355
providerName: kubeadm
type: BootstrapProvider
version: v1.12.3
# Control Plane 전용 Machine 관리 : KubeadmControlPlane 리소스 관리, Control Plane 노드 스케일링, etcd 포함 업그레이드 관리
> kubectl get providers -n capi-kubeadm-control-plane-system control-plane-kubeadm -o yaml ○ kind-myk8s 07:34:16
apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3
kind: Provider
metadata:
creationTimestamp: "2026-02-22T22:30:54Z"
generation: 1
labels:
cluster.x-k8s.io/provider: control-plane-kubeadm
clusterctl.cluster.x-k8s.io: ""
clusterctl.cluster.x-k8s.io/core: inventory
name: control-plane-kubeadm
namespace: capi-kubeadm-control-plane-system
resourceVersion: "1080"
uid: 5488efb2-f513-48f5-94c6-f0c028e636ae
providerName: kubeadm
type: ControlPlaneProvider
version: v1.12.3
# 실제 인프라 리소스 생성 담당 : 실제 Docker 컨테이너를 VM처럼 생성, Dev/Test 용도 (CAPD)
> kubectl get providers -n capd-system infrastructure-docker -o yaml ○ kind-myk8s 07:34:35
apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3
kind: Provider
metadata:
creationTimestamp: "2026-02-22T22:30:55Z"
generation: 1
labels:
cluster.x-k8s.io/provider: infrastructure-docker
clusterctl.cluster.x-k8s.io: ""
clusterctl.cluster.x-k8s.io/core: inventory
name: infrastructure-docker
namespace: capd-system
resourceVersion: "1176"
uid: a9f1e357-a3cd-4858-9ed8-f89f453f35ee
providerName: docker
type: InfrastructureProvider
version: v1.12.3
cert manager 확인
> kubectl get crd | grep cert ○ kind-myk8s 07:35:01
certificaterequests.cert-manager.io 2026-02-22T22:30:33Z
certificates.cert-manager.io 2026-02-22T22:30:33Z
challenges.acme.cert-manager.io 2026-02-22T22:30:33Z
clusterissuers.cert-manager.io 2026-02-22T22:30:33Z
issuers.cert-manager.io 2026-02-22T22:30:33Z
orders.acme.cert-manager.io 2026-02-22T22:30:33Z
> kubectl get deploy,pod,svc,ep,cm,secret,sa -n cert-manager ○ kind-myk8s 07:35:12
Warning: v1 Endpoints is deprecated in v1.33+; use discovery.k8s.io/v1 EndpointSlice
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/cert-manager 1/1 1 1 4m39s
deployment.apps/cert-manager-cainjector 1/1 1 1 4m39s
deployment.apps/cert-manager-webhook 1/1 1 1 4m39s
NAME READY STATUS RESTARTS AGE
pod/cert-manager-845844dd8-hq627 1/1 Running 0 4m39s
pod/cert-manager-cainjector-7b5d65fbcb-qnld4 1/1 Running 0 4m39s
pod/cert-manager-webhook-6fcf4cb6c-9n94f 1/1 Running 0 4m39s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/cert-manager ClusterIP 10.96.228.252 <none> 9402/TCP 4m39s
service/cert-manager-cainjector ClusterIP 10.96.50.51 <none> 9402/TCP 4m39s
service/cert-manager-webhook ClusterIP 10.96.176.129 <none> 443/TCP,9402/TCP 4m39s
NAME ENDPOINTS AGE
endpoints/cert-manager 10.244.0.7:9402 4m39s
endpoints/cert-manager-cainjector 10.244.0.6:9402 4m39s
endpoints/cert-manager-webhook 10.244.0.8:10250,10.244.0.8:9402 4m39s
NAME DATA AGE
configmap/kube-root-ca.crt 1 4m40s
NAME TYPE DATA AGE
secret/cert-manager-webhook-ca Opaque 3 4m29s
NAME AGE
serviceaccount/cert-manager 4m40s
serviceaccount/cert-manager-cainjector 4m40s
serviceaccount/cert-manager-webhook 4m40s
serviceaccount/default 4m40s
> kubectl get issuers.cert-manager.io -A ○ kind-myk8s 07:35:31
NAMESPACE NAME READY AGE
capd-system capd-selfsigned-issuer True 4m38s
capi-kubeadm-bootstrap-system capi-kubeadm-bootstrap-selfsigned-issuer True 4m39s
capi-kubeadm-control-plane-system capi-kubeadm-control-plane-selfsigned-issuer True 4m39s
capi-system capi-selfsigned-issuer True 4m41s
> kubectl get certificaterequests.cert-manager.io -A -owide ○ kind-myk8s 07:35:44
NAMESPACE NAME APPROVED DENIED READY ISSUER REQUESTER STATUS AGE
capd-system capd-serving-cert-1 True True capd-selfsigned-issuer system:serviceaccount:cert-manager:cert-manager Certificate fetched from issuer successfully 4m49s
capi-kubeadm-bootstrap-system capi-kubeadm-bootstrap-serving-cert-1 True True capi-kubeadm-bootstrap-selfsigned-issuer system:serviceaccount:cert-manager:cert-manager Certificate fetched from issuer successfully 4m51s
capi-kubeadm-control-plane-system capi-kubeadm-control-plane-serving-cert-1 True True capi-kubeadm-control-plane-selfsigned-issuer system:serviceaccount:cert-manager:cert-manager Certificate fetched from issuer successfully 4m50s
capi-system capi-serving-cert-1 True True capi-selfsigned-issuer system:serviceaccount:cert-manager:cert-manager Certificate fetched from issuer successfully 4m52s
> kubectl get certificates.cert-manager.io -A -owide ○ kind-myk8s 07:36:05
NAMESPACE NAME READY SECRET ISSUER STATUS AGE
capd-system capd-serving-cert True capd-webhook-service-cert capd-selfsigned-issuer Certificate is up to date and has not expired 5m12s
capi-kubeadm-bootstrap-system capi-kubeadm-bootstrap-serving-cert True capi-kubeadm-bootstrap-webhook-service-cert capi-kubeadm-bootstrap-selfsigned-issuer Certificate is up to date and has not expired 5m13s
capi-kubeadm-control-plane-system capi-kubeadm-control-plane-serving-cert True capi-kubeadm-control-plane-webhook-service-cert capi-kubeadm-control-plane-selfsigned-issuer Certificate is up to date and has not expired 5m13s
capi-system capi-serving-cert True capi-webhook-service-cert capi-selfsigned-issuer Certificate is up to date and has not expired 5m15s
첫 번째 워크로드 클러스터 생성 및 확인
# 첫 번째 워크로드 구성을 위한 환경 변수 설정 : 필요에 맞게 수정.
## The list of service CIDR, default ["10.128.0.0/12"]
> export SERVICE_CIDR=["10.20.0.0/16"]
## The list of pod CIDR, default ["192.168.0.0/16"]
> export POD_CIDR=["10.10.0.0/16"]
## The service domain, default "cluster.local"
> export SERVICE_DOMAIN="myk8s-1.local"
## PSS Disable
> export POD_SECURITY_STANDARD_ENABLED="false"
> clusterctl generate cluster capi-quickstart --flavor development \
--kubernetes-version v1.34.3 \
--control-plane-machine-count=3 \
--worker-machine-count=3 \
> capi-quickstart.yaml
> cat capi-quickstart.yaml | grep -E '^apiVersion:|^kind:' 07:37:12
apiVersion: cluster.x-k8s.io/v1beta2
kind: ClusterClass
apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
kind: DockerClusterTemplate
apiVersion: controlplane.cluster.x-k8s.io/v1beta2
kind: KubeadmControlPlaneTemplate
apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
kind: DockerMachineTemplate
apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
kind: DockerMachineTemplate
apiVersion: infrastructure.cluster.x-k8s.io/v1beta2
kind: DockerMachinePoolTemplate
apiVersion: bootstrap.cluster.x-k8s.io/v1beta2
kind: KubeadmConfigTemplate
apiVersion: cluster.x-k8s.io/v1beta2
kind: Cluster
> kubectl apply -f capi-quickstart.yaml ○ kind-myk8s 07:37:40
clusterclass.cluster.x-k8s.io/quick-start created
dockerclustertemplate.infrastructure.cluster.x-k8s.io/quick-start-cluster created
kubeadmcontrolplanetemplate.controlplane.cluster.x-k8s.io/quick-start-control-plane created
dockermachinetemplate.infrastructure.cluster.x-k8s.io/quick-start-control-plane created
dockermachinetemplate.infrastructure.cluster.x-k8s.io/quick-start-default-worker-machinetemplate created
dockermachinepooltemplate.infrastructure.cluster.x-k8s.io/quick-start-default-worker-machinepooltemplate created
kubeadmconfigtemplate.bootstrap.cluster.x-k8s.io/quick-start-default-worker-bootstraptemplate created
cluster.cluster.x-k8s.io/capi-quickstart created
# 생성 확인 & kubeconfig 자격 증명 & CNI 플러그인 설치 후 확인
> kubectl get cluster -o wide ○ kind-myk8s 07:38:29
NAME CLUSTERCLASS AVAILABLE CP DESIRED CP CURRENT CP READY CP AVAILABLE CP UP-TO-DATE W DESIRED W CURRENT W READY W AVAILABLE W UP-TO-DATE PAUSED PHASE AGE VERSION
capi-quickstart quick-start False 3 1 0 0 1 3 3 0 0 3 False Provisioned 71s v1.34.3
> clusterctl describe cluster capi-quickstart 07:39:31
NAME REPLICAS AVAILABLE READY UP TO DATE STATUS REASON SINCE MESSAGE
Cluster/capi-quickstart 5/6 0 0 5 False NotAvailable 110s * WorkersAvailable:
│ * MachineDeployment capi-quickstart-md-0-z2vw7: 0 available replicas, at least 3 required
│ (spec.strategy.rollout.maxUnavailable is 0, spec.replicas is 3)
├─ClusterInfrastructure - DockerCluster/capi-quickstart-gtgmc True Ready 103s
├─ControlPlane - KubeadmControlPlane/capi-quickstart-m4s8l 2/3 0 0 2 True Available 28s
│ └─2 Machines... 0 0 2 False NotReady 31s See capi-quickstart-m4s8l-c5frx, capi-quickstart-m4s8l-lt9vl
└─Workers
└─MachineDeployment/capi-quickstart-md-0-z2vw7 3/3 0 0 3 False NotAvailable 110s 0 available replicas, at least 3 required (spec.strategy.rollout.maxUnavailable is 0, spec.replicas
│ is 3)
└─3 Machines... 0 0 3 False NotReady 14s See capi-quickstart-md-0-z2vw7-kv5vb-k7h7t, capi-quickstart-md-0-z2vw7-kv5vb-qkrh4, ...
# 워크로드 클러스터 자격증명
> clusterctl get kubeconfig capi-quickstart > capi-quickstart.kubeconfig
# 노드 NotReady 상태 해결 : CNI 플러그인 설치 하자!
> kubectl --kubeconfig=capi-quickstart.kubeconfig apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml
poddisruptionbudget.policy/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
serviceaccount/calico-node created
serviceaccount/calico-cni-plugin created
configmap/calico-config created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgpfilters.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrole.rbac.authorization.k8s.io/calico-cni-plugin created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-cni-plugin created
daemonset.apps/calico-node created
deployment.apps/calico-kube-controllers created
> kubectl --kubeconfig=capi-quickstart.kubeconfig get nodes -owide 3s ○ kind-myk8s 07:43:02
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
capi-quickstart-m4s8l-c5frx Ready control-plane 4m37s v1.34.3 192.168.228.4 <none> Debian GNU/Linux 12 (bookworm) 6.7.11-orbstack-00143-ge6b82e26cd22 containerd://2.2.0
capi-quickstart-m4s8l-lt9vl Ready control-plane 3m22s v1.34.3 192.168.228.8 <none> Debian GNU/Linux 12 (bookworm) 6.7.11-orbstack-00143-ge6b82e26cd22 containerd://2.2.0
capi-quickstart-m4s8l-zh5xj Ready control-plane 2m3s v1.34.3 192.168.228.9 <none> Debian GNU/Linux 12 (bookworm) 6.7.11-orbstack-00143-ge6b82e26cd22 containerd://2.2.0
capi-quickstart-md-0-z2vw7-kv5vb-k7h7t Ready <none> 3m52s v1.34.3 192.168.228.5 <none> Debian GNU/Linux 12 (bookworm) 6.7.11-orbstack-00143-ge6b82e26cd22 containerd://2.2.0
capi-quickstart-md-0-z2vw7-kv5vb-qkrh4 Ready <none> 3m53s v1.34.3 192.168.228.7 <none> Debian GNU/Linux 12 (bookworm) 6.7.11-orbstack-00143-ge6b82e26cd22 containerd://2.2.0
capi-quickstart-md-0-z2vw7-kv5vb-twppz Ready <none> 3m54s v1.34.3 192.168.228.6 <none> Debian GNU/Linux 12 (bookworm) 6.7.11-orbstack-00143-ge6b82e26cd22 containerd://2.2.0
'스터디 > K8s Deploy' 카테고리의 다른 글
| [K8s Deploy] Kubespray offline 설치 (0) | 2026.02.15 |
|---|---|
| [K8s Deploy] Kubespary HA & Upgrade (0) | 2026.02.04 |
| [K8s] Kubespray 배포 분석 (0) | 2026.02.01 |
| [K8s Deploy] Kubeadm Deep Dive (0) | 2026.01.24 |
| [K8s Deploy] Ansible 기초 (1) | 2026.01.18 |