Раскрытие того, как Kubernetes реализует обновление подов на месте
Раскрытие того, как Kubernetes реализует обновление подов на месте

Введение концепции

Обновление на местесловосередина,"обновление"Не сложно понять,Это экземпляр приложения Воля из версии, замененной старой версией на новую версию. Так как знал Kubernetes А как насчет окружающей среды, чтобы понять «на месте»?

Давайте сначала посмотрим, как высвобождается собственная рабочая нагрузка K8. Здесь предполагается, что нам нужно развернуть приложение, включающее в себя два контейнера foo и bar в поде. Среди них версия образа, использованная при первом развертывании контейнера foo, была v1. Нам нужно обновить его до образа версии v2. Как это сделать?

  • Если это приложение использует Deployment Развертывание, Так процесс обновления середина Deployment вызовет новую версию ReplicaSet создавать Pod и удалите старую версию Под. Как показано ниже:

image

Во время процесса обновления исходный объект Pod удаляется и создается новый объект Pod. Новый под назначается другому узлу, ему назначается новый IP-адрес, два контейнера foo и bar повторно извлекаются на этом узле, и контейнеры запускаются.

  • Если это следует использовать StatefulSet Развертывание, Так процесс обновления середина StatefulSet Старые будут удалены в первую очередь Pod объект, после завершения удаления, использовать то же имя, существующеесоздавать для создания нового. Pod объект. Как показано ниже:

image

Стоит отметить, что хотя старый и новый поды называются pod-0, на самом деле это два совершенно разных объекта пода (uid также изменился). StatefulSet ждет, пока исходный объект pod-0 не будет полностью удален из кластера Kubernetes, прежде чем приступить к созданию нового объекта pod-0. Этот новый под также будет перепланирован, ему будет присвоен IP-адрес, получен образ и запущен контейнер.

-Так называемый режим обновления на месте позволяет избежать удаления или создания новых объектов Pod в процессе обновления приложения, а обновить версию образа одного или нескольких контейнеров на основе исходных объектов Pod:

В процессе обновления на месте мы только обновили поле изображения контейнера foo в исходном объекте Pod, чтобы инициировать обновление контейнера foo до новой версии. Независимо от того, изменились ли объект Pod, Node или IP, даже контейнер bar все еще работает во время обновления контейнера foo.

Подвести Итог: Это только обновления Pod одну или несколько версий контейнера, не затрагивая всю Pod Метод обновления объектов и других контейнеров называется Kubernetes Обновление на месте в .

Анализ доходов

Итак, почему мы представляем эту концепцию и дизайн обновления на месте в Kubernetes?

Прежде всего, такая модель обновления на месте значительно повышает эффективность выпуска приложений. Согласно неполной статистике, обновление на месте в среде Alibaba повышает скорость выпуска как минимум на 80% по сравнению с полной пересборкой и обновлением. На самом деле это легко понять. Обновление на месте обеспечивает следующие моменты оптимизации для повышения эффективности выпуска:

  • Экономит трудоемкое планирование, Pod Местоположение и ресурсы не изменятся;
  • Экономит трудоемкую сеть распространения, Pod Все еще использую оригинал IP;
  • Экономит время на выделение и монтирование удаленных дисков, Pod Все еще использую оригинал ФЭ (а они все уже существуют Node Хорошо монтируем);
  • Экономит большую часть трудоемкого процесса вытаскивания зеркала, потому что для Node Приложение старое зеркало уже хранится на зеществовать. При скачивании новой версии зеркала необходимо загрузить всего несколько слоев. layer。

Во-вторых, когда мы обновляем некоторые дополнительные контейнеры в поде (например, сбор логов, мониторинг и т. д.), мы фактически не хотим вмешиваться в работу бизнес-контейнеров. Однако в этом сценарии обновление Deployment или StatefulSet приведет к перестройке всего пода, что неизбежно окажет определенное влияние на бизнес. Объем изменений при обновлении на месте на уровне контейнера легко контролируется. Пересозданы будут только те контейнеры, которые необходимо обновить, а другие контейнеры, включая сетевые и монтируемые диски, не будут затронуты.

Наконец, обновление на месте также обеспечивает стабильность и уверенность кластера. Когда большое количество приложений в кластере Kubernetes запускает перестроение обновлений подов, это может вызвать крупномасштабное смещение подов и повторную упреждающую миграцию некоторых подов с низким приоритетом задач на узле. Эти крупномасштабные реконструкции Pod сами по себе окажут большую нагрузку на центральные компоненты, такие как API-сервер, планировщик, распределение сети/диска и т. д., а задержки в этих компонентах также создадут порочный круг для реконструкции Pod. При обновлении на месте весь процесс обновления включает только обновление контроллером объекта Pod и перестройку kubelet соответствующего контейнера.

Технический опыт

