Kubespray использует Ansible и Kubeadm для развертывания кластера Kubernetes на виртуальных машинах или выделенных серверах. Будучи композитным, он позволяет выбирать из широкого спектра опций при развертывании, таких как дистрибутив Linux, сетевые плагины, время выполнения контейнеров и т.д. С помощью Kubespray можно выполнять установку на облачных платформах, таких как Amazon EC2 (AWS), Azure, Google Cloud, и частных облачных платформах, таких как OpenStack. Эта небольшая статья создана для того, чтобы помочь вам с обновлением кластера Kubernetes, развернутого с помощью Kubespray. Для новой установки ознакомьтесь с нашей статьей по ссылке ниже.

  • Развертывание кластера Kubernetes с помощью Ansible & Kubespray

А для простого добавления нового узла в кластер у нас есть: Добавление нового узла в кластер Kubernetes с помощью Kubespray

Наша версия Kubernetes перед обновлением.

$ kubectl get node
NAME       STATUS   ROLES           AGE    VERSION
master01   Ready    control-plane   230d   v1.28.10
master02   Ready    control-plane   230d   v1.28.10
master03   Ready    control-plane   223d   v1.28.10
node01     Ready    <none>          230d   v1.28.10
node02     Ready    <none>          230d   v1.28.10
node03     Ready    <none>          230d   v1.28.10
node04     Ready    <none>          223d   v1.28.10
node05     Ready    <none>          223d   v1.28.10
node06     Ready    <none>          8d     v1.28.10

Резервное копирование текущих конфигураций

Наш каталог инвентаря для Kubespray выглядит следующим образом kubespray/inventory/k8scluster/. Мы скопируем содержимое трех основных файлов для последующего использования при обновлении параметров.

mkdir ~/kubespray-backups
cp kubespray/inventory/k8scluster/group_vars/k8s_cluster/k8s-cluster.yml ~/kubespray-backups
cp kubespray/inventory/k8scluster/group_vars/all/all.yml ~/kubespray-backups
cp kubespray/inventory/k8scluster/inventory.ini ~/kubespray-backups

В нашем предыдущем развертывании использовались следующие значения. Проверьте, есть ли у вас настройки, и сохраните их для дальнейшего использования.

$ vim kubespray/inventory/k8scluster/group_vars/k8s_cluster/k8s-cluster.yml
cluster_name: k8s.example.com
kube_network_plugin: flannel
container_manager: crio

$ vim kubespray/inventory/k8scluster/group_vars/all/all.yml
bin_dir: /opt/bin #because the OS is Flatcar container Linux
apiserver_loadbalancer_domain_name: api.k8s.example.com
loadbalancer_apiserver:
  address: 192.168.1.8
  port: 6443

Клонировать источник Kubespray, если он не существует

Если у вас нет локального источника kubespray с последней версией, клонируйте его.

git clone https://github.com/kubernetes-sigs/kubespray.git
cd kubespray

По состоянию узлов моего кластера мы можем подтвердить, что версия Kubernetes v1.24.6. Он был развернут из тега v2.20.0.

Вы можете проверить официальный git Kubespray релизы или теги страница. Чтобы получить список доступных тегов в git-репозитории, выполните команду:

$ git tag --list --sort=version:refname
...
v2.22.2
v2.23.0
v2.23.1
v2.23.2
v2.23.3
v2.24.0
v2.24.1
v2.24.2
v2.25.0

Или отсортируйте по последнему тегу.

$ git tag -l --sort=-version:refname
v2.25.0
v2.24.2
v2.24.1
v2.24.0
v2.23.3
v2.23.2
v2.23.1
v2.23.0
v2.22.2
v2.22.1
v2.22.0
....

$ git tag -l | sort -V --reverse
v2.24.2
v2.24.1
v2.24.0
v2.23.3
v2.23.2
v2.23.1
v2.23.0
v2.22.2
v2.22.1
v2.22.0
...

Из полученного результата мы можем подтвердить, что следующим доступным тегом релиза является v2.21.0. Наше первоначальное обновление будет произведено из его источника.

Для веток git используйте:

$ git branch --list --remotes --sort=-version:refname
  origin/release-2.25
  origin/release-2.24
  origin/release-2.23
  origin/release-2.22
  origin/release-2.21
  origin/release-2.20
.....

Обновление кластера Kubernetes с помощью Kubespray

Давайте обновим файлы в рабочем дереве, чтобы они соответствовали релизу, до которого мы обновляемся. Для меня это тег 2.21.0.

$ git checkout v2.25.0
D	inventory/sample/group_vars/all/aws.yml
D	inventory/sample/group_vars/all/azure.yml
D	inventory/sample/group_vars/all/containerd.yml
D	inventory/sample/group_vars/all/coreos.yml
D	inventory/sample/group_vars/all/cri-o.yml
D	inventory/sample/group_vars/all/docker.yml
D	inventory/sample/group_vars/all/gcp.yml
D	inventory/sample/group_vars/all/hcloud.yml
D	inventory/sample/group_vars/all/oci.yml
D	inventory/sample/group_vars/all/vsphere.yml
D	inventory/sample/group_vars/etcd.yml
D	inventory/sample/group_vars/k8s_cluster/k8s-net-calico.yml
D	inventory/sample/group_vars/k8s_cluster/k8s-net-flannel.yml
D	inventory/sample/group_vars/k8s_cluster/k8s-net-kube-ovn.yml
D	inventory/sample/group_vars/k8s_cluster/k8s-net-kube-router.yml
D	inventory/sample/group_vars/k8s_cluster/k8s-net-macvlan.yml
D	inventory/sample/group_vars/k8s_cluster/k8s-net-weave.yml
D	inventory/sample/inventory.ini
HEAD is now at 2cf23e310 Don't search filesystem mounts in docker build step (#10131) (#10194)

