Kubernetes v1.34 [beta](стандартно увімкнено)Ця сторінка показує, як вказати ресурси CPU та памʼяті для Pod на рівні podʼів, додатково до специфікацій ресурсів на рівні контейнера. Вузол Kubernetes виділяє ресурси для podʼів на основі запитів ресурсів podʼом. Ці запити можуть бути визначені на рівні podʼа або індивідуально для контейнерів у podʼі. Коли присутні обидва, запити на рівні podʼа мають пріоритет.
Аналогічно, використання ресурсів podʼом обмежується лімітами, які також можуть бути встановлені на рівні podʼа або індивідуально для контейнерів у podʼі. Знову ж таки, ліміти на рівні podʼа мають пріоритет, коли присутні обидва. Це дозволяє гнучко керувати ресурсами, дозволяючи контролювати розподіл ресурсів як на рівні podʼа, так і на рівні контейнера.
Щоб вказати ресурси на рівні podʼа, необхідно увімкнути функціональну можливість PodLevelResources.
Для ресурсів на рівні Podʼа:
Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:
Версія вашого Kubernetes сервера має бути не старішою ніж 1.34.Для перевірки версії введіть kubectl version.
Функціональна можливість PodLevelResources має бути увімкнена для вашої панелі управління та для всіх вузлів у вашому кластері.
Для Kubernetes 1.35, зміна розміру ресурсів на рівні podʼа має такі обмеження:
InPlacePodLevelResourcesVerticalScaling, яка перебуває в стані альфа у Kubernetes 1.35. Для отримання додаткової інформації див. Зміна розміру ресурсів CPU та пам'яті Podʼів.Створіть простір імен, щоб ресурси, які ви створюєте в цій вправі, були ізольовані від решти вашого кластера.
kubectl create namespace pod-resources-example
Щоб вказати запити памʼяті для pod на рівні podʼа, включіть поле resources.requests.memory у маніфест pod. Щоб вказати ліміт памʼяті, включіть resources.limits.memory.
У цій вправі ви створюєте pod, який має один контейнер. Pod має запит памʼяті 100 MiB і ліміт памʼяті 200 MiB. Ось конфігураційний файл для podʼа:
apiVersion: v1
kind: Pod
metadata:
name: memory-demo
namespace: pod-resources-example
spec:
resources:
requests:
memory: "100Mi"
limits:
memory: "200Mi"
containers:
- name: memory-demo-ctr
image: nginx
command: ["stress"]
args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]
Розділ args у маніфесті надає аргументи для контейнера під час його запуску. Аргументи "--vm-bytes", "150M" вказують контейнеру спробувати виділити 150 MiB памʼаяті.
Створіть Pod:
kubectl apply -f https://k8s.io/examples/pods/resource/pod-level-memory-request-limit.yaml --namespace=pod-resources-example
Перевірте, що Pod працює:
kubectl get pod memory-demo --namespace=pod-resources-example
Перегляньте детальну інформацію про Pod:
kubectl get pod memory-demo --output=yaml --namespace=pod-resources-example
Вивід показує, що Pod має запит памʼяті 100 MiB і ліміт памʼяті 200 MiB.
...
spec:
containers:
...
resources:
requests:
memory: 100Mi
limits:
memory: 200Mi
...
Запустіть kubectl top, щоб отримати метрики для pod:
kubectl top pod memory-demo --namespace=pod-resources-example
Вивід показує, що Pod використовує близько 162,900,000 байтів памʼяті, що становить близько 150 MiB. Це більше, ніж запит Pod у 100 MiB, але в межах ліміту Pod у 200 MiB.
NAME CPU(cores) MEMORY(bytes)
memory-demo <something> 162856960
Щоб вказати запит CPU для Pod, включіть поле resources.requests.cpu у маніфест Pod. Щоб вказати ліміт CPU, включіть resources.limits.cpu.
У цій вправі ви створюєте Pod, який має один контейнер. Pod має запит 0.5 CPU і ліміт 1 CPU. Ось конфігураційний файл для Pod:
apiVersion: v1
kind: Pod
metadata:
name: cpu-demo
namespace: pod-resources-example
spec:
resources:
limits:
cpu: "1"
requests:
cpu: "0.5"
containers:
- name: cpu-demo-ctr
image: vish/stress
args:
- -cpus
- "2"
Розділ args конфігураційного файлу надає аргументи для контейнера під час його запуску. Аргумент -cpus "2" вказує контейнеру спробувати використовувати 2 CPU.
Створіть Pod:
kubectl apply -f https://k8s.io/examples/pods/resource/pod-level-cpu-request-limit.yaml --namespace=pod-resources-example
Перевірте, що Pod працює:
kubectl get pod cpu-demo --namespace=pod-resources-example
Перегляньте детальну інформацію про Pod:
kubectl get pod cpu-demo --output=yaml --namespace=pod-resources-example
Вивід показує, що Pod має запит CPU 500 milliCPU і ліміт CPU 1 CPU.
spec:
containers:
...
resources:
limits:
cpu: "1"
requests:
cpu: 500m
Використовуйте kubectl top, щоб отримати метрики для Pod:
kubectl top pod cpu-demo --namespace=pod-resources-example
Цей приклад виходу показує, що Pod використовує 974 milliCPU, що трохи менше ліміту 1 CPU, вказаного в конфігурації Pod.
NAME CPU(cores) MEMORY(bytes)
cpu-demo 974m <something>
Нагадаємо, що встановивши -cpu "2", ви налаштували контейнер на спробу використовувати 2 CPU, але контейнеру дозволено використовувати лише близько 1 CPU. Використання CPU контейнера обмежується, оскільки контейнер намагається використовувати більше ресурсів CPU, ніж ліміт CPU Pod.
Щоб призначити ресурси CPU та памʼяті Pod, ви можете вказати їх як на рівні podʼа, так і на рівні контейнера. Включіть поле resources у специфікацію Podʼа, щоб визначити ресурси для всього Podʼа. Додатково включіть поле resources у специфікацію контейнера в маніфесті Podʼа, щоб встановити вимоги до ресурсів для конкретного контейнера.
У цій вправі ви створите Pod із двома контейнерами, щоб дослідити взаємодію специфікацій ресурсів на рівні podʼа і контейнера. Сам Pod матиме визначені запити та ліміти CPU, тоді як лише один із контейнерів матиме власні явні запити та ліміти ресурсів. Інший контейнер успадкує обмеження ресурсів від налаштувань на рівні podʼа. Ось конфігураційний файл для Podʼа:
apiVersion: v1
kind: Pod
metadata:
name: pod-resources-demo
namespace: pod-resources-example
spec:
resources:
limits:
cpu: "1"
memory: "200Mi"
requests:
cpu: "1"
memory: "100Mi"
containers:
- name: pod-resources-demo-ctr-1
image: nginx
resources:
limits:
cpu: "0.5"
memory: "100Mi"
requests:
cpu: "0.5"
memory: "50Mi"
- name: pod-resources-demo-ctr-2
image: fedora
command:
- sleep
- inf
Створіть Pod:
kubectl apply -f https://k8s.io/examples/pods/resource/pod-level-resources.yaml --namespace=pod-resources-example
Перевірте, що контейнер Podʼа працює:
kubectl get pod pod-resources-demo --namespace=pod-resources-example
Перегляньте детальну інформацію про Pod:
kubectl get pod pod-resources-demo --output=yaml --namespace=pod-resources-example
Вивід показує, що один контейнер у Pod має запит памʼяті 50 MiB і запит CPU 0.5 ядер, з лімітом памʼяті 100 MiB і лімітом CPU 0.5 ядер. Сам Pod має запит памʼяті 100 MiB і запит CPU 1 ядро, і ліміт памʼяті 200 MiB і ліміт CPU 1 ядро.
...
containers:
-
name: pod-resources-demo-ctr-1
resources:
limits:
cpu: 500m
memory: 100Mi
requests:
cpu: 500m
memory: 50Mi
...
-
name: pod-resources-demo-ctr-2
resources: {}
...
resources:
limits:
cpu: "1"
memory: 200Mi
requests:
cpu: "1"
memory: 100Mi
...
Оскільки вказані запити та ліміти на рівні podʼа, гарантії запитів для обох контейнерів у podʼі будуть рівні 1 ядру CPU та 100Mi памʼяті. Крім того, обидва контейнери разом не зможуть використовувати більше ресурсів, ніж вказано в лімітах на рівні podʼа, забезпечуючи, що вони не можуть перевищити загальну суму 200 MiB памʼяті та 1 ядро CPU.
Видаліть простір імен:
kubectl delete namespace pod-resources-example
Налаштування стандартних запитів та обмежень памʼяті для простору імен
Налаштування стандартних запитів та обмежень ЦП для простору імен
Налаштування мінімальних та максимальних обмежень памʼяті для простору імен
Налаштування мінімальних та максимальних обмежень ЦП для простору імен