В Alibaba большинство приложений электронной коммерции выпускаются с использованием обновлений на месте в собственной облачной среде, и этот набор контроллеров, поддерживающих обновления на месте, находится в проекте с открытым исходным кодом OpenKruise.

Другими словами, все внутренние облачные приложения Alibaba используют расширенную рабочую нагрузку OpenKruise для развертывания и управления и не используют собственный Deployment/StatefulSet и т. д.

Так OpenKruise Как получить Обновление на местеспособностьиз Шерстяная ткань?существоватьпредставлять Обновление на месте Принцип Прежде чем приступить к реализации, давайте взглянем на некоторые обновления. на функция места зависит от из Родной Kubernetes Функция:

История 1. Управление версиями Kubelet для контейнеров Pod

Kubelet на каждом узле рассчитает хэш-значение для каждого контейнера во всех контейнерах Pod.spec.containers на локальном компьютере и запишет его в фактически созданный контейнер.

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

Эта функция на самом деле является основным принципом обновления на месте для одного модуля.

История 2. Ограничения обновления Pod

В собственном kube-apiserver запросы на обновление объектов Pod имеют строгую логику проверки:

Язык кода:javascript
копировать
// validate updateable fields:
// 1.  spec.containers[*].image
// 2.  spec.initContainers[*].image
// 3.  spec.activeDeadlineSeconds

Проще говоря, для созданного пода в спецификации пода разрешено изменять только поле изображения в контейнерах/initContainers и поле activeDeadlineSeconds. Обновления всех остальных полей в спецификации Pod будут отклонены kube-apiserver.

История 3: отчеты о состоянии контейнера

kubelet сообщит о состоянии контейнера в файле pod.status, что соответствует фактическому статусу работы всех контейнеров в поде:

Язык кода:javascript
копировать
apiVersion: v1
kind: Pod
spec:
  containers:
  - name: nginx
    image: nginx:latest
status:
  containerStatuses:
  - name: nginx
    image: nginx:mainline
    imageID: docker-pullable://nginx@sha256:2f68b99bc0d6d25d0c56876b924ec20418544ff28e1fb89a4c27679a40da811b

В большинстве случаев два изображения spec.containers[x].image и status.containerStatuses[x].image совпадают.

Однако бывают ситуации, подобные приведенной выше, когда изображение, сообщаемое kubelet, не соответствует изображению в спецификации (в спецификации указано nginx:latest, а в статусе — nginx:mainline).

Это потому что кубелет сообщил image На самом деле из CRI Имя изображения, соответствующее контейнеру, полученному в интерфейсе. И если Node На машине имеется несколько изображений, соответствующих одному imageID,Так Отчетиз可能да其серединалюбой:

Язык кода:javascript
копировать
$ docker images | grep nginx
nginx            latest              2622e6cca7eb        2 days ago          132MB
nginx            mainline            2622e6cca7eb        2 days ago

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

История 4. ReadinessGate контролирует готовность модуля

существовать Kubernetes 1.12 предыдущая версия, Pod будь то в Ready статус просто kubelet Определите на основе состояния контейнера: если Pod Все средние контейнеры ready,Так Pod Просто в Ready состояние.

Но на самом деле во многих случаях оператору или пользователю верхнего уровня требуется возможность контролировать готовность модуля. Поэтому Kubernetes версии 1.12 и более поздних версий предоставляет функцию ReadinessGates для реализации этого сценария. следующее:

Язык кода:javascript
копировать
apiVersion: v1
kind: Pod
spec:
  readinessGates:
  - conditionType: MyDemo
status:
  conditions:
  - type: MyDemo
    status: "True"
  - type: ContainersReady
    status: "True"
  - type: Ready
    status: "True"

В настоящее время существует два обязательных условия для того, чтобы kubelet мог определить готовность пода:

  • Pod Все средние контейнеры Готово (фактически соответствует ContainersReady condition для True);
  • если pod.spec.readinessGates середина определяет один или несколько ConditionType, Так требуются эти conditionType существовать pod.status.conditions середина Всеверноотвечатьиз status: "true" изсостояние.

Только при выполнении двух вышеуказанных предварительных условий kubelet сообщит о состоянии готовности как True.

Принцип реализации

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

1. Как обновить один модуль?

Как видно из «Фоны 1», на самом деле, если мы изменим поля в spec.containers[x] существующего пода, kubelet почувствует, что хэш этого контейнера изменился, и тогда он остановит соответствующий старый контейнер и используйте новый контейнер для извлечения изображений, создания и запуска новых контейнеров.

Как видно из «Фон 2», текущие изменения, которые мы вносим в spec.containers[x] существующего пода, ограничены полем изображения.

Отсюда следует, что первый Принцип реализация: **верно к существующему из Pod Объект, мы можем и можем только его модифицировать spec.containers[x].image поле для запуска Pod Обновите соответствующий контейнер до нового. image。

2. Как определить, был ли Pod успешно обновлен на месте?

