Горизонтальне ручне масштабування для Deployment

Ця сторінка показує, як вручну масштабувати Deployment горизонтально, змінюючи кількість його реплік. Ручне масштабування дозволяє безпосередньо контролювати кількість працюючих Podʼів для передбачуваних змін навантаження або управління витратами.

Це відрізняється від вертикального масштабування: залишаючи кількість реплік незмінною, але змінюючи кількість ресурсів, доступних для кожного Pod.

Цілі

  • Масштабування Deployment для обробки більшого трафіку.
  • Зменшення масштабування Deployment для економії ресурсів.
  • Масштабування Deployment до нуля для тимчасового призупинення навантаження.
  • Розуміння, коли використовувати ручне масштабування, а коли HorizontalPodAutoscaler.

Перш ніж ви розпочнете

Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:

Вам потрібен наявний Deployment. Якщо у вас його немає, і ви просто хочете попрактикуватися, ви можете створити Deployment nginx з Запуск застосунку без збереження стану за допомогою Deployment:

kubectl apply -f https://k8s.io/examples/application/deployment.yaml

Перевірте, що Deployment запускає два Podʼи:

kubectl get deployment nginx-deployment

Вивід схожий на:

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   2/2     2            2           10s

Масштабування Deployment вгору

Існує кілька способів змінити кількість реплік для існуючого Deployment.

Масштабування вгору за допомогою kubectl scale

Використовуйте kubectl scale, щоб встановити кількість реплік:

kubectl scale deployment/nginx-deployment --replicas=4

Вивід схожий на:

deployment.apps/nginx-deployment scaled

Перевірте, що Deployment має чотири Podʼи:

kubectl get deployment nginx-deployment

Вивід схожий на:

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   4/4     4            4           1m

Декларативне масштабування за допомогою kubectl apply

Замість виконання імперативної команди, ви можете оновити файл маніфесту та застосувати його. Цей підхід добре підходить для робочих процесів з версіонованою конфігурацією.

Збережіть поточну конфігурацію Deployment у локальний файл:

kubectl get deployment nginx-deployment -o yaml > /tmp/nginx-deployment.yaml

Відредагуйте /tmp/nginx-deployment.yaml і змініть .spec.replicas на 4.

Перед застосуванням порівняйте ваші локальні зміни зі станом кластера:

kubectl diff -f /tmp/nginx-deployment.yaml

Застосуйте відредагований маніфест:

kubectl apply -f /tmp/nginx-deployment.yaml

Зменшення масштабування Deployment

Щоб зменшити кількість Podʼів, встановіть --replicas на менше значення:

kubectl scale deployment/nginx-deployment --replicas=2

Kubernetes належним чином завершує зайві Podʼи, дотримуючись налаштувань terminationGracePeriodSeconds для кожного Pod.

Перевірте, що Deployment має два Podʼи:

kubectl get pods -l app=nginx

Вивід схожий на:

NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-66b6c48dd5-7gl6h   1/1     Running   0          2m
nginx-deployment-66b6c48dd5-v8mkd   1/1     Running   0          2m

Масштабування до нуля

Ви можете масштабувати Deployment до нуля, щоб тимчасово призупинити навантаження, не видаляючи сам Deployment:

kubectl scale deployment/nginx-deployment --replicas=0

Перевірте, що жоден Pod не працює:

kubectl get deployment nginx-deployment

Вивід схожий на:

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   0/0     0            0           5m

Примітка:

Масштабування до нуля видаляє всі Podʼи, але зберігає Deployment та його ReplicaSet. Ви можете знову масштабувати вгору в будь-який час, встановивши --replicas на позитивне число.

Звичайні випадки використання масштабування до нуля включають:

  • Тимчасове призупинення навантаження для економії ресурсів
  • Вікна налагодження або обслуговування
  • Контроль витрат у середовищах розробки або тестування

Інші способи зміни кількості реплік

Окрім kubectl scale, ви можете змінити .spec.replicas за допомогою kubectl edit або kubectl patch.

Масштабування за допомогою kubectl edit

kubectl edit deployment nginx-deployment

Змініть поле .spec.replicas в редакторі, потім збережіть і вийдіть.

Масштабування за допомогою kubectl patch

Ви можете оновити .spec.replicas за допомогою стратегічного злиття патчу:

kubectl patch deployment nginx-deployment -p '{"spec":{"replicas":4}}'

Для створення скриптів використовуйте патч JSON із тестом на наявність необхідних умов. Наведена нижче команда встановлює кількість реплік на 4, але лише в тому випадку, якщо поточна кількість становить 2:

kubectl patch deployment nginx-deployment --type=json -p='[
  {"op": "test", "path": "/spec/replicas", "value": 2},
  {"op": "replace", "path": "/spec/replicas", "value": 4}
]'

Операція test призводить до відмови патчу, якщо поточне значення не збігається, що запобігає небажаним змінам, коли кілька людей або скриптів змінюють один і той же Deployment.

Коли використовувати ручне та автоматичне масштабування

АспектРучне масштабуванняАвтоматичне масштабування (HPA)
Найкраще дляПередбачуваних, запланованих або одноразових змін навантаженняЗмінного або непередбачуваного попиту
Як це працюєВи встановлюєте .spec.replicas безпосередньоHPA регулює кількість реплік на основі спостережуваних метрик
Час реакціїНегайно після виконання командиРеагує на метрики з невеликою затримкою
Усвідомлення метрикВідсутнє — ви вирішуєте кількість реплікМоніторинг CPU, памʼяті або користувацьких метрик
ОбслуговуванняПотребує ручного втручання для налаштуванняПрацює автономно після конфігурації

Увага:

Якщо HorizontalPodAutoscaler керує Deployment, не встановлюйте репліки вручну. HPA постійно узгоджує кількість реплік і перевизначає будь-які ручні зміни.

Очищення

Видаліть Deployment:

kubectl delete deployment nginx-deployment

Що далі

Востаннє змінено April 16, 2026 at 5:18 PM PST: [uk] Ukrainian translation (all-in-one) (d256f81780)