Я продолжаю разбираться в тонкостях платформы Kubernetes. Параллельно делаю какие-то конспекты вида этой публикации. Сегодня по плану – разобраться, как происходит обновление кластера Kubernetes.
В качестве опорного руководства я использовал соответствующий раздел из официально документации.
Общее описание процесса обновления
В качестве стенда я буду использовать кластер вот из этой публикации.
Процесс обновления включает следующие шаги:
- Последовательное обновление узлов плоскости управления.
- Последовательное обновление узлов рабочей нагрузки.
- Проверка работы кластера после завершения процедуры обновления.
Обновление рекомендуется выполнять последовательно межу минорными версиями. Например, выполнять обновление с версии 1.26.0 до версии 1.27.0. Или выполнять обновления в пределах одной версии. Например, с 1.26.0 до 1.26.1. Пропускать сразу несколько минорных версий не рекомендуется и даже заявляется, как unsupported.
Обновление кластера Kubernetes
Я кратко продемонстрирую, как выполняется обновление кластера.
Обновление узлов плоскости управления
В моем примере всего один узел управления. Подключусь к нему и проверю текущую версию Kubernetes:
kubectl get nodes
roman@master01:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01 Ready control-plane 202d v1.26.1
worker01 Ready worker 202d v1.26.1
worker02 Ready worker 202d v1.26.1
Следовательно, в моем случае сначала необходимо выполнить обновление с версии 1.26.1 до версии 1.27.0 для всех компонентов. Вторым шагом выполнить обновление с версии 1.27.0 до версии 1.28.0.
Определим следующую за текущей версией (1.26.1) актуальную версию:
sudo apt update
sudo apt-cache madison kubeadm | head -10
Итого с версии 1.26.1 необходимо выполнить обновление до версии 1.27.4.
Приступим:
1. Сначала обновим kubeadm:
sudo apt-mark unhold kubeadm && \
sudo apt-get update && sudo apt-get install -y kubeadm=1.27.4-00 && \
sudo apt-mark hold kubeadm
2. Проверим текущую версию kubeadm:
kubeadm version
roman@master01:~$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"27", GitVersion:"v1.27.4", GitCommit:"fa3d7990104d7c1f16943a67f11b154b71f6a132", GitTreeState:"clean", BuildDate:"2023-07-19T12:19:40Z", GoVersion:"go1.20.6", Compiler:"gc", Platform:"linux/amd64"}
Обновление kubeadm прошло успешно.
3. Посмотрим, какой план обновления нам может предложить kubeadm:
sudo kubeadm upgrade plan
Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
COMPONENT CURRENT TARGET
kubelet 3 x v1.26.1 v1.27.4
Upgrade to the latest stable version:
COMPONENT CURRENT TARGET
kube-apiserver v1.26.1 v1.27.4
kube-controller-manager v1.26.1 v1.27.4
kube-scheduler v1.26.1 v1.27.4
kube-proxy v1.26.1 v1.27.4
CoreDNS v1.9.3 v1.10.1
etcd 3.5.6-0 3.5.7-0
You can now apply the upgrade by executing the following command:
kubeadm upgrade apply v1.27.4
_____________________________________________________________________
The table below shows the current state of component configs as understood by this version of kubeadm.
Configs that have a "yes" mark in the "MANUAL UPGRADE REQUIRED" column require manual config upgrade or
resetting to kubeadm defaults before a successful upgrade can be performed. The version to manually
upgrade to is denoted in the "PREFERRED VERSION" column.
API GROUP CURRENT VERSION PREFERRED VERSION MANUAL UPGRADE REQUIRED
kubeproxy.config.k8s.io v1alpha1 v1alpha1 no
kubelet.config.k8s.io v1beta1 v1beta1 no
_____________________________________________________________________
т.е. максимально с текущей версии (1.26.1) я могу обновиться до версии 1.27.4.
4. Выполним обновление:
sudo kubeadm upgrade apply v1.27.4
upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.27.4". Enjoy!
[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.
5. Подготовим узел управления к обновлению остальных компонентов системы, т.е. переведем узел в режим обслуживания:
kubectl drain master01 --ignore-daemonsets
roman@master01:~$ kubectl drain master01 --ignore-daemonsets
node/master01 cordoned
Warning: ignoring DaemonSet-managed Pods: kube-system/calico-node-8zwbh, kube-system/kube-proxy-jlcrs
evicting pod kube-system/calico-kube-controllers-57b57c56f-tz9td
pod/calico-kube-controllers-57b57c56f-tz9td evicted
node/master01 drained
6. Обновим kubelet и kubectl:
sudo apt-mark unhold kubelet kubectl && \
sudo apt-get update && sudo apt-get install -y kubelet=1.27.4-00 kubectl=1.27.4-00 && \
sudo apt-mark hold kubelet kubectl
7. Перезапустим службы:
sudo systemctl daemon-reload
sudo systemctl restart kubelet
8. Выведем узел из режима обслуживания:
kubectl uncordon master01
9. Проверим статус узла плоскости управления:
kubectl get nodes
Обновление узлов рабочей нагрузки
Обновление узлов рабочей нагрузки во многом выполняется аналогично обновлению узлов плоскости управления. Узлы рабочей нагрузки обновляются последовательно.
1. Сначала обновим kubeadm:
sudo apt update
sudo apt-mark unhold kubeadm && \
sudo apt-get update && sudo apt-get install -y kubeadm=1.27.4-00 && \
sudo apt-mark hold kubeadm
2. Инициируем процесс обновления узла рабочей нагрузки:
sudo kubeadm upgrade node
3. Переведем узел в режим обслуживания:
kubectl drain worker01 --ignore-daemonsets
Если какие-то узлы рабочей нагрузки содержат поды с локальным хранилищем, то, скорее всего, вам нужно будет указать некоторые дополнительные опции: –delete-emptydir-data –force. В противном случае не получится эвакуировать всю нагрузку с узла. Но будьте аккуратны с этими параметрами, чтобы не потерять нужные вам данные.
4. Выполним обновление остальных компонентов:
sudo apt-mark unhold kubelet kubectl && \
sudo apt-get update && sudo apt-get install -y kubelet=1.27.4-00 kubectl=1.27.4-00 && \
sudo apt-mark hold kubelet kubectl
5. Перезапустим службы:
sudo systemctl daemon-reload
sudo systemctl restart kubelet
6. Выведем узел из режима обслуживания:
kubectl uncordon worker01
7. Проверим версию для узла worker01:
kubectl get node
roman@master01:~$ kubectl get node
NAME STATUS ROLES AGE VERSION
master01 Ready control-plane 203d v1.27.4
worker01 Ready worker 203d v1.27.4
worker02 Ready worker 203d v1.26.1
Обновление оставшихся узлов рабочей нагрузки выполняется аналогичным образом.
По итогу все узлы в кластере должны быть одной версии:
Обновление до последней актуальной версии
Для того, чтобы выполнить обновление до последней актуальной версии (1.28.0) с версии 1.27.4 я, по аналогии двух разделам выше, выполняю обновление сначала узлов плоскости управления, затем выполняю обновление узлов рабочей нагрузки. Только уже руководствуясь соответствующим разделом документации.
Проверка работы кластера после завершения процедуры обновления
Итоговая версия моего кластера после обновления должна быть 1.28.0. Проверим:
kubectl get node
roman@master01:~$ kubectl get node
NAME STATUS ROLES AGE VERSION
master01 Ready control-plane 203d v1.28.0
worker01 Ready worker 203d v1.28.0
worker02 Ready worker 203d v1.28.0
Также я проверю, что все поды находятся в рабочем состоянии:
kubectl get pod -A
roman@master01:~$ kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
default fluentd-rndvv 1/1 Running 27 192d
default fluentd-slhb8 1/1 Running 27 192d
default nginx-fast-storage-4znzz 1/1 Running 27 192d
ingress-nginx ingress-nginx-controller-64f79ddbcc-pdqvq 1/1 Running 0 7m5s
kube-system calico-kube-controllers-57b57c56f-4fb5b 1/1 Running 0 7m5s
kube-system calico-node-62g6j 1/1 Running 33 203d
kube-system calico-node-67dc4 1/1 Running 33 203d
kube-system calico-node-8zwbh 1/1 Running 33 203d
kube-system coredns-5d78c9869d-khqdp 1/1 Running 0 7m5s
kube-system coredns-5d78c9869d-srltm 1/1 Running 0 11m
kube-system etcd-master01 1/1 Running 2 (12m ago) 12m
kube-system kube-apiserver-master01 1/1 Running 2 (12m ago) 12m
kube-system kube-controller-manager-master01 1/1 Running 1 (12m ago) 12m
kube-system kube-proxy-cmnvf 1/1 Running 0 20m
kube-system kube-proxy-f8dqj 1/1 Running 0 20m
kube-system kube-proxy-jtc59 1/1 Running 0 20m
kube-system kube-scheduler-master01 1/1 Running 1 (12m ago) 12m
kube-system metrics-server-7b67f8d5d6-2cbkc 1/1 Running 0 7m5s
monitoring zabbix-agent-jwv4q 1/1 Running 27 189d
monitoring zabbix-agent-v2gwg 1/1 Running 27 189d
monitoring zabbix-kube-state-metrics-56b6f796bc-vrc58 1/1 Running 0 7m5s
monitoring zabbix-proxy-656f885bdb-tvmvz 1/1 Running 0 7m5s
Определенно стоит проверить доступность ваших сервисов. Но тут уже все индивидуально.