Заменить операционную систему на узлах
Шаблоном ВМ определяется операционная система узлов кластера. При необходимости перейти на другую ОС или изменить версию ОС потребуется подготовить новый шаблон с ОС и той же версией Kubernetes, а после замените в конфигурации группы узлов шаблон ВМ.
Рекомендуется использовать одну ОС в рамках кластера.
Изменение версии Kubernetes на узлах выполняется по аналогии, см. подробнее на странице Узлы и шаблоны ВМ.
Инструкция применима в кластерах с провайдерами, работающими с шаблонами ВМ:
- oVirt и подобные среды: zVirt, HostVM, РЕД Виртуализация, ROSA Virtualization;
- VMware vSphere;
- OpenStack и подобные облака;
- Basis Dynamix;
- VMware vCloud Director;
- Yandex Cloud.
В гибридном кластере шаблон ВМ потребуется заменить в группах основного провайдера с виртуальными машинами. Шаблон ВМ необходимо отдельно заменить в каждой Control Plane и Worker группах узлов, которые должны получить новую ОС.
При изменении шаблона ВМ Cluster API пересоздаёт узлы группы согласно установленной стратегии восстановления RollingUpdate или OnDelete в конфигурации групп. Подробнее Конфигурация Cluster API.
Если узел с новым шаблоном ВМ не перешёл в состояние Ready, не удаляйте его. Сначала замените шаблон ВМ в конфигурации группы и проверьте запрошенное количество реплик.
Шаг 1. Подготовить шаблон в виртуализации
- Выберите ОС из списка поддерживаемых операционных систем узлов кластера. При необходимости вы можете подготовить шаблон ВМ с ОС вне протестированного списка. В этом случае успешное развёртывание кластера и корректность конфигурации шаблона не гарантируются.
- Создайте ВМ и подготовьте из неё шаблон ВМ по пошаговому процессу создания шаблона с новой ОС.
Версию Kubernetes в новом шаблоне оставьте той же. Соответствие версии платформы и Kubernetes приведено в таблице.
Шаг 2. Добавить шаблон в экземпляр провайдера
Добавьте новый шаблон ВМ в экземпляре провайдера, на котором создан кластер.
Откройте вкладку Платформа. В блоке Провайдеры инфраструктуры нажмите Управлять.
Скриншот: вкладка «Платформа», переход к провайдерам

Откройте экземпляр провайдера кластера.
Скриншот: конфигурация провайдера

В блоке Шаблоны виртуальных машин нажмите + и выберите подготовленный шаблон ВМ с новой ОС.
Скриншот: добавление шаблона ВМ и версии Kubernetes

Сохраните экземпляр.
Шаг 3. Заменить шаблон в группах узлов
Выполните шаг в GUI или CLI для каждой группы, которую нужно перевести на новую ОС.
В кластере откройте Администрирование → Управление узлами.
Скриншот: управление узлами

Справа от названия группы нажмите на Конфигурация группы и перейдите на вкладку InfraMachineTemplate.
Скриншот: вкладка InfraMachineTemplate

В поле Шаблон ВМ выберите подготовленный шаблон ВМ, который добавили в экземпляр провайдера на шаге 2.
Скриншот: поле «Шаблон ВМ»

