Обновить кластер
Обновите кластер Stackland до новой версии с помощью ресурса Kubernetes TargetInstallationState. Обновление выполняется постепенно с эвакуацией нагрузки и перезагрузкой узлов.
Перед началом работы
-
Убедитесь, что у вас есть доступ к кластеру с правами администратора.
-
Проверьте текущую версию кластера:
kubectl get targetinstallationstate main -o jsonpath='{.status.currentVersion}' -
Узнайте, какие версии доступны для обновления. Список доступных версий зависит от того, подключен ли ваш кластер к интернету:
- Кластер с доступом в интернет — доступные версии загружаются автоматически из реестра контейнеров Stackland.
- Изолированный кластер — доступные версии определяются образами, загруженными в локальный реестр.
Выбрать релизный канал
Релизный канал определяет, какие версии Stackland доступны для обновления. По умолчанию используется канал stable.
Доступные каналы:
stable— стабильные релизы для production-использования. Доступен всем клиентам по умолчанию.alpha— ранние релизы для тестирования новых функций. Доступ предоставляется по запросу.
Чтобы изменить релизный канал, отредактируйте ресурс PlatformConfig:
kubectl edit platformconfig main
В спецификации укажите нужный канал:
spec:
releaseChannel: "stable" # или "alpha"
Перед обновлением на 27.x
В Stackland 26.2 добавлена новая реализация Ingress-контроллера на основе Contour: предыдущая реализация на базе ingress-nginx больше не поддерживается. В Stackland 27 ingress-nginx будет исключен из поставки, поэтому мы предупреждаем вас об этих планах заранее. В релизах Stackland 26 ingress-nginx по-прежнему доступен для пользовательской нагрузки, но переход на новую реализацию нужно запланировать и осуществить до обновления на Stackland 27.
В большинстве случаев пользовательские манифесты Ingress с классом stackland-default продолжают работать, но специфичные для ingress-nginx аннотации nginx.ingress.kubernetes.io/* новый контроллер не поддерживает — их нужно убрать или заменить. Подробнее см. в разделе Проверить пользовательские ресурсы Ingress.
При этом действие оператора обязательно: без явного отключения предыдущей реализации Ingress-контроллера обновление на версию >= 27.0.0 не начнется.
Проверить пользовательские ресурсы Ingress
Если в кластере есть пользовательские ресурсы Ingress:
-
Найдите пользовательские ресурсы
Ingress:kubectl get ingress -A -
Убедитесь, что у них указан
spec.ingressClassName: stackland-defaultили поле отсутствует. В последнем случае используется класс по умолчанию. -
Проверьте, что в аннотациях не используются ключи вида
nginx.ingress.kubernetes.io/*, специфичные для nginx. Если такие аннотации есть, уберите их или замените на эквиваленты нового Ingress-контроллера платформы — иначе после обновления соответствующие правила не применятся.
Проверить работу приложения заранее
Пока кластер работает на 26.x, вы можете заранее убедиться, что пользовательский Ingress совместим с новым Ingress-контроллером платформы.
Важно
При переключении spec.ingressClassName на stackland-system учитывайте, что у класса stackland-system собственный внешний IP-адрес, отличный от IP-адреса предыдущей реализации. Если DNS-зона делегирована платформе, запись домена автоматически переедет на LoadBalancer нового класса, но с задержкой на обновление DNS-записей — на это время часть клиентов будет обращаться по прежнему IP-адресу и попадать на предыдущую реализацию Ingress. После возврата класса на stackland-default действует аналогичная задержка.
Выполняйте проверку в окне технического обслуживания или на некритичном хосте.
-
Во временной копии манифеста замените
spec.ingressClassName: stackland-defaultнаspec.ingressClassName: stackland-systemи примените манифест:kubectl apply -f <имя_файла>.yaml -
Проверьте доступность приложения. Есть два способа:
-
Проверка напрямую через IP, без DNS. Этот способ не зависит от DNS-пропагации и от размещения DNS-зоны домена приложения.
-
Получите внешний IP LoadBalancer, обслуживающего класс
stackland-system:kubectl get svc -A \ -l app.kubernetes.io/name=contour,app.kubernetes.io/component=envoyЕсли селектор не подходит для вашей установки, найдите сервис типа
LoadBalancerв неймспейсе Contour вручную. -
Выполните запрос к приложению, подставив полученный IP:
curl --resolve <домен>:443:<внешний_IP_Envoy> https://<домен>/
-
-
Проверка по домену. Работает, только если DNS-зона делегирована — тогда запись домена переместится на LoadBalancer класса
stackland-systemавтоматически. Учитывайте задержку DNS. Если вы используете свой DNS, домен продолжит указывать на предыдущий LoadBalancer, и такая проверка даст ложно-отрицательный результат — используйте способ сcurl --resolve.
-
-
После проверки верните значение
spec.ingressClassNameобратно наstackland-defaultили удалите поле.
На 27.x этот шаг не нужен: класс stackland-default автоматически обслуживается новым Ingress-контроллером платформы.
Важно
stackland-system — служебный класс. Не используйте его для production-ресурсов Ingress, это только способ временной проверки совместимости перед обновлением.
Отключить предыдущую реализацию Ingress
-
Отключите предыдущую реализацию Ingress в ресурсе
IngressConfig:kubectl patch ingressconfig main --type=merge \ -p '{"spec":{"settings":{"nginx":{"enabled":false}}}}'
После отключения ingress-nginx существующие Ingress-контроллеры будут автоматически перезапущены поверх Contour.
-
Дождитесь, пока платформа переключится на единый Ingress-контроллер. Проверьте текущее состояние:
kubectl get ingressconfig main -o jsonpath='{.status.ingress.observedIngress}'
Если кластер не имеет доступа в интернет, необходимо предварительно загрузить образы новой версии в локальный реестр через CLI.
-
В левом меню выберите Настройки.
-
В подменю выберите Обновление.
-
Нажмите ссылку Обновление для перехода на страницу обновления кластера.
-
На странице «Обновление кластера» в блоке «Текущий статус обновления» проверьте текущее состояние:
- Target version — целевая версия обновления;
- Phase — фаза обновления;
- Message — сообщение о текущем состоянии.
-
В разделе «Доступные обновления» укажите версию для обновления.
-
Нажмите Запустить обновление.
Инструкции CLI зависят от того, имеет ли кластер доступ в интернет.
Кластер с доступом в интернет
Если кластер имеет доступ в интернет, образы новой версии загружаются автоматически из реестра контейнеров Stackland.
Подготовка к обновлению
Дождитесь появления нового релиза в ресурсе AvailableReleases. Проверить доступные релизы можно командой:
kubectl get availablereleases main -o yaml
Пример вывода:
apiVersion: stackland.yandex.cloud/v1alpha1
kind: AvailableReleases
metadata:
name: main
status:
releases:
- version: "26.1.0"
ready: true
- version: "26.1.1"
ready: true
Когда нужная версия появится в списке со статусом ready: true, можно запускать обновление.
Запустить обновление
-
Создайте файл манифеста. Например, с помощью команды
touch upgrade.yaml. -
Откройте файл и вставьте конфигурацию:
apiVersion: stackland.yandex.cloud/v1alpha1 kind: TargetInstallationState metadata: name: main spec: targetVersion: "<версия>" installationTimeout: "2h"Где:
targetVersion— целевая версия для обновления. Укажите значение изavailablereleases[main].status.releases[<желаемый_релиз>].version.installationTimeout— максимальное время выполнения обновления.
-
Примените манифест:
kubectl apply -f upgrade.yaml
Изолированный кластер
Если кластер не имеет доступа в интернет, необходимо предварительно загрузить образы новой версии в локальный реестр.
Скачать утилиту SLADM
На машине с доступом в интернет скачайте свежую версию утилиты sladm, как при первоначальной установке.
Загрузить образы на машине с интернетом
На машине с доступом в интернет выполните команду:
sladm pull --image-bundle full
Где:
--image-bundle— тип пакета образов (fullдля полного набора).
Примечание
Для обновления образов отдельно лицензируемых компонентов, таких как SpeechSense, дополнительно выполните загрузку с --image-bundle speechsense. Подробнее см. в разделе Загрузить образы SpeechSense.
Перенести артефакты во внутренний контур
Перенесите на машину с доступом к локальному реестру кластера:
- бинарный файл
sladm; - файл
release.yaml; - папку
<имя_релиза>-oci.
Загрузить образы в локальный реестр
На машине с доступом к кластеру выполните команду:
sladm push --local-registry --kubeconfig=<путь_к_kubeconfig> --image-bundle-folder <имя_папки>-oci
Где:
--local-registry— указывает на использование локального реестра кластера;--kubeconfig— путь к файлу kubeconfig для доступа к кластеру;--image-bundle-folder— путь к папке с образами.
Дождаться появления релиза
После загрузки образов дождитесь появления нового релиза в ресурсе AvailableReleases:
kubectl get availablereleases main -o yaml
Когда нужная версия появится в списке со статусом ready: true, можно запускать обновление.
Запустить обновление
-
Создайте файл манифеста. Например, с помощью команды
touch upgrade.yaml. -
Откройте файл и вставьте конфигурацию:
apiVersion: stackland.yandex.cloud/v1alpha1 kind: TargetInstallationState metadata: name: main spec: targetVersion: "<версия>" installationTimeout: "2h"Где:
targetVersion— целевая версия для обновления. Укажите значение изavailablereleases[main].status.releases[<желаемый_релиз>].version.installationTimeout— максимальное время выполнения обновления.
-
Примените манифест:
kubectl apply -f upgrade.yaml
Проверить статус обновления
После применения манифеста вы можете отслеживать статус обновления:
kubectl get targetinstallationstate main
Пример вывода:
NAME TARGET VERSION CURRENT VERSION PHASE MESSAGE AGE
main 26.1.1 26.1.0 Running Running upgrade to version 26.1.1 5m
Получить подробную информацию
Выполните команду:
kubectl describe targetinstallationstate main
В поле status отображается:
currentVersion— текущая установленная версия.phase— фаза обновления:Pending— обновление ожидает запуска.Running— обновление выполняется.Completed— обновление выполнено.Failed— обновление завершилось с ошибкой.
message— сообщение о текущем состоянии.jobName— имя задания Kubernetes, выполняющего обновление.lastUpdateTime— время последнего обновления статуса.
Просмотреть логи обновления
Чтобы просмотреть логи задания обновления, выполните команду:
kubectl logs -n stackland-install job/<имя_задания>
Имя задания можно получить из поля status.jobName ресурса TargetInstallationState.