K8S 1.27 динамически регулирует ограничения ресурсов ЦП и памяти контейнера без перезапуска приложения.
K8S 1.27 динамически регулирует ограничения ресурсов ЦП и памяти контейнера без перезапуска приложения.

Если при развертывании модуля вы указали ресурсы ЦП и памяти, для изменения размера ресурса потребуется перезапустить модуль. До сих пор перезагрузка мешала выполнению рабочих нагрузок.

Альфа-выпуск функции в Kubernetes 1.27. У одного есть возможность автоматически изменять размеры процессора и ограничений памяти модуля, просто исправляя определение работающего модуля, чтобы изменить их без его перезапуска.

Это также означает, что поля в спецификации ресурсов больше не могут использоваться в качестве индикаторов фактических ресурсов модуля. Инструменты мониторинга и другие подобные приложения теперь должны просматривать новые поля в статусе Pod, что также является большой проблемой для наших существующих оповещений мониторинга. Kubernetes запрашивает фактические запросы ЦП и памяти, а также ограничения, применяемые при запуске контейнеров, через вызовы API CRI (интерфейс выполнения контейнера) к среде выполнения (например,Containerd, который отвечает за запуск контейнеров). Использование ресурсов контейнера во время выполнения отражается в статусе модуля, который будет объяснен на примерах позже.

Какие новые функции есть в Kubernetes v1.27?

Помимо добавления политики перезапуска для изменения размера в спецификации модуля, в статус модуля были добавлены три новых поля.

  • Поле из в статусе выделенногоконтейнера Resources отражает выделение pod контейнеризNode ресурсов.
  • Поле из в статусе ресурсовконтейнера отражает фактические ресурсы (запросы и лимиты) в отчете о времени выполнения контейнера из положительного существования среды выполнения изконтейнера в Конфигурациииз.
  • Значение resizePod из предложенного является подтверждением изменения размера запроса и указывает, что запрос был проверен и зарегистрирован.
  • resizePod Значение InProgress указывает, что узел принял запрос на изменение размера и отправляет запрос на изменение размера Pod изконтейнер。
  • resizePod Значение Deferred указывает, что запрошенное изменение размера не может быть предоставлено в данный момент, и узел продолжит повторять попытки. когда другие Pod Разрешения на изменение размера могут быть предоставлены при выходе и освобождении ресурсов узла.
  • resizePod Значение из указывает, что узел Infeasible не может обеспечить запрошенное изменение размера. Если запрос на изменение размера превышает узел, можно Pod Это происходит при выделении максимального количества ресурсов.

Когда использовать эту функцию

  • Под работает на узле,Но ресурсов слишком много или слишком мало.
  • Из-за отсутствия достаточного количества в кластере CPU или Память,И чрезмерный Конфигурацияизтолькосуществоватьбегатьиз Pod Недостаточно используется и поэтому не может планировать это Pod。
  • Когда существование хранится на узле, другие приоритеты ниже из-за Модуль (можно изменить размер или переместить для сохранения состояния) Pod Чтобы освободить место), вытеснение требует больше ресурсов для перемещения на более крупный узел и некоторого сохранения состояния. Pod Это дорогостоящая или разрушительная операция.

Как использовать эту функцию

Чтобы использовать эту функцию в версии 1.27, в InPlacePodVerticalScaling должен быть включен шлюз функции.

Язык кода:javascript
копировать
FEATURE_GATES=InPlacePodVerticalScaling=true ./hack/local-up-cluster.sh

После запуска локального кластера Kubernetes Пользователи могут пройти kubectl Планирование pod ресурсы и корректировать pod из размера. Использование этой функции будет продемонстрировано позже. Пример。

Известные проблемы

Эта функция входит Kubernetes v1.27 из alpha этап. Вот несколько примеров, с которыми могут столкнуться пользователи: проблемы:

  • v1.6.9 Следующее из containerd Версия не имеет этой функции. Требуется для полной сквозной работы. CRI поддерживать. попытаться настроить pod размер, похоже, застревает в состоянии InProgress и resourcespod Поле «из» в статусе никогда не обновляется, даже если на существующем запущенном изконтейнере могут быть включены новые ресурсы.
  • Pod Изменение размера может произойти с другими Pod Обновление состояния гонки, приводящее к Pod Изменение размера реализации задержки.
  • Ресурсам может потребоваться много времени, чтобы отразить состояние модуля после изменения размера.
  • Эта функция не поддерживает статическую политику управления ЦП.

