Обновление кластера 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 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

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

Добавить комментарий

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