Сохраните изменения в конфигурации группы.
После сохранения изменений будет создан новый InfraMachineTemplate. Перейдите в раздел Администрирование → Управление узлами, чтобы отследить обновление ОС на узлах группы. Дождитесь, пока число узлов группы в состоянии Ready снова совпадёт с запрошенным количеством реплик в конфигурации. В конфигурации группы на вкладке InfraMachineTemplate в поле Шаблон ВМ должен быть указан новый шаблон. В манифесте группы поле infrastructureRef.name равно имени нового InfraMachineTemplate.
Команды выполняются в кластере управления. Неймспейс совпадает с именем клиентского кластера: в нём лежат объекты группы узлов.
Создайте новый InfraMachineTemplate как копию существующего шаблона группы с другим именем и новым шаблоном ВМ. В MachineDeployment и KubeadmControlPlane замените InfraMachineTemplate.
InfraMachineTemplate
Имя и kind InfraMachineTemplate заданы в infrastructureRef. Kind зависит от провайдера. Поля каждого kind собраны в справочнике InfraMachineTemplate.
| Провайдер | Kind |
|---|---|
| VMware vSphere | VSphereMachineTemplate |
| oVirt и подобные | OVirtMachineTemplate |
| OpenStack | OpenStackMachineTemplate |
| Basis Dynamix | BasisMachineTemplate |
| VMware vCloud Director | VCDMachineTemplate |
| Yandex Cloud | YandexMachineTemplate |
Получите InfraMachineTemplate для Worker-групп из ресурса MachineDeployment, для группы Control Plane — из ресурса KubeadmControlPlane, как приведено далее:
kubectl -n <имя-кластера> get MachineDeployment
kubectl -n <имя-кластера> get MachineDeployment <имя-группы> -o jsonpath='{.spec.template.spec.infrastructureRef}{"\n"}'
kubectl -n <имя-кластера> get KubeadmControlPlane <имя-кластера>-control-plane -o jsonpath='{.spec.machineTemplate.infrastructureRef}{"\n"}'
Новый InfraMachineTemplate
Сохраните существующий InfraMachineTemplate в файл. Пример для VMware vSphere:
kubectl -n <имя-кластера> get VSphereMachineTemplate <имя-InfraMachineTemplate> -o yaml > inframachinetemplate.yamlВ файле задайте новое
metadata.name, которого ещё нет в этом неймспейсе.namespaceоставьте прежним. Меткиmetadata.labelsсохраните, если они есть.Удалите из файла служебные поля
uid,resourceVersion,generation,creationTimestamp,managedFieldsи весь блокstatus. Вspec.template.spec.templateзамените только имя шаблона ВМ. Имя должно совпадать с именем в виртуализации и с именем, которое вы указали в экземпляре провайдера.Фрагмент файла после исправления для VMware vSphere:
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: VSphereMachineTemplate metadata: name: <имя-нового-inframachinetemplate> namespace: <имя-кластера> spec: template: spec: # datacenter, datastore, diskGiB, memoryMiB, numCPUs, networkName и остальные поля — из текущего шаблона группы template: <имя-шаблона-вм-в-виртуализации>Примените в кластере новый InfraMachineTemplate.
kubectl apply -f inframachinetemplate.yaml
Добавить шаблон в MachineDeployment и KubeadmControlPlane
kubectl -n <имя-кластера> patch MachineDeployment <имя-группы> --type=merge -p '{"spec":{"template":{"spec":{"infrastructureRef":{"name":"<имя-нового-inframachinetemplate>"}}}}}'
Проверьте:
kubectl -n <имя-кластера> get MachineDeployment <имя-группы> -o jsonpath='{.spec.template.spec.infrastructureRef.name}{"\n"}'
kubectl -n <имя-кластера> patch KubeadmControlPlane <имя-кластера>-control-plane --type=merge -p '{"spec":{"machineTemplate":{"infrastructureRef":{"name":"<имя-нового-inframachinetemplate>"}}}}'
Проверьте:
kubectl -n <имя-кластера> get KubeadmControlPlane <имя-кластера>-control-plane -o jsonpath='{.spec.machineTemplate.infrastructureRef.name}{"\n"}'
После изменения InfraMachineTemplate Cluster API запустит пересоздание узлов группы.
Отследить пересоздание узлов Worker-группы:
kubectl -n <имя-кластера> get MachineDeployment <имя-группы> -o custom-columns=REPLICAS:.spec.replicas,READY:.status.readyReplicas,UPDATED:.status.updatedReplicas
Отследить пересоздание узлов группы Control Plane:
kubectl -n <имя-кластера> get KubeadmControlPlane <имя-кластера>-control-plane -o custom-columns=REPLICAS:.spec.replicas,READY:.status.readyReplicas,UPDATED:.status.updatedReplicas