Надання ресурсів CPU та памʼяті на рівні Podʼів
Kubernetes v1.32 [alpha]
(стандартно увімкнено: false)Ця сторінка показує, як вказати ресурси CPU та памʼяті для Pod на рівні podʼів, додатково до специфікацій ресурсів на рівні контейнера. Вузол Kubernetes виділяє ресурси для podʼів на основі запитів ресурсів podʼом. Ці запити можуть бути визначені на рівні podʼа або індивідуально для контейнерів у podʼі. Коли присутні обидва, запити на рівні podʼа мають пріоритет.
Аналогічно, використання ресурсів podʼом обмежується лімітами, які також можуть бути встановлені на рівні podʼа або індивідуально для контейнерів у podʼі. Знову ж таки, ліміти на рівні podʼа мають пріоритет, коли присутні обидва. Це дозволяє гнучко керувати ресурсами, дозволяючи контролювати розподіл ресурсів як на рівні podʼа, так і на рівні контейнера.
Щоб вказати ресурси на рівні podʼа, необхідно увімкнути функціональну можливість PodLevelResources
.
Для ресурсів на рівні Podʼа:
- Пріоритет: Коли вказані як ресурси на рівні podʼа, так і на рівні контейнера, ресурси на рівні podʼа мають пріоритет.
- QoS: Ресурси на рівні podʼа мають пріоритет у впливі на клас QoS podʼа.
- OOM Score: Розрахунок коригування OOM score враховує як ресурси на рівні podʼа, так і на рівні контейнера.
- Сумісність: Ресурси на рівні pod розроблені для сумісності з наявними функціями.
Перш ніж ви розпочнете
Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:
Версія вашого Kubernetes сервера має бути не старішою ніж 1.32. Для перевірки версії введітьkubectl version
.Функціональна можливість PodLevelResources
має бути увімкнена для вашої панелі управління та для всіх вузлів у вашому кластері.
Створіть простір імен
Створіть простір імен, щоб ресурси, які ви створюєте в цій вправі, були ізольовані від решти вашого кластера.
kubectl create namespace pod-resources-example
Створіть pod із запитами та лімітами памʼяті на рівні podʼа
Щоб вказати запити памʼяті для 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
Створіть pod із запитами та лімітами CPU на рівні podʼа
Щоб вказати запит 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.
Створіть pod із запитами та лімітами ресурсів як на рівні 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-resources-demo --namespace=pod-resources-example
Перегляньте детальну інформацію про Pod:
kubectl get pod memory-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:
requests:
cpu: 500m
memory: 50Mi
limits:
cpu: 500m
memory: 100Mi
...
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