[kubernetes] kubernetes 버전 업그레이드 가이드

김동완 (Joseph Kim)·2023년 5월 3일
0

kubernetes

목록 보기
1/3
post-thumbnail

포스팅 이유

기존에 사용하던 kubernetes 버전이 낮아 높은 버전으로 업그레이드를 하고자 함.

폐쇄망 환경에서도 업그레이드 할 수 있도록 테스트 진행.

클러스터 정보
마스터 1대, 워커 1대인 클러스터 (CentOS8)
kubernetes v1.20.6 버전이 설치되어 있고 v1.21.14로 업그레이드 진행

업그레이드 방법

Master Node 업그레이드 절차

1. kubeadm rpm파일 다운로드

kubeadm rpm 파일을 다운로드 하기 위해 kubernetes repo를 추가합니다.

## yum repo 추가
cd /etc/yum.repos.d
cat > kubernetes.repo <<EOF
 [kubernetes]
 name=Kubernetes
 baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
 enabled=1
 gpgcheck=1
 repo_gpgcheck=1
 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
 EOF
repo가 추가된 것을 확인할 수 있습니다.

2. yumdownloader사용을 위해 yum-utils를 설치 후 rpm 다운 및 설치

yum install yum-utils

yumdownloader를 사용하여 kubeadm-1.21.14-0, kubectl-1.21.14-0, kubelet-1.21.14-0 버전 rpm파일을 다운받습니다.

yumdownloader --downloadonly kubeadm-1.21.14-0 --disableexcludes=kubernetes
yumdownloader --downloadonly kubectl-1.21.14-0 --disableexcludes=kubernetes
yumdownloader --downloadonly kubelet-1.21.14-0 --disableexcludes=kubernetes

다운 받은 kubeadm rpm파일을 설치합니다.

rpm -ivh --nodeps --force 405062026207cd61826786f22f6f2d4f26bf08e510a51d61936629cc11d6fdb5-kubeadm-1.21.14-0.x86_64.rpm

3. 마스터 노드에 drain을 걸고 업그레이드에 필요한 사전 작업 수행

## kubectl drain ${hostname} --ignore-daemonsets
kubectl drain master --ignore-daemonsets

master노드가 drain 걸린것을 확인할 수 있습니다.

업그레이드할 정보를 미리 확인해보면

kubeadm upgrade plan

다음과 같이 TARGET 버전의 정보가 나옵니다.
이제 위에 해당하는 버전의 COPONENET들 이미지가 local registry에 넣어줘야 합니다.

kubeadm config images list

커맨드를 통해 이미지 리스트를 확인하고 리스트에 있는 이미지를 local registry정보로 tag하여 push해줍니다.

## image pull
podman pull k8s.gcr.io/kube-apiserver:v1.21.14
podman pull k8s.gcr.io/kube-controller-manager:v1.21.14
podman pull k8s.gcr.io/kube-scheduler:v1.21.14
podman pull k8s.gcr.io/kube-proxy:v1.21.14
podman pull k8s.gcr.io/pause:3.4.1
podman pull k8s.gcr.io/etcd:3.4.13-0
podman pull k8s.gcr.io/coredns/coredns:v1.8.0

## tar로 저장
podman save -o kube-api-21.tar k8s.gcr.io/kube-apiserver:v1.21.14
podman save -o kube-control-21.tar k8s.gcr.io/kube-controller-manager:v1.21.14
podman save -o kube-sche-21.tar k8s.gcr.io/kube-scheduler:v1.21.14
podman save -o kube-prox-21.tar k8s.gcr.io/kube-proxy:v1.21.14
podman save -o pause-21.tar k8s.gcr.io/pause:3.4.1
podman save -o etcd-21.tar k8s.gcr.io/etcd:3.4.13-0
podman save -o coredn-21.tar k8s.gcr.io/coredns/coredns:v1.8.0

## local registry 주소 tag
podman tag k8s.gcr.io/kube-apiserver:v1.21.14          192.168.178.109:5000/k8s.gcr.io/kube-apiserver:v1.21.14
podman tag k8s.gcr.io/kube-controller-manager:v1.21.14 192.168.178.109:5000/k8s.gcr.io/kube-controller-manager:v1.21.14
podman tag k8s.gcr.io/kube-scheduler:v1.21.14          192.168.178.109:5000/k8s.gcr.io/kube-scheduler:v1.21.14
podman tag k8s.gcr.io/kube-proxy:v1.21.14              192.168.178.109:5000/k8s.gcr.io/kube-proxy:v1.21.14
podman tag k8s.gcr.io/pause:3.4.1                      192.168.178.109:5000/k8s.gcr.io/pause:3.4.1
podman tag k8s.gcr.io/etcd:3.4.13-0                    192.168.178.109:5000/k8s.gcr.io/etcd:3.4.13-0
podman tag k8s.gcr.io/coredns/coredns:v1.8.0           192.168.178.109:5000/k8s.gcr.io/coredns/coredns:v1.8.0

