• Русский
  • Обновление кластеров на VMware vSphere

    В этом документе объясняется, как выполнять обновление кластеров Kubernetes на VMware vSphere после завершения обновления дистрибутива на стороне платформы. Описанный рабочий процесс сосредоточен на обновлении плоскости управления и рабочих узлов через ресурсы Cluster API.

    INFO

    Как эта страница вписывается в полный процесс обновления ACP

    На этой странице рассматривается только шаг обновления Kubernetes. Полный процесс обновления ACP — включая синхронизацию артефактов обновления, обновление ACP Core через CVO, обновления плагинов Aligned и обновления плагинов Agnostic из Marketplace — описан в документации по продукту ACP. Выполните эти шаги до начала шага обновления Kubernetes на этой странице:

    Используйте эту страницу, когда тот же кластер работает на неизменяемой операционной системе, поскольку шаг Kubernetes на immutable OS заменяет узлы из нового шаблона VM, а не обновляет бинарные файлы на месте.

    Порядок обновления

    Обновляйте кластеры VMware vSphere в следующем порядке:

    1. (Предварительное условие) Сначала обновите платформу ACP на управляющем кластере. Это обновит контроллер cluster-api-provider-vsphere и связанные компоненты CAPI до версий, которые понимают новую схему. Запускайте обновления рабочих кластеров только после того, как контроллеры на стороне управления развернутся и перейдут в состояние Ready.
    2. Завершите обновление версии дистрибутива, описанное в Обновление кластеров.
    3. Убедитесь, что плоскость управления здорова, а текущий кластер стабилен.
    4. Обновите версию Kubernetes плоскости управления.
    5. Обновите рабочие узлы до целевой версии Kubernetes.

    Предварительные требования

    Перед началом убедитесь, что выполнены следующие условия:

    • Обновление версии дистрибутива завершено.
    • Плоскость управления здорова и доступна.
    • Все узлы находятся в состоянии Ready.
    • Целевой шаблон VM присутствует в среде vSphere под тем же именем, что и значение Alauda OS Image Version в строке матрицы поддержки ОС. Обновление завершится с ошибкой, если шаблон отсутствует в момент применения нового VSphereMachineTemplate.
    • Для межверсионных обновлений, охватывающих более одного minor-уровня Kubernetes, промежуточные образы Core и шаблоны VM предварительно подготовлены. См. Подготовка к межверсионному обновлению.
    • Целевая версия Kubernetes совместима с вашими рабочими нагрузками и дополнениями.
    • Пулы конфигурации машин располагают достаточной емкостью для поэтапных обновлений.
    • Изучите путь обновления Kubernetes и политику version skew.
    WARNING

    Модель сохранения дисков

    Обновления используют механизм поэтапной замены Cluster API. У каждого кластера есть четыре класса дисков; только класс, управляемый пулом, сохраняется при удалении и повторном создании.

    Класс дискаГде объявленСохраняется при обновлении?Для чего используется
    Системный диск (root volume)Шаблон VM, используемый для spec.template.spec.template❌ НикогдаОС + kubelet/kubeadm/containerd. Пересоздается из нового шаблона при каждой замене.
    Локальные диски шаблонаVSphereMachineTemplate.spec.template.spec.* (дополнительные диски, объявленные в шаблоне)❌ НикогдаВременный кэш. Удаляется вместе со старой VM.
    Постоянные диски, управляемые пуломVSphereMachineConfigPool.spec.slot[].persistentDisks✅ Отсоединяются от старой VM и присоединяются к новой VM в том же слотеСостояние платформы, например /var/cpaas.
    Внешние тома CSI (vSphere CSI и т. д.)PVC рабочих нагрузок / драйвер CSI✅ Не связаны с жизненным циклом узлаДанные приложений.

    «Сохраняется» означает, что повторно присоединяется тот же идентификатор диска — это не означает, что содержимое диска переносится во времени. Все, что записано на диск, управляемый пулом, в течение окна обновления, сохранится после обновления и после отката.

    WARNING

    Шаблоны нельзя изменять на месте

    VSphereMachineTemplate.spec.template.spec неизменяем. Webhook admission в vSphere отклоняет любое обновление с сообщением "VSphereMachineTemplate spec.template.spec field is immutable. Please create a new resource instead." Поэтому каждый шаг обновления на этой странице создает новый VSphereMachineTemplate с новым metadata.name, применяет его, а затем изменяет infrastructureRef.name управляющего ресурса на новый шаблон. Сохраняйте предыдущий шаблон до тех пор, пока новый rollout не станет здоровым, на случай если потребуется откат.

    INFO

    UI Fleet Essentials не поддерживает обновления кластеров ACP 4.3

    Кластеры vSphere в настоящее время не предоставляют путь обновления через UI Fleet Essentials. Используйте описанную ниже процедуру YAML либо двухэтапный поток обновления, встроенный в платформу ACP Core — см. Запросить обновление для рабочих кластеров.

    Необходимые значения из матрицы поддержки ОС

    Авторитетное сопоставление между выпуском ACP, его шаблоном VM, версией Kubernetes, соответствующими версиями CoreDNS, etcd и Kube-OVN находится в Матрице поддержки ОС. Перед началом найдите строку, соответствующую целевой версии ACP; эта строка содержит все значения, необходимые для приведенных ниже шагов.

    Ячейки, которые вы берете из этой строки, соответствуют манифестам обновления следующим образом:

    Столбец матрицы поддержки ОСИспользуется для заданияКуда применяется
    Alauda OS Image VersionVSphereMachineTemplate.spec.template.spec.template (имя целевого шаблона VM)VSphereMachineTemplate плоскости управления и рабочих узлов
    Kubernetes VersionKubeadmControlPlane.spec.version и MachineDeployment.spec.template.spec.versionИ плоскость управления, и рабочие узлы
    corednsKubeadmControlPlane.spec.kubeadmConfigSpec.clusterConfiguration.dns.imageTagТолько плоскость управления
    etcdKubeadmControlPlane.spec.kubeadmConfigSpec.clusterConfiguration.etcd.local.imageTagТолько плоскость управления
    kube-ovn (chart)Cluster.metadata.annotations["cpaas.io/kube-ovn-version"]Область кластера; провайдер vSphere согласует AppRelease Kube-OVN на основании этой аннотации. Это версия chart acp/chart-cpaas-kube-ovn (например, v4.3.3), а не версия компонента Kube-OVN.

    Теги образов CoreDNS и etcd относятся только к плоскости управления, потому что clusterConfiguration — это поле KubeadmControlPlane. Рабочие узлы наследуют версии контейнерных образов из нового шаблона VM; MachineDeployment не содержит собственных тегов dns/etcd. Аннотация Kube-OVN находится в ресурсе Cluster, а не в KubeadmControlPlane, потому что провайдер vSphere отслеживает ее независимо от rollout плоскости управления Kubernetes.

    Шаги

    Создайте целевые шаблоны машин

    Перед началом поэтапного обновления создайте новые ресурсы VSphereMachineTemplate для плоскости управления и рабочих узлов.

    1. Экспортируйте существующий шаблон плоскости управления

      kubectl get vspheremachinetemplate <cluster_name>-control-plane -n <namespace> -o yaml > new-cp-template.yaml
    2. Измените шаблон плоскости управления

      Отредактируйте new-cp-template.yaml:

      • Установите metadata.name в новое уникальное имя (например, <cluster_name>-control-plane-v2)
      • Обновите spec.template.spec.template до имени целевого шаблона VM
      • При необходимости обновите параметры CPU, памяти или дисков
      • Удалите поля, сгенерированные сервером: metadata.resourceVersion, metadata.uid, metadata.generation, metadata.creationTimestamp, metadata.managedFields, metadata.annotations["kubectl.kubernetes.io/last-applied-configuration"] и status
      • Оставьте spec.template.spec.providerID пустым. Провайдер vSphere задает providerID как BIOS UUID VM после ее создания; предварительное заполнение этого поля в шаблоне нарушает связывание идентичности в контроллере.
    3. Экспортируйте и измените шаблон рабочих узлов

      kubectl get vspheremachinetemplate <cluster_name>-worker -n <namespace> -o yaml > new-worker-template.yaml

      Отредактируйте new-worker-template.yaml:

      • Установите metadata.name в новое уникальное имя (например, <cluster_name>-worker-v2)
      • Обновите spec.template.spec.template до имени целевого шаблона VM
      • При необходимости обновите параметры CPU, памяти или дисков
      • Удалите те же поля, сгенерированные сервером, что перечислены выше
    4. Примените оба новых шаблона

      kubectl apply -f new-cp-template.yaml
      kubectl apply -f new-worker-template.yaml

    Обновите плоскость управления

    Перед началом соберите все необходимые значения из целевой строки ACP в матрице поддержки ОС, как описано в разделе Необходимые значения из матрицы поддержки ОС.

    1. Исправьте KubeadmControlPlane, указав целевые значения Kubernetes

      Обновите ресурс KubeadmControlPlane одной операцией редактирования, чтобы spec.version, тег образа CoreDNS, тег образа etcd и ссылка на инфраструктурный шаблон оставались согласованными с одним и тем же шаблоном VM:

      • spec.versionKubernetes Version из строки матрицы поддержки ОС

      • spec.kubeadmConfigSpec.clusterConfiguration.dns.imageTag ← столбец coredns из той же строки

      • spec.kubeadmConfigSpec.clusterConfiguration.etcd.local.imageTag ← столбец etcd из той же строки

      • spec.machineTemplate.infrastructureRef.name ← имя нового VSphereMachineTemplate, созданного выше

        kubectl edit kubeadmcontrolplane <cluster_name> -n <namespace>

      Одного только обновления spec.version недостаточно. Теги образов CoreDNS и etcd должны изменяться вместе с версией Kubernetes, потому что они собираются из одного и того же выпуска; если оставить их в прежних значениях, это может привести к тому, что поды CoreDNS и etcd не будут соответствовать новой minor-версии Kubernetes.

    2. Обновите аннотацию версии Kube-OVN в ресурсе Cluster

      Если в целевой строке ACP в матрице поддержки ОС указано значение kube-ovn (chart), отличающееся от текущего кластера, обновите аннотацию в ресурсе Cluster, чтобы провайдер vSphere согласовал новый AppRelease Kube-OVN.

      INFO

      Предварительное условие — аннотация-гейт для согласования Kube-OVN (только vSphere)

      В vSphere провайдер согласует AppRelease Kube-OVN только тогда, когда ресурс Cluster содержит аннотацию cpaas.io/network-type: kube-ovn. Обычно эта аннотация задается при создании кластера. Если она отсутствует, приведенные ниже шаги успешно запишут аннотацию версии, но AppRelease Kube-OVN согласован не будет. Перед продолжением проверьте:

      kubectl get cluster <cluster_name> -n <namespace> \
        -o jsonpath='{.metadata.annotations.cpaas\.io/network-type}{"\n"}'
      # Expected output: kube-ovn

      Это предварительное условие специфично для vSphere. Провайдеры DCS и Huawei Cloud Stack используют вместо этого поле spec.networkType ресурсов DCSCluster / HCSCluster и не требуют этой аннотации.

      kubectl annotate cluster <cluster_name> -n <namespace> \
        cpaas.io/kube-ovn-version=<kube-ovn-version-from-matrix> --overwrite

      Kube-OVN — это компонент жизненного цикла Core, но на неизменяемой ОС провайдер vSphere управляет его доставкой на основе этой аннотации; аннотация не обновляется автоматически при изменении spec.version.

      Провайдер vSphere согласует один AppRelease Kube-OVN с именем cni-kube-ovn в пространстве имен cpaas-system рабочего кластера. Запустите следующую команду в рабочем кластере (не в bootstrap KIND и не в кластере global), чтобы отслеживать согласование:

      # Overall AppRelease state — Sync and Health columns must reach a Success-equivalent reason
      kubectl get apprelease cni-kube-ovn -n cpaas-system
      
      # Installed revision and chart phase
      kubectl get apprelease cni-kube-ovn -n cpaas-system \
        -o jsonpath='Installed: {.status.charts.*.installedRevision}{"\n"}Phase: {.status.charts.*.phase}{"\n"}'

      Обычная последовательность: Upgrading → HealthChecking → Success. На небольших кластерах полный переход обычно завершается примерно за одну минуту. Интерпретируйте фазы следующим образом:

      ФазаЗначениеinstalledRevision
      UpgradingИдет обновление Helm release. Состояние SyncUnknown(Syncing).Все еще предыдущая версия
      HealthCheckingHelm release применен; контроллер проверяет поды Kube-OVN. Состояние SyncTrue(Synced).Уже целевая версия
      SuccessВсе три состояния (Validate, Sync, Health) равны True.Целевая версия
      WARNING

      Не объявляйте обновление завершенным только по значению installedRevision. Это поле переходит в целевое значение во время HealthChecking, до того как поды будут проверены на состояние Ready. Chart считается обновленным только тогда, когда phase имеет значение Success и installedRevision соответствует целевому значению.

      API AppRelease также определяет состояния Downloading, Installing, Syncing, DownloadFailed, DeployFailed и NotReady. Первые три являются переходными, и обновление должно завершиться само. Последние три указывают на ошибку, требующую ручного анализа; начните с kubectl describe apprelease cni-kube-ovn -n cpaas-system, чтобы прочитать поле message для каждого состояния.

    3. Отслеживайте rollout плоскости управления

      kubectl -n <namespace> get kubeadmcontrolplane <cluster_name> -w
      kubectl -n <namespace> get machine -l cluster.x-k8s.io/control-plane

    Обновите рабочие узлы

    После завершения обновления плоскости управления измените MachineDeployment, чтобы он ссылался на новый шаблон рабочих узлов и целевую версию Kubernetes.

    Обычно изменяются следующие поля:

    • spec.template.spec.version — целевая версия Kubernetes
    • spec.template.spec.infrastructureRef.name — имя нового VSphereMachineTemplate
    • spec.template.spec.bootstrap.configRef.name — имя нового KubeadmConfigTemplate, если необходимо изменить параметры bootstrap (см. Обновление шаблонов Bootstrap)

    Примените изменения:

    kubectl patch machinedeployment <cluster_name>-md-0 -n <namespace> \
      --type='merge' -p='{
        "spec": {
          "template": {
            "spec": {
              "version": "<target_kubernetes_version>",
              "infrastructureRef": {
                "name": "<new-worker-template-name>"
              }
            }
          }
        }
      }'

    Отслеживайте rollout рабочих узлов:

    kubectl -n <namespace> get machinedeployment <cluster_name>-md-0 -w
    kubectl -n <namespace> get machine
    kubectl --kubeconfig=/tmp/<cluster_name>.kubeconfig get nodes -o wide

    Откат неудачного обновления

    Если поэтапное обновление завершается сбоем — новые VM не загружаются, узлы не переходят в состояние Ready или новая minor-версия Kubernetes выявляет несовместимость — верните ссылку на шаблон и поля версии Kubernetes к предыдущим значениям. Cluster API рассматривает откат как новое расхождение спецификации и по одному возвращает машины v2 к предыдущему шаблону.

    Перед откатом важно усвоить три факта:

    • Старых VM больше нет. Они были удалены во время обновления. Откат использует старый шаблон для создания нового набора машин-замен; он не восстанавливает исходные VM.
    • Ресурс старого VSphereMachineTemplate должен по-прежнему существовать. Не удаляйте предыдущий шаблон, пока новый rollout не станет здоровым. Если вы уже удалили его, восстановите его из системы контроля версий или из резервной копии перед откатом.
    • Идентичность диска, управляемого пулом, сохраняется, но состояние данных — нет. Диски, объявленные в VSphereMachineConfigPool.spec.slot[].persistentDisks, повторно присоединяются к машинам после отката в том же слоте, но все данные, записанные на эти диски в течение окна обновления (например, записи etcd в новом формате minor-версии Kubernetes), сохраняются. Если новый формат нечитаем для более старой minor-версии Kubernetes, откат все равно может завершиться неудачей и потребовать ручного восстановления etcd.

    Процедура:

    • Плоскость управления: исправьте KubeadmControlPlane, восстановив предыдущие значения spec.machineTemplate.infrastructureRef.name, spec.version, spec.kubeadmConfigSpec.clusterConfiguration.dns.imageTag и spec.kubeadmConfigSpec.clusterConfiguration.etcd.local.imageTag.

    • Рабочие узлы: исправьте каждый MachineDeployment, восстановив предыдущие значения spec.template.spec.infrastructureRef.name и spec.template.spec.version.

    • Kube-OVN: если аннотация kube-ovn была изменена, восстановите прежнее значение в ресурсе Cluster:

      kubectl annotate cluster <cluster_name> -n <namespace> \
        cpaas.io/kube-ovn-version=<previous-kube-ovn-version> --overwrite

    Если новая плоскость управления так и не достигла quorum etcd, контроллер KubeadmControlPlane может отказаться откатывать любую машину, потому что его предварительные проверки блокируются из-за нездорового etcd. Сначала восстановите quorum etcd (вручную, с участием оператора), а затем повторите откат.

    Проверка

    После обновления подтвердите следующие результаты:

    • KubeadmControlPlane достигает целевой версии и требуемого количества реплик.
    • MachineDeployment достигает целевой версии и требуемого количества реплик.
    • Плоскость управления и рабочие узлы возвращаются в состояние Ready.
    • DaemonSet vSphere CPI остается доступным в рабочем кластере.

    Следующие шаги

    После завершения обновления Kubernetes продолжайте с обычными операциями над узлами в Управление узлами на VMware vSphere.