Пример

Я использую Kubernetes из публичной облачной версии, но поскольку она еще не доступна в этих размещенных версиях 1.27 версия (по состоянию на 2023 Год 4 месяц), мы будем использовать minikube существования запускает версию локально. Есть много способов сделать это; это всего лишь простой пример.

Он выпущен под существующим флагом функции InPlacePodVerticalScaling. Используйте этот флаг для запуска кластера minikube и узлов узла:

Язык кода:javascript
копировать
minikube start --kubernetes-version=v1.27.0 --feature-gates=InPlacePodVerticalScaling=true --cni calico
minikube node add

Когда вы будете готовы, запустите тестовый контейнер. Например, для нашей программы-изприложения изменения можно безопасно вносить без перезапуска. CPU количество, но для изменения количества Память требуется перезагрузка. Например, запустите базу данных из pod во время выполнения CPU Изменения количества не представляют проблемы, но уменьшение объема памяти может привести к неожиданному поведению. Мы устанавливаем для RestartPolicy значение «memory», что означает, что перезапуск контейнера вступит в силу. В противном случае поведение по умолчанию будет пытаться обновить все имеющиеся ресурсы.

Язык кода:javascript
копировать
apiVersion: v1
kind: Pod
metadata:
  name: inplacedemo
spec:
  containers:
  - name: inplacedemo
    image: alpine
    command: ["tail", "-f", "/dev/null"]
    resizePolicy:
    - resourceName: "memory"
      restartPolicy: "RestartContainer"
    resources:
      limits:
        cpu: 2
        memory: "1Gi"
      requests:
        cpu: 1
        memory: "500Mi"

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

Язык кода:javascript
копировать
$ kubectl apply -f yaml_above.yaml
pod/inplacedemo created
$ kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
inplacedemo   1/1     Running   0          53s
$ kubectl get pod inplacedemo -o yaml

В определении существования обратите внимание, что это resizePolicy:

Язык кода:javascript
копировать
spec:
  containers:
    ...
    resizePolicy:
    - resourceName: memory
      restartPolicy: RestartContainer
    - resourceName: cpu
      restartPolicy: NotRequired

выделенные ресурсы выделяются для pod контейнеризресурс,И есть дополнительное поле ресурсов. Это отражает фактическое использование текущих ресурсов.,Вместо обязательных/обновляемых ресурсов.

Язык кода:javascript
копировать
 containerStatuses:
  - allocatedResources:
      cpu: "1"
      memory: 500Mi
    ...
    resources:
      limits:
        cpu: "2"
        memory: 1Gi
      requests:
        cpu: "1"
        memory: 500Mi

Давайте сначала изменим ограничение ЦП модуля и увеличим его с 2 до 3.

Язык кода:javascript
копировать
kubectl patch pod inplacedemo --patch '{"spec":{"containers":[{"name":"inplacedemo", "resources":{"limits":{"cpu":"3"}}}]}}'

Проверьте характеристики модуля еще раз

Язык кода:javascript
копировать
spec:
  ...
    resources:
      limits:
        cpu: "3"
        memory: 1Gi
      requests:
        cpu: "1"
        memory: 500Mi

status:
  ...
  containerStatuses:
    ...
    resources:
      limits:
        cpu: "2"
        memory: 1Gi
      requests:
        cpu: "1"
        memory: 500Mi
    restartCount: 0
  ...
  resize: InProgress

Pod от resize: Время, необходимое от InProgress до завершения (знак исчезает), варьируется. Если вы видите другие флаги, такие как изменение размера: Невозможно, проверьте ресурсы вашего узла и убедитесь, что их достаточно.

Продолжаем ограничивать от 1G увеличивать до 2G:

Язык кода:javascript
копировать
kubectl patch pod inplacedemo --patch '{ "spec" :{ "containers" :[{ "name" : "inplacedemo" , "resources" :{ "limits" :{ "memory" : "2Gi" }}}]} }'

Процесс такой же, как и раньше.

