포스트

[K8S Deploy Study by Gasida] - RKE2 - 3 업그레이드

[K8S Deploy Study by Gasida] - RKE2 - 3 업그레이드

RKE2 인증서 갱신 및 버전 업그레이드

인증서 관리 및 수동 갱신

  • RKE2 클라이언트 및 서버 인증서는 발급일로부터 365일 동안 유효하다.
  • 만료되었거나 만료 예정일로부터 120일 이내인 인증서는 RKE2가 시작될 때마다 자동으로 갱신된다.
  • 이 갱신 과정에서 기존 키가 재사용되어 기존 인증서의 유효 기간이 연장된다.
  • 기존 인증서의 유효 기간을 연장하는 대신 새 인증서와 키를 생성하려면 아래에 설명된 하위 명령을 rotate 사용권고
  • 인증서 만료일이 120일 이내로 남았을 때, Kubernetes 경고 이벤트가 CertificateExpirationWarning 생성된다.

    노드 인증서와 만료일 확인

  • k8s-node1(컨트롤 플레인)의 인증서 확인
1
rke2 certificate check --output table

  • k8s-node2(워커노드)의 인증서 확인

인증서 수동 교체 방법

  • k8s-node1(컨트롤플레인) 진입후 서버 중단
1
systemctl stop rke2-server
  • 인증서 로테이션
1
rke2 certificate rotate

  • k8s-node1 (컨트롤 플레인) 재시작
1
2
rke2 certificate check --output table
systemctl start rke2-server
  • kubeconfig 갱신
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 인증서 갱신 시 워커 노드 동작과 동일하다.

업그레이드

업그레이드 소개

  • RKE2 역시 쿠버네티스 버전 편차 정책이 적용된다. (마이너 버전 건너뛰기 금지)
  • 설치 스크립트 또는 자동 업그레이드 기능을 통해 수행되는 업그레이드는 다양한 릴리스 채널과 연결된다. (https://update.rke2.io/v1-release/channels)

채널설명
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 -
  • repo 추가 및 기존 repo 삭제 확인
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 -
  • repo 추가 및 기존 repo 삭제 확인
1
dnf repolist
  • 설치 후 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과 호스트의 모든 / 경로를 마운트로 사용 가능해야 되는 것으로 보임

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.