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

Горизонтальне ручне масштабування для 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 за допомогою strategic merge patch:

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

Що далі