$ git describe --tags
v2.25.0

Мы также можем использовать номер релиза с помощью git checkout команда.

git checkout release-2.25

Давайте скопируем образец инвентаризации в

cp -rfp inventory/sample inventory/k8scluster

Просмотрите файлы и переменные инвентаризации перед выполнением обновления. Установите их в соответствии с текущей установкой, чтобы избежать проблем после обновления кластера.

inventory/k8scluster/inventory.ini
inventory/k8scluster/group_vars/all/all.yml
inventory/k8scluster/group_vars/k8s_cluster/k8s-cluster.yml

Содержимое моего inventory.ini файл.

[all]
master01 ansible_host=192.168.1.10 etcd_member_name=etcd1   ansible_user=core
master02 ansible_host=192.168.1.11 etcd_member_name=etcd2   ansible_user=core
master03 ansible_host=192.168.1.12 etcd_member_name=etcd3   ansible_user=core
node01   ansible_host=192.168.1.13 etcd_member_name=        ansible_user=core
node02   ansible_host=192.168.1.14 etcd_member_name=        ansible_user=core
node03   ansible_host=192.168.1.15 etcd_member_name=        ansible_user=core
node04   ansible_host=192.168.1.16 etcd_member_name=        ansible_user=core
node05   ansible_host=192.168.1.17 etcd_member_name=        ansible_user=core

# ## configure a bastion host if your nodes are not directly reachable
# [bastion]
# bastion ansible_host=x.x.x.x ansible_user=some_user

[kube_control_plane]
master01
master02
master03

[etcd]
master01
master02
master03

[kube_node]
node01
node02
node03
node04
node05

[new_nodes]
node04
node05

[calico_rr]

[k8s_cluster:children]
kube_control_plane
kube_node
calico_rr

После этого запустите обновление кластера, выполнив следующие команды.

ansible-playbook -i inventory/k8scluster/inventory.ini -b upgrade-cluster.yml

Дополнительные параметры, которые можно использовать, если они не заданы в файле инвентаризации:

  • -e ansible_user=rocky
  • --become-user root

Чтобы ограничить обновление одним узлом, используйте --limit=nodename

Составьте список узлов после обновления, чтобы увидеть версию среды выполнения & номера версий Kubernetes.

$ kubectl get nodes -o wide
NAME       STATUS   ROLES           AGE    VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                                             KERNEL-VERSION     CONTAINER-RUNTIME
master01   Ready    control-plane   10d   v1.28.6   192.168.1.10   <none>        Flatcar Container Linux by Kinvolk 3510.2.5 (Oklo)   5.15.119-flatcar   containerd://1.7.15
master02   Ready    control-plane   10d   v1.28.6   192.168.1.11   <none>        Flatcar Container Linux by Kinvolk 3510.2.5 (Oklo)   5.15.119-flatcar   containerd://1.7.15
master03   Ready    control-plane   10d   v1.28.6   192.168.1.12   <none>        Flatcar Container Linux by Kinvolk 3510.2.5 (Oklo)   5.15.119-flatcar   containerd://1.7.15
node01     Ready    <none>          10d   v1.28.6   192.168.1.13   <none>        Flatcar Container Linux by Kinvolk 3510.2.5 (Oklo)   5.15.119-flatcar   containerd://1.7.15
node02     Ready    <none>          10d   v1.28.6   192.168.1.14   <none>        Flatcar Container Linux by Kinvolk 3510.2.5 (Oklo)   5.15.119-flatcar   containerd://1.7.15
node03     Ready    <none>          10d   v1.28.6   192.168.1.15   <none>        Flatcar Container Linux by Kinvolk 3510.2.5 (Oklo)   5.15.119-flatcar   containerd://1.7.15
node04     Ready    <none>          10d   v1.28.6   192.168.1.16   <none>        Flatcar Container Linux by Kinvolk 3510.2.5 (Oklo)   5.15.119-flatcar   containerd://1.7.15
node05     Ready    <none>          10d   v1.28.6   192.168.1.17   <none>        Flatcar Container Linux by Kinvolk 3510.2.5 (Oklo)   5.15.119-flatcar   containerd://1.7.15
node06     Ready    <none>          10d   v1.28.6   192.168.1.18   <none>        Flatcar Container Linux by Kinvolk 3510.2.5 (Oklo)   5.15.119-flatcar   containerd://1.7.15

Запуск kubectl version отобразит версию сервера после обновления.

kubectl version

Выполнение нескольких обновлений (после первого успеха)

Переход к следующему выпуску / тегу.

$ git checkout v2.24.0
Previous HEAD position was c4346e590 kubeadm/etcd: use config to download certificate (#9609)
HEAD is now at 4014a1ccc fix multus include (#10105)

$ git branch
* (HEAD detached at v2.24.0)
  master

Обновление каталога инвентаризации, содержащего все настройки для развертывания.

mv  inventory/k8scluster{,.bak}
cp -rfp inventory/sample inventory/k8scluster

Выполнить обновление кластера

ansible-playbook -i inventory/k8scluster/inventory.ini -b upgrade-cluster.yml

Проверьте следующую версию Kubernetes после обновления.

kubectl get nodes -o wide

Заключение

За несколько минут и с помощью нескольких команд мы смогли обновить наш кластер Kubernetes с помощью Kubespray. Обратите внимание, что для использования этого руководства вам нужен полностью функциональный кластер Kubernetes, развернутый с помощью Kubespray. Kubespray — это мощный инструмент автоматизации, который отличается высокой адаптивностью, конфигурируемостью и расширяемостью. Kubespray включает в себя методы управления и обеспечения безопасности и позволяет вам сосредоточиться на администрировании кластера и больше внимания уделять созданию приложений.