Kubernetes Обновите нижний слой на месте c-group распространять, использовать pod Определения ресурсов являются изменяемыми. Эта вертикальная экспансия существует pod Особенно полезно в ситуациях, например, при использовании Kubernetes Встроенный Вертикальный Pod Autoscaler (VPA), что позволяет приложению программы существовать так же pod Масштабируйте ресурсы вверх/вниз внутри (а не за счет большего количества модулей). Вход/выход для расширения) и традиционный уровень Pod то же, что масштабирование).

существуют во многих случаях использования,Вертикальное масштабирование помогает,Например некоторые Java Приложение существует, может потребоваться больше времени во время инициализации, чем при нормальной работе процесса. CPU Гораздо больше из ПРОЦЕССОР. Если такое приложение признано пригодным для нормальной работы. CPU запросы и ограничения, они могут страдать от длительного запуска. Этот тип Pod Можетсуществоватьсоздавать Pod При запросе более высокого из CPU значение, и его размер может быть изменен в соответствии с обычными эксплуатационными потребностями после завершения инициализации программы.

boy illustration
Анализ исходного кода, связанный с запланированными задачами версии ruoyi-vue (7), то есть анализ модуля ruoyi-quartz.
boy illustration
Вход в систему с помощью скан-кода WeChat (1) — объяснение процесса входа в систему со скан-кодом, получение авторизованного QR-кода для входа.
boy illustration
HikariPool-1 — обнаружено отсутствие потока или скачок тактовой частоты, а также конфигурация источника данных Hikari.
boy illustration
Сравнение высокопроизводительной библиотеки JSON Go
boy illustration
Простое руководство по извлечению аудио с помощью FFmpeg
boy illustration
Подсчитайте количество строк кода в проекте
boy illustration
Spring Boot элегантно реализует многопользовательскую архитектуру: концепции и практика
boy illustration
Как интегрировать функцию оповещения корпоративного WeChat в систему планирования xxl-job
boy illustration
SpringBoot интегрирует отправку сообщений через веб-сокет в режиме реального времени
boy illustration
Краткий анализ основных библиотек журналов в Go: узнайте, как интегрировать функции вращения и резки бревен на уровне проектирования.
boy illustration
Реализация API-шлюза с нуля-Golang
boy illustration
[Разговорный сайт] Как Springboot получает значения свойств из файлов конфигурации yml или свойств
boy illustration
Spring Boot — синхронные события приложения против асинхронных событий публикации и подписки. Практический бой
boy illustration
Spring Boot использует Swagger3 для создания документов интерфейса API.
boy illustration
[1269] Использование Gunicorn для развертывания проектов flask.
boy illustration
Краткое изложение 10 способов регистрации bean-компонентов в SpringBoot
boy illustration
Flask Learning-9. 2 способа включения режима отладки (debug mode).
boy illustration
Руководство по настройке самостоятельного сервера для Eudemons Parlu
boy illustration
40 вопросов для собеседований по SpringBoot, которые необходимо задавать на собеседованиях! При необходимости ответьте на вопросы для собеседования SpringBoot [предлагаемый сборник] [легко понять]
boy illustration
Через два года JVM может быть заменен GraalVM.
boy illustration
Разрешение циклических зависимостей Spring Bean: существует ли неразрешимая циклическая ссылка?
boy illustration
Разница между промежуточным программным обеспечением ASP.NET Core и фильтрами
boy illustration
[Серия Foolish Old Man] Ноябрь 2023 г. Специальная тема Winform Control Элемент управления DataGridView Подробное объяснение
boy illustration
.NET Как загрузить файлы через HttpWebRequest
boy illustration
[Веселый проект Docker] Обновленная версия 2023 года! Создайте эксклюзивный инструмент управления паролями за 10 минут — Vaultwarden
boy illustration
Высокопроизводительная библиотека бревен Golang zap + компонент для резки бревен лесоруба подробное объяснение
boy illustration
Концепция и использование Springboot ConstraintValidator
boy illustration
Новые функции Go 1.23: точная настройка основных библиотек, таких как срезы и синхронизация, значительно улучшающая процесс разработки.
boy illustration
[Весна] Введение и базовое использование AOP в Spring, SpringBoot использует AOP.
boy illustration
Чтобы начать работу с рабочим процессом Flowable, этой статьи достаточно.