k8s 버전 업그레이드

김건호·2023년 1월 25일
2

0. 개요

0.1. 환경

0.1.1. OS 버전

CentOS Linux 7.9
OS는 rpm 파일 다운 시 영향이 있습니다.

# cat /etc/*release*
CentOS Linux release 7.9.2009 (Core)

0.1.2. cluster 환경

maseter/woker 1대, worker 2대로 구성되어 있습니다.

# kubectl get node
NAME          STATUS   ROLES                  AGE   VERSION
ps01          Ready    control-plane,master   24d   v1.19.4
ps02          Ready    <none>                 24d   v1.19.4
ps03          Ready    <none>                 24d   v1.19.4

CONTAINER-RUNTIME은 cri-o를 사용합니다.

0.2. 작업 목표

kubernetes 1.19.x를 1.21.x로 업그레이드 하기

0.3. 필요한 내용 백업

vi /etc/kubernetes/manifests/kube-apiserver.yaml가 초기화 되기 때문에 설정

1. Setting

1.1. kubernetes repo 추가

kubernetes 1.20.1과 1.21.14 패키지를 받기 위한 repo를 추가합니다.
자세한 내용은 install-kubectl-linux 을 참조합니다.

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

1.2. cri-o repo 추가

OS 및 cri-o 설정에 관한 자세한 내용은 github-cri-o-install을 참조합니다.

export OS=CentOS_7
export VERSION=1.20 <-- Major 버전까지만 지정
export VERSION=1.21:1.21.14 <-- Minor 버전까지 지정

curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo \
https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/devel:kubic:libcontainers:stable.repo
curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.repo \
https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$VERSION/$OS/devel:kubic:libcontainers:stable:cri-o:$VERSION.repo

1.3. rpm 파일 다운로드

yumdownloader 를 사용하여 패키지를 폐쇄망에서도 사용할 수 있도록 rpm파일로 다운로드합니다.

yumdownloader kubelet-$VERSION-0
yumdownloader kubeadm-$VERSION-0
yumdownloader kubectl-$VERSION-0

yumdownloader cri-o-$VERSION.el7.x86_64

2. main master node upgrade

2.1. kubeadm upgrade

먼저 버전을 업그레이드 할 노드의 kubeadm 버전을 업그레이드 합니다.
kubeadm은 kubernetes의 static pod들의 버전을 업그레이드 해줍니다.

yum upgrade kubeadm-$VERSION-0.x86_64.rpm

2.2. 실행중인 pod drain

2.2.1. pdb 확인

kubectl get pdb -A

2.2.2. pvc와 연결된 pod 확인

upgrade할 node의 pod를 조회합니다.

kubectl get pods -A -o wide | grep $NODE

2.2.3. pod 이동

upgrade할 node에 다시 scheduling이 되지 않도록 설정합니다.

kubectl cordon $NODE

pdb와 pvc가 연결된 pod를 먼저 이동합니다.

kubectl delete po -n $NAMESPACE $POD

2.2.4. drain

남은 pod들이 모두 이동 될 수 있도록 drain을 실행합니다.

kubectl drain <node-to-drain> --ignore-daemonsets --delete-local-data

2.3. kubeadm upgrade plan

upgrade가 가능한 버전을 확인하고, 현재 클러스터가 upgrade가 가능한 상태인지 확인합니다.

kubeadm upgrade plan

2.3.1. 필요한 이미지 버전확인

폐쇄망이라면 kube-apiserver, kube-controller-manager, kube-scheduler, kube-proxy, etcd, CoreDNS, pasue 이미지를 표시되는 버전에 맞게 준비합니다.

Components that must be upgraded manually 
after you have upgraded the control plane with 'kubeadm upgrade apply':
COMPONENT   CURRENT       AVAILABLE
kubelet     3 x v1.19.4   v1.20.15

Upgrade to the latest stable version:

COMPONENT                 CURRENT    AVAILABLE
kube-apiserver            v1.19.4    v1.20.15
kube-controller-manager   v1.19.4    v1.20.15
kube-scheduler            v1.19.4    v1.20.15
kube-proxy                v1.19.4    v1.20.15
CoreDNS                   1.7.0      1.7.0
etcd                      3.4.13-0   3.4.13-0

You can now apply the upgrade by executing the following command:

        kubeadm upgrade apply v1.20.15

Note: Before you can perform this upgrade, you have to update kubeadm to v1.20.15.

_____________________________________________________________________

2.4. upgrade

2.4.1. kubernetes upgrade

node의 kubernetes를 upgrade 합니다.

kubeadm upgrade apply $VERSION

drain 과정에서 지정한 node의 SchedulingDisabled 상태를 해제합니다.

kubectl uncordon $NODE

2.4.2. kubelet, kubectl upgrade

kubeletkubectl 패키지 버전을 upgrade 합니다.

yum upgrade \
kubelet-$VERSION-0.x86_64.rpm \
kubectl-$VERSION-0.x86_64.rpm

kubelet 서비스를 재실행합니다.

systemctl daemon-reload
systemctl restart kubelet

2.4.3. cri-o upgrade

yum install cri-o-$VERSION.rpm

install이 되지 않는다면 cri-o를 삭제 후, 재설하여 버전을 upgrade 합니다.

yum remove cri-o

삭제 후, 재설치를 하는 경우 /etc/crio/crio.conf가 초기화 됩니다.
설정한 내용이 있다면 백업 후, 진행합니다

# vi /etc/crio/crio.conf
pause_image = "$REGISTRY/k8s.gcr.io/pause:$VERSION"
insecure_registries = ["$REGISTRY"]
pids_limit = 32768

crio 서비스를 재시작합니다.

systemctl daemon-reload
systemctl restart crio

3. worker node upgrade

worker node의 upgrade는 main master upgrade와 조금 다릅니다.

3.1. kubeadm upgrade

먼저 버전을 업그레이드 할 노드의 kubeadm 버전을 업그레이드 합니다.
kubeadm은 kubernetes의 static pod들의 버전을 업그레이드 해줍니다.

yum upgrade kubeadm-$VERSION-0.x86_64.rpm

3.2. 실행중인 pod drain

3.2.1. pdb 확인

kubectl get pdb -A

3.2.2. pvc와 연결된 pod 확인

upgrade할 node의 pod를 조회합니다.

kubectl get pods -A -o wide | grep $NODE

3.2.3. pod 이동

upgrade할 node에 다시 scheduling이 되지 않도록 설정합니다.

kubectl cordon $NODE

pdb와 pvc가 연결된 pod를 먼저 이동합니다.

kubectl delete po -n $NAMESPACE $POD

3.2.4. drain

남은 pod들이 모두 이동 될 수 있도록 drain을 실행합니다.

kubectl drain <node-to-drain> --ignore-daemonsets --delete-local-data

3.3. upgrade

master와 다르게 kubeadm upgrade node 명령어로만 upgrade 합니다.

2.3.1. kubernetes upgrade

node의 kubernetes를 upgrade 합니다.

# kubeadm upgrade node

[upgrade] Reading configuration from the cluster...
[upgrade] FYI: You can look at this config file 
with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[preflight] Running pre-flight checks
[preflight] Skipping prepull. Not a control plane node.
[upgrade] Skipping phase. Not a control plane node.
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[upgrade] The configuration for this node was successfully updated!
[upgrade] Now you should go ahead and upgrade the kubelet package using your package manager.

2.3.2. kubelet, kubectl upgrade

kubeletkubectl 패키지 버전을 upgrade 합니다.

yum upgrade \
kubelet-$VERSION-0.x86_64.rpm \
kubectl-$VERSION-0.x86_64.rpm

kubelet 서비스를 재실행합니다.

systemctl daemon-reload
systemctl restart kubelet

2.3.3. cri-o upgrade

yum install cri-o-$VERSION.rpm

install이 되지 않는다면 cri-o를 삭제 후, 재설하여 버전을 upgrade 합니다.

yum remove cri-o

삭제 후, 재설치를 하는 경우 /etc/crio/crio.conf가 초기화 됩니다.
설정한 내용이 있다면 백업 후, 진행합니다

# vi /etc/crio/crio.conf
pause_image = "$REGISTRY/k8s.gcr.io/pause:$VERSION"
insecure_registries = ["$REGISTRY"]
pids_limit = 32768

crio 서비스를 재시작합니다.

systemctl daemon-reload
systemctl restart crio

3.4. SchedulingDisabled 상태 해제

worker node의 경우 작업이 모두 완료된 후 uncordon을 실행합니다.
drain 과정에서 지정한 node의 SchedulingDisabled 상태를 해제합니다.

kubectl uncordon $NODE
profile
Ken, 🔽🔽 거노밥 유튜브(house icon) 🔽🔽

0개의 댓글