RKE2 인증서 갱신 및 버전 업그레이드
인증서 관리 및 수동 갱신
- RKE2 클라이언트 및 서버 인증서는 발급일로부터 365일 동안 유효하다.
- 만료되었거나 만료 예정일로부터 120일 이내인 인증서는 RKE2가 시작될 때마다 자동으로 갱신된다.
- 이 갱신 과정에서 기존 키가 재사용되어 기존 인증서의 유효 기간이 연장된다.
- 기존 인증서의 유효 기간을 연장하는 대신 새 인증서와 키를 생성하려면 아래에 설명된 하위 명령을
rotate 사용권고 - 인증서 만료일이 120일 이내로 남았을 때, Kubernetes 경고 이벤트가
CertificateExpirationWarning 생성된다.노드 인증서와 만료일 확인
k8s-node1(컨트롤 플레인)의 인증서 확인
1
| rke2 certificate check --output table
|
인증서 수동 교체 방법
k8s-node1(컨트롤플레인) 진입후 서버 중단
1
| systemctl stop rke2-server
|
1
| rke2 certificate rotate
|
1
2
| rke2 certificate check --output table
systemctl start rke2-server
|
1
2
3
| diff /etc/rancher/rke2/rke2.yaml ~/.kube/config
yes | cp /etc/rancher/rke2/rke2.yaml ~/.kube/config ; echo
kubectl cluster-info
|
rke2-agent는 기존 연결이 끊기면, server에 다시 붙으면서 새 CA 기준으로 인증서 재발급한다. → 기존 kubeadm 인증서 갱신 시 워커 노드 동작과 동일하다.
업그레이드
업그레이드 소개
| 채널 | 설명 |
|---|
| stable | (기본값) 안정 버전은 운영 환경에 권장된다. 이러한 릴리스는 커뮤니티 검증을 거쳐 안정화되었으며, Rancher의 최신 릴리스와 호환된다. |
| latest | 최신 기능을 사용해 보려면 최신 버전을 사용하는 것이 좋음 이러한 릴리스는 아직 커뮤니티 검증 과정을 거치지 않았으므로 Rancher와 호환되지 않을 수 있음 |
| v1.34 (예시) | Kubernetes의 각 마이너 버전(지원 종료된 버전 포함)에는 릴리스 채널이 연결되어 있다.. 이러한 채널은 안정적인 릴리스가 아닌 사용 가능한 최신 패치를 선택한다. |
업그레이드 수동 (v1.33 → v1.34)
컨트롤 플레인 업그레이드
수동업그레이드 절차: 컨트롤 플레인을 하나씩 업그레이드 완료 → 이후 워커(에이전트) 노드를 업그레이드
1
2
| kubectl get node
rke2 --version
|
1
| curl -s https://update.rke2.io/v1-release/channels | jq .data
|
- 위 스크립트 설치 과정만으로 신규 재생성된 파드 확인
1
| kubectl get pod -n kube-system --sort-by=.metadata.creationTimestamp | tac
|
- v1.34 버전 업그레이드
- 아래 Running scriptlet 과정에서 업그레이드 수행됨, app 통신 영향 없음
1
| curl -sfL https://get.rke2.io | INSTALL_RKE2_CHANNEL=v1.34 sh -
|
1
2
3
4
5
6
7
8
9
10
11
12
| dnf repolist
tree /etc/yum.repos.d/
cat /etc/yum.repos.d/rancher-rke2.repo
cat /etc/yum.repos.d/rancher-rke2.repo | grep -iE 'name|baseurl'
kubectl get pods -n kube-system -o custom-columns="POD_NAME:.metadata.name,IMAGES:.spec.containers[*].image"
kubectl get pods -n kube-system \
-o custom-columns=\
POD:.metadata.name,\
CONTAINERS:.spec.containers[*].name,\
IMAGES:.spec.containers[*].image
|
1
| systemctl restart rke2-server
|
1
| kubectl get node -owide
|
1
2
3
4
5
6
7
8
9
| while true; do curl -s http://192.168.10.12:30000 | grep Hostname; date; sleep 1; done
watch -d "kubectl get pod -n kube-system -owide --sort-by=.metadata.creationTimestamp | tac"
watch -d "kubectl get node"
watch -d etcdctl \
--endpoints=https://127.0.0.1:2379 \
--cacert=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt \
--cert=/var/lib/rancher/rke2/server/tls/etcd/client.crt \
--key=/var/lib/rancher/rke2/server/tls/etcd/client.key \
member list --write-out=table
|
워커노드 업그레이드
- 특정 채널(예: 최신 버전)의 최신 버전으로 업그레이드하려면 해당 채널을 지정
1
2
| rke2 --version
curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE=agent INSTALL_RKE2_CHANNEL=v1.34 sh -
|
- 설치 후 rke2 프로세스를 다시 시작 : Agent nodes
1
| systemctl restart rke2-agent
|
서버노드 확인
1
2
3
4
5
6
7
8
9
| # kubeconfig 갱신 필요없음
diff /etc/rancher/rke2/rke2.yaml ~/.kube/config
# 노드 확인
kubectl get node -owide
# kube-system 파드별 컨테이너 이미지 정보 출력
kubectl get pods -n kube-system -o custom-columns="POD_NAME:.metadata.name,IMAGES:.spec.containers[*].image"
|
- 워커노드에 kube-proxy 파드만 신규 재기동
1
| kubectl get pod -n kube-system --sort-by=.metadata.creationTimestamp | tac
|
업그레이드 자동
Rancher에서 개발한 이 컨트롤러는 쿠버네티스의 CRD(Custom Resource Definition)인 Plan을 사용하여 업그레이드를 관리한다.
- Rancher의 시스템 업그레이드 컨트롤러를 사용하여 RKE2 클러스터 업그레이드를 관리 (Kubernetes 네이티브 방식의 클러스터 업그레이드)
- 사용자 Plan정의 리소스를 활용하여 업그레이드할 노드와 업그레이드할 버전을 선언적으로 지정
- 이
Plan은 업그레이드 정책 및 요구 사항을 정의합니다. 또한 레이블 선택기를 통해 업그레이드할 노드를 지정합니다 . 시스템 업그레이드 컨트롤러는 업그레이드 계획을 모니터링하고 업그레이드 작업을 실행할 노드를 선택하여 업그레이드 Plan 을 관리- 작업이 성공적으로 완료되면 컨트롤러는 해당 작업이 실행된 노드에 적절한 레이블을 지정
- (참고) RKE2 클러스터가 Rancher로 관리되는 경우 Rancher UI를 사용하여 업그레이드를 관리
시스템 업그레이드 컨트롤러 사용
- 클러스터에
system-upgrade-controller를 설치한다 - 업그레이드할 노드 그룹과 업그레이드 방법을 설명하는 계획을 수립
- 서버 노드는 항상 에이전트 노드보다 먼저 업그레이드 해야함
- 서버노드 업그레이드 계획 / 에이전트 노드 업그레이드 계획 을 생성
- 필요에 따라 추가 계획을 생성하여 노드간 업그레이드 배포를 제어
- 계획이 생성되면 컨트롤러가 이를 인식하고 클러스터 업그레이드를 시작
업그레이드 플랜 작성하기
① Server 노드 업그레이드 플랜
모든 컨트롤 플레인 노드를 하나씩(concurrency: 1) 순차적으로 업그레이드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| 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
channel: https://update.rke2.io/v1-release/channels/stable
|
② Agent 노드 업그레이드 플랜
서버 업그레이드가 완료된 것을 확인(prepare 단계)한 후 작업을 시작
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
name: agent-plan
namespace: system-upgrade
spec:
concurrency: 1
cordon: true
nodeSelector:
matchExpressions:
- key: node-role.kubernetes.io/control-plane
operator: DoesNotExist # 컨트롤 플레인이 아닌 노드(에이전트)만 선택
prepare: # ★ 중요: 서버 플랜이 끝날 때까지 대기
args:
- prepare
- server-plan
image: rancher/rke2-upgrade
serviceAccountName: system-upgrade
upgrade:
image: rancher/rke2-upgrade
channel: https://update.rke2.io/v1-release/channels/stable
|
자동 업그레이드 실행 (v1.34 → v1.35)
1) system-upgrade-controller 설치
1
2
| 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
|
1
2
3
| kubectl get deploy,pod,cm -n system-upgrade
kubectl get crd | grep upgrade
kubectl logs -n system-upgrade -l app.kubernetes.io/name=system-upgrade-controller -f
|
2) 계획 작성 후 실행 및 확인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
| 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
channel: https://update.rke2.io/v1-release/channels/latest # version: v1.35.0+rke2r3 , curl -s https://update.rke2.io/v1-release/channels | jq .data
---
apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
name: agent-plan
namespace: system-upgrade
spec:
concurrency: 1
cordon: true
nodeSelector:
matchExpressions:
- key: node-role.kubernetes.io/control-plane
operator: DoesNotExist
prepare:
args:
- prepare
- server-plan
image: rancher/rke2-upgrade
serviceAccountName: system-upgrade
upgrade:
image: rancher/rke2-upgrade
channel: https://update.rke2.io/v1-release/channels/latest
EOF
|
1
2
3
4
5
6
| kubectl get node -owide
kubectl -n system-upgrade get plans -o wide
kubectl -n system-upgrade get jobs
kubectl get pod -n system-upgrade -owide
kubectl describe pod -n system-upgrade |grep ^Volumes: -A4
kubectl logs -n system-upgrade -l app.kubernetes.io/name=system-upgrade-controller
|
- job 에 의해 생성된 파드가 업그레이드 관련 수행을 시도하니, 해당 파드는 상당한 권한의 rbac과 호스트의 모든 / 경로를 마운트로 사용 가능해야 되는 것으로 보임