CentOS Linux 7.9
OS는 rpm 파일 다운 시 영향이 있습니다.
# cat /etc/*release*
CentOS Linux release 7.9.2009 (Core)
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를 사용합니다.
kubernetes 1.19.x를 1.21.x로 업그레이드 하기
vi /etc/kubernetes/manifests/kube-apiserver.yaml
가 초기화 되기 때문에 설정
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
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
yumdownloader
를 사용하여 패키지를 폐쇄망에서도 사용할 수 있도록 rpm파일로 다운로드합니다.
yumdownloader kubelet-$VERSION-0
yumdownloader kubeadm-$VERSION-0
yumdownloader kubectl-$VERSION-0
yumdownloader cri-o-$VERSION.el7.x86_64
먼저 버전을 업그레이드 할 노드의 kubeadm
버전을 업그레이드 합니다.
kubeadm
은 kubernetes의 static pod들의 버전을 업그레이드 해줍니다.
yum upgrade kubeadm-$VERSION-0.x86_64.rpm
kubectl get pdb -A
upgrade할 node의 pod를 조회합니다.
kubectl get pods -A -o wide | grep $NODE
upgrade할 node에 다시 scheduling이 되지 않도록 설정합니다.
kubectl cordon $NODE
pdb와 pvc가 연결된 pod를 먼저 이동합니다.
kubectl delete po -n $NAMESPACE $POD
남은 pod들이 모두 이동 될 수 있도록 drain을 실행합니다.
kubectl drain <node-to-drain> --ignore-daemonsets --delete-local-data
upgrade가 가능한 버전을 확인하고, 현재 클러스터가 upgrade가 가능한 상태인지 확인합니다.
kubeadm upgrade plan
폐쇄망이라면 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.
_____________________________________________________________________
node의 kubernetes를 upgrade 합니다.
kubeadm upgrade apply $VERSION
drain 과정에서 지정한 node의 SchedulingDisabled 상태를 해제합니다.
kubectl uncordon $NODE
kubelet
과 kubectl
패키지 버전을 upgrade 합니다.
yum upgrade \
kubelet-$VERSION-0.x86_64.rpm \
kubectl-$VERSION-0.x86_64.rpm
kubelet 서비스를 재실행합니다.
systemctl daemon-reload
systemctl restart kubelet
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
worker node의 upgrade는 main master upgrade와 조금 다릅니다.
먼저 버전을 업그레이드 할 노드의 kubeadm
버전을 업그레이드 합니다.
kubeadm
은 kubernetes의 static pod들의 버전을 업그레이드 해줍니다.
yum upgrade kubeadm-$VERSION-0.x86_64.rpm
kubectl get pdb -A
upgrade할 node의 pod를 조회합니다.
kubectl get pods -A -o wide | grep $NODE
upgrade할 node에 다시 scheduling이 되지 않도록 설정합니다.
kubectl cordon $NODE
pdb와 pvc가 연결된 pod를 먼저 이동합니다.
kubectl delete po -n $NAMESPACE $POD
남은 pod들이 모두 이동 될 수 있도록 drain을 실행합니다.
kubectl drain <node-to-drain> --ignore-daemonsets --delete-local-data
master와 다르게 kubeadm upgrade node
명령어로만 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.
kubelet
과 kubectl
패키지 버전을 upgrade 합니다.
yum upgrade \
kubelet-$VERSION-0.x86_64.rpm \
kubectl-$VERSION-0.x86_64.rpm
kubelet 서비스를 재실행합니다.
systemctl daemon-reload
systemctl restart kubelet
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
worker node의 경우 작업이 모두 완료된 후 uncordon을 실행합니다.
drain 과정에서 지정한 node의 SchedulingDisabled 상태를 해제합니다.
kubectl uncordon $NODE