Обновление кластера Kubernetes

Я продолжаю разбираться в тонкостях платформы Kubernetes. Параллельно делаю какие-то конспекты вида этой публикации. Сегодня по плану — разобраться, как происходит обновление кластера Kubernetes.

В качестве опорного руководства я использовал соответствующий раздел из официально документации.

Общее описание процесса обновления

В качестве стенда я буду использовать примерный кластер как на рисунке.

Процесс обновления включает следующие шаги:

  1. Последовательное обновление узлов плоскости управления.
  2. Последовательное обновление узлов рабочей нагрузки.
  3. Проверка работы кластера после завершения процедуры обновления.

Обновление рекомендуется выполнять последовательно межу минорными версиями. Например, выполнять обновление с версии 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 updatesudo 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 versionroman@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 TARGETkube-apiserver v1.26.1 v1.27.4

kube-controller-manager v1.26.1 v1.27.4kube-scheduler v1.26.1 v1.27.4kube-proxy v1.26.1 v1.27.4CoreDNS v1.9.3 v1.10.1etcd 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 orresetting to kubeadm defaults before a successful upgrade can be performed. The version to manuallyupgrade to is denoted in the «PREFERRED VERSION» column.API GROUP CURRENT VERSION PREFERRED VERSION MANUAL UPGRADE REQUIRED

kubeproxy.config.k8s.io v1alpha1 v1alpha1 nokubelet.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-daemonsetsnode/master01 cordoned

Warning: ignoring DaemonSet-managed Pods: kube-system/calico-node-8zwbh, kube-system/kube-proxy-jlcrsevicting pod kube-system/calico-kube-controllers-57b57c56f-tz9tdpod/calico-kube-controllers-57b57c56f-tz9td evictednode/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 updatesudo 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-reloadsudo 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 192
dingress-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

 

Определенно стоит проверить доступность ваших сервисов. Но тут уже все индивидуально.

Друзья помогите этому контенту стать доступнее в социальных сетях.

Не проходи мимо жмакни по кнопке возможно кому то еще он будет полезен!