Следующий вопрос: после того как мы изменим поле spec.containers[x].image в Pod, как определить, что kubelet успешно пересобрал контейнер?

По "Фон. 3" видно, сравните spec и status в image Поле ненадежно, потому что очень возможно status Тот, о котором сообщалось в Node Сохранить существованиеиз другого имени зеркала (того же imageID)。

поэтому,Получите второй Принцип реализации:суждение Pod Обновление на сели успешны, условно говоря, более надежным методом является существование Обновление на местевперед Первый генерал status.containerStatuses[x].imageID Запишите это. существование обновлено spec После зеркалирования, если оно наблюдается Pod из status.containerStatuses[x].imageID изменений, мы считаем, что обновление на месте перестроило контейнер.

Но таким образом,насверно Обновление на местеиз image Также есть требование: его нельзя использовать image Имена (теги) разные, но на самом деле соответствуют одному и тому же imageID иззеркало Приди и сделай это Обновление на месте, иначе могло быть суждениедля и обновление не удалось (из-за status середина imageID не изменится).

Конечно, мы можем продолжить оптимизацию в будущем. Опен Круиз То есть воля с открытым исходным кодом зеркала с подогревом из возможности, пройдет DaemonSet существоватькаждый Node Разверните один на NodeImage Под. проходить NodeImage Сообщите об этом и мы узнаем pod spec в image Местоверноотвечатьиз imageID, затем и pod status в imageID Сравнение позволяет точно определить, является ли обновление на месте успешным.

3. Как гарантировать, что трафик не потеряется при обновлении на месте?

существовать Kubernetes середина,один Pod ли Ready Это означает, что он может предоставлять услуги. Итак, как Service Этот вид въезда будет проходить через суждение. Pod Ready Приходи и выбирай, может ли Воля это Pod присоединиться endpoints 端点середина。

По "Фон. 4" видно из Kubernetes 1.12+ После этого оператор/контролер Эти компоненты также можно настроить через readinessGates èОбновить pod.status.conditions в Настроить type статус для контроля Pod ли доступен.

поэтому,Получите третий принцип реализации:Можетсуществовать pod.spec.readinessGates середина определяет человека по имени InPlaceUpdateReady из conditionType。

существовать Обновление на местечас:

  • Первый генерал pod.status.conditions в InPlaceUpdateReady condition установлен на «Ложь», это вызовет kubelet Воля Pod Отчетдля NotReady, что приводит к возникновению таких компонентов трафика, как endpoint контроллер) Волятис Pod Удален из конечной точки службы;
  • Обновить еще раз pod spec в image курок Обновление на месте。

После завершения обновления на месте InPlaceUpdateReady condition установлен на «Правда» делает Pod вернуться в Ready состояние.

кроме тогосуществовать Обновление на местоиз двух шагов середина, первый шаг Воля Pod Изменить на NotReady После этого компонент потока становится асинхронным. watch Изменение и удаление конечной точки может занять некоторое время. Поэтому мы также предлагаем элегантное Обновление. на размещаемость, то есть gracePeriodSeconds Конфигурациясуществовать修改 NotReady статус и реальное обновление image курок Обновление на место изтихо период времени между двумя шагами.

4. Комбинированная стратегия выпуска

Обновление на местеи Pod Подобно пересборке и обновлению, его можно выполнять в сочетании с различными стратегиями выпуска:

  • partition:если Конфигурация partition Делаю оттенки серого, Так знает только Воля replicas-partition Количество Pod Делать Обновление на месте;
  • maxUnavailable:если конфигурация maxUnavailable, Так удовлетворит только Воля unavailable Количество Pod Делать Обновление на месте;
  • maxSurge:если Конфигурация maxSurge Чтобы сделать эластичность, Так следует сначала расширить ее. maxSurge Количество Pod После этого запас из Pod Все еще пользуюсь Обновлением на месте;
  • приоритет/разброс: если настраивает стратегию приоритета/разброса выпуска,Будет следовать последовательности стратегий, верно. Pod to do Обновление на месте.

Подвести итог

Как упоминалось выше,OpenKruise объединить Kubernetes Роднойпоставлятьиз kubelet Управление версиями контейнеров, готовностьGates и другие функции,реализованные для Pod из Обновление на местеспособность。

и Обновление на Место также для выпуска приложений приносит значительные улучшения в эффективности и стабильности. Стоит обратить внимание Однако по мере увеличения масштаба кластеров и приложений это улучшение будет становиться все более очевидным. Это Обновление на Возможности площадки, существовавшие в последние два года, помогли Alibaba плавно перейти на сверхкрупномасштабные контейнеры приложений Alibaba. Kubernetes изоблако Роднойсреда,и Родной Deployment/StatefulSet Совершенно невозможно распространять и использовать его в среде такого размера.

Источник (авторские права принадлежат оригинальному автору): https://developer.aliyun.com/article/765421

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose