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 включает в себя методы управления и обеспечения безопасности и позволяет вам сосредоточиться на администрировании кластера и больше внимания уделять созданию приложений.