## local registry에 push
podman push 192.168.178.109:5000/k8s.gcr.io/kube-apiserver:v1.21.14
podman push 192.168.178.109:5000/k8s.gcr.io/kube-controller-manager:v1.21.14
podman push 192.168.178.109:5000/k8s.gcr.io/kube-scheduler:v1.21.14
podman push 192.168.178.109:5000/k8s.gcr.io/kube-proxy:v1.21.14
podman push 192.168.178.109:5000/k8s.gcr.io/pause:3.4.1
podman push 192.168.178.109:5000/k8s.gcr.io/etcd:3.4.13-0
podman push 192.168.178.109:5000/k8s.gcr.io/coredns/coredns:v1.8.0

이후 loacl registry에 넣어준 이미지로 변경해줍니다.

kubeadm config images list --kubernetes-version=v1.21.0 | sed -e 's#k8s.gcr.io#192.168.178.109:5000/k8s.gcr.io#g' | sudo tee /etc/kubernetes/images.yaml

4. 업그레이드 진행

kubeadm upgrade apply v1.21.14 --certificate-renewal=false
# --certificate-renewal=false 옵션을 주면 인증서 갱신 없이 기존 인증서로 진행 됨

위와 같이 진행되면 정상적으로 진행되고 있는것을 확인할 수 있습니다.

성공적으로 업그레이드에 성공한것을 확인할 수 있습니다.
이후 다운 받은 kubectl과 kubelet rpm파일을 설치합니다.

rpm -ivh --nodeps --force 91a0859e8765b2562d0c1c60c55c11fd9f85717365ea07d40ee519090650faf2-kubectl-1.21.14-0.x86_64.rpm
rpm -ivh --nodeps --force 6894556cf9a7f88e6289937f3199fbdf4748d7411deab761a5499d1372df3c51-kubelet-1.21.14-0.x86_64.rpm

kubelet을 재기동합니다.

systemctl restart kubelet

마지막으로 마스터 노드를 uncordon 해주고 업그레이드가 잘 되었는지 확인합니다

## kubectl uncordon ${hostname}
kubectl uncordon master
kubectl get nodes

Worker Node 업그레이드 절차

워커노드는 마스터보다 간단합니다.

1. kubeadm rpm 설치

다운 받은 kubeadm rpm파일을 설치합니다.

rpm -ivh --nodeps --force 405062026207cd61826786f22f6f2d4f26bf08e510a51d61936629cc11d6fdb5-kubeadm-1.21.14-0.x86_64.rpm

2. 워커 노드에 drain 설정

## kubectl drain ${hostname} --ignore-daemonsets
kubectl drain worker --ignore-daemonsets

3. 업그레이드 진행

kubeadm upgrade node

위와 같이 정상적으로 업그레이드가 진행된 것을 확인할 수 있습니다.

이후 kubelet rpm 파일을 설치합니다.

rpm -ivh --nodeps --force 6894556cf9a7f88e6289937f3199fbdf4748d7411deab761a5499d1372df3c51-kubelet-1.21.14-0.x86_64.rpm

kubelet을 재기동합니다.

systemctl restart kubelet

마지막으로 워커 노드를 uncordon 해주고 업그레이드가 잘 되었는지 확인합니다

## kubectl uncordon ${hostname}
kubectl uncordon worker
kubectl get nodes

마무리

  1. 마스터와 워커가 여러개인 경우 마스터 노드를 한개씩 순차적으로 진행하고 이후 워커 노드들도 순차적으로 위 절차에 따라 진행하면 됩니다.

  2. 폐쇄망 환경의 경우 외부망 통신이 가능한곳에서 이미지 파일과 rpm파일을 다운받고 폐쇄망 환경으로 옮겨서 위 절차에 따라 진행하면 됩니다.

profile
Kubernetes / DevOps / Git / Network / AWS / Terraform / Opensource / Java / Springboot

0개의 댓글