Перейти до вмісту

Модуль 2.6: Планування

Hands-On Lab Available
K8s Cluster advanced 45 min
Launch Lab ↗

Opens in Killercoda in a new tab

Складність: [MEDIUM] — Критична тема на іспиті

Час на проходження: 45-55 хвилин

Передумови: Модуль 2.1 (Поди), Модуль 2.5 (Управління ресурсами)


Що ви зможете робити

Розділ «Що ви зможете робити»

Після цього модуля ви зможете:

  • Налаштувати nodeSelector, node affinity та правила pod affinity/anti-affinity
  • Використовувати taints та tolerations для контролю, які поди можуть запускатися на конкретних вузлах
  • Імплементувати pod topology spread constraints для високої доступності між зонами
  • Дебажити поди у стані Pending, читаючи події планувальника та зіставляючи їх з обмеженнями вузлів

Чому цей модуль важливий

Розділ «Чому цей модуль важливий»

За замовчуванням планувальник розміщує Поди на будь-якій Ноді з доступними ресурсами. Але в продакшені вам потрібен контроль:

  • Запускати Поди бази даних на Нодах із SSD
  • Тримати певні Поди окремо для високої доступності
  • Розподіляти навантаження між зонами доступності
  • Резервувати Ноди для конкретних навантажень

Іспит CKA часто перевіряє обмеження планування. Вам потрібно вміти використовувати nodeSelector, правила спорідненості (affinity) та taints/tolerations.

Аналогія з організацією заходу

Уявіть планування як розсадження гостей на весіллі. nodeSelector — це «VIP-гості за столом 1». Node affinity — це «бажано ближче до сцени, але будь-де підійде». Taints — це зарезервовані столи з табличкою «Тільки для персоналу». Tolerations — це бейджі персоналу, які дозволяють сидіти за зарезервованими столами. Anti-affinity — це «не садіть колишніх за один стіл».


До кінця цього модуля ви зможете:

  • Використовувати nodeSelector для простого вибору Нод
  • Налаштовувати спорідненість (affinity) та анти-спорідненість (anti-affinity) Нод
  • Застосовувати taints до Нод і tolerations до Подів
  • Розподіляти Поди між доменами топології
  • Діагностувати проблеми з плануванням

1.1 Найпростіший підхід

Розділ «1.1 Найпростіший підхід»

nodeSelector — це найпростіший спосіб обмежити Поди конкретними Нодами:

apiVersion: v1
kind: Pod
metadata:
name: ssd-pod
spec:
nodeSelector:
disk: ssd # Only schedule on nodes with this label
containers:
- name: nginx
image: nginx

1.2 Робота з мітками Нод

Розділ «1.2 Робота з мітками Нод»
Terminal window
# List node labels
kubectl get nodes --show-labels
# Label a node
kubectl label node worker-1 disk=ssd
# Remove a label
kubectl label node worker-1 disk-
# Overwrite a label
kubectl label node worker-1 disk=hdd --overwrite

1.3 Поширені вбудовані мітки

Розділ «1.3 Поширені вбудовані мітки»
МіткаОпис
kubernetes.io/hostnameІм’я хосту Ноди
kubernetes.io/osОпераційна система (linux, windows)
kubernetes.io/archАрхітектура (amd64, arm64)
topology.kubernetes.io/zoneЗона доступності хмари
topology.kubernetes.io/regionРегіон хмари
node.kubernetes.io/instance-typeТип інстансу (хмара)
# Example: Schedule only on Linux nodes
spec:
nodeSelector:
kubernetes.io/os: linux

Чи знали ви?

Ви можете комбінувати кілька міток nodeSelector. Под буде розміщено лише на Нодах, які відповідають УСІМ міткам (логіка І).


Частина 2: Спорідненість Нод (Node Affinity)

Розділ «Частина 2: Спорідненість Нод (Node Affinity)»

2.1 Навіщо спорідненість Нод?

Розділ «2.1 Навіщо спорідненість Нод?»

Спорідненість Нод є виразнішою за nodeSelector:

  • М’які переваги («бажано, але не обов’язково»)
  • Кілька варіантів відповідності (логіка АБО)
  • Оператори (In, NotIn, Exists, DoesNotExist, Gt, Lt)

2.2 Типи спорідненості

Розділ «2.2 Типи спорідненості»
ТипПоведінка
requiredDuringSchedulingIgnoredDuringExecutionЖорстка вимога (як nodeSelector)
preferredDuringSchedulingIgnoredDuringExecutionМ’яка перевага

Ключовий момент: «IgnoredDuringExecution» означає, що якщо мітки зміняться після планування, Под залишиться на місці. Перепланування не відбувається.

2.3 Обов’язкова спорідненість (жорстка)

Розділ «2.3 Обов’язкова спорідненість (жорстка)»
apiVersion: v1
kind: Pod
metadata:
name: affinity-required
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disk
operator: In
values:
- ssd
- nvme
containers:
- name: nginx
image: nginx

2.4 Бажана спорідненість (м’яка)

Розділ «2.4 Бажана спорідненість (м’яка)»
apiVersion: v1
kind: Pod
metadata:
name: affinity-preferred
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 80 # Higher weight = stronger preference
preference:
matchExpressions:
- key: disk
operator: In
values:
- ssd
- weight: 20
preference:
matchExpressions:
- key: zone
operator: In
values:
- us-west-1a
containers:
- name: nginx
image: nginx
ОператорЗначення
InЗначення мітки є в наборі
NotInЗначення мітки не є в наборі
ExistsМітка існує (будь-яке значення)
DoesNotExistМітка не існує
GtБільше ніж (порівняння цілих чисел)
LtМенше ніж (порівняння цілих чисел)
# Example: Node must have "gpu" label with any value
matchExpressions:
- key: gpu
operator: Exists
# Example: Node must NOT be in zone us-east-1c
matchExpressions:
- key: topology.kubernetes.io/zone
operator: NotIn
values:
- us-east-1c

Частина 3: Спорідненість та анти-спорідненість Подів

Розділ «Частина 3: Спорідненість та анти-спорідненість Подів»

3.1 Навіщо спорідненість Подів?

Розділ «3.1 Навіщо спорідненість Подів?»

Керуйте розміщенням Подів відносно інших Подів:

  • Спорідненість Подів: «Розмістити поряд із Подами з міткою X» (сумісне розташування)
  • Анти-спорідненість Подів: «Не розміщувати поряд із Подами з міткою X» (розподілення)

3.2 Приклад спорідненості Подів

Розділ «3.2 Приклад спорідненості Подів»

«Розмістити цей Под на тій самій Ноді, що й Поди з app=cache»:

apiVersion: v1
kind: Pod
metadata:
name: web-pod
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: cache
topologyKey: kubernetes.io/hostname # Same node
containers:
- name: web
image: nginx

3.3 Приклад анти-спорідненості Подів

Розділ «3.3 Приклад анти-спорідненості Подів»

«Не розміщувати на Нодах, де вже є Поди app=web»:

apiVersion: v1
kind: Pod
metadata:
name: web-pod
labels:
app: web
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: web
topologyKey: kubernetes.io/hostname
containers:
- name: web
image: nginx

3.4 Ключ топології (Topology Key)

Розділ «3.4 Ключ топології (Topology Key)»

topologyKey визначає «зону» для спорідненості:

topologyKeyЗначення
kubernetes.io/hostnameТа сама Нода
topology.kubernetes.io/zoneТа сама зона доступності
topology.kubernetes.io/regionТой самий регіон
┌────────────────────────────────────────────────────────────────┐
│ Анти-спорідненість із різними topologyKey │
│ │
│ topologyKey: kubernetes.io/hostname │
│ → Поди розподілені між Нодами (один на Ноду) │
│ │
│ Нода1: [web-1] Нода2: [web-2] Нода3: [web-3] │
│ │
│ topologyKey: topology.kubernetes.io/zone │
│ → Поди розподілені між зонами (один на зону) │
│ │
│ Зона-A Зона-B Зона-C │
│ [web-1] [web-2] [web-3] │
│ Нода1,Нода2 Нода3,Нода4 Нода5,Нода6 │
│ │
└────────────────────────────────────────────────────────────────┘

Порада до іспиту

Для розподілення реплік між Нодами використовуйте анти-спорідненість Подів з topologyKey: kubernetes.io/hostname. Для розподілення між зонами для високої доступності використовуйте topology.kubernetes.io/zone.


Частина 4: Taints і Tolerations

Розділ «Частина 4: Taints і Tolerations»

Taints застосовуються до Нод і відштовхують Поди, якщо Под не має відповідної toleration.

┌────────────────────────────────────────────────────────────────┐
│ Taints і Tolerations │
│ │
│ Нода з taint: gpu=true:NoSchedule │
│ ┌─────────────────────────────────────────────┐ │
│ │ │ │
│ │ Звичайний Под: ❌ Не може бути │ │
│ │ розміщений │ │
│ │ │ │
│ │ Под із відповідною ✅ Може бути │ │
│ │ toleration: розміщений │ │
│ │ │ │
│ └─────────────────────────────────────────────┘ │
│ │
└────────────────────────────────────────────────────────────────┘
ЕфектПоведінка
NoScheduleПоди не будуть розміщені (існуючі Поди залишаються)
PreferNoScheduleМ’яка версія — уникати, але дозволити за необхідності
NoExecuteВитіснити існуючі Поди, запобігти новому розміщенню
Terminal window
# Add taint to node
kubectl taint nodes worker-1 gpu=true:NoSchedule
# View taints
kubectl describe node worker-1 | grep Taints
# Remove taint (note the minus sign)
kubectl taint nodes worker-1 gpu=true:NoSchedule-
# Multiple taints
kubectl taint nodes worker-1 dedicated=ml:NoSchedule
kubectl taint nodes worker-1 gpu=nvidia:NoSchedule

4.4 Додавання Tolerations до Подів

Розділ «4.4 Додавання Tolerations до Подів»
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod
spec:
tolerations:
- key: "gpu"
operator: "Equal"
value: "true"
effect: "NoSchedule"
containers:
- name: cuda-app
image: nvidia/cuda
ОператорЗначення
EqualКлюч і значення мають збігатися
ExistsКлюч існує (будь-яке значення підходить)
# Match specific value
tolerations:
- key: "gpu"
operator: "Equal"
value: "nvidia"
effect: "NoSchedule"
# Match any value for key
tolerations:
- key: "gpu"
operator: "Exists"
effect: "NoSchedule"
# Tolerate all taints (wildcard)
tolerations:
- operator: "Exists"

4.6 Поширені сценарії використання Taint

Розділ «4.6 Поширені сценарії використання Taint»
Сценарій використанняПриклад Taint
GPU-Нодиgpu=true:NoSchedule
Виділені Нодиdedicated=team-a:NoSchedule
Ноди площини управлінняnode-role.kubernetes.io/control-plane:NoSchedule
Виведення Нод з обслуговуванняnode.kubernetes.io/unschedulable:NoSchedule

Історія з практики: зниклі Поди

Один SRE додав taint NoExecute для обслуговування замість NoSchedule. Існуючі Поди були негайно витіснені, що спричинило збій продакшену. Знайте свої ефекти taint! Використовуйте NoSchedule, щоб запобігти новим Подам. Використовуйте NoExecute лише тоді, коли хочете витіснити запущені Поди.


Частина 5: Обмеження розподілу топології Подів

Розділ «Частина 5: Обмеження розподілу топології Подів»

5.1 Навіщо розподіл топології?

Розділ «5.1 Навіщо розподіл топології?»

Рівномірно розподіляйте Поди між доменами відмов:

apiVersion: v1
kind: Pod
metadata:
name: spread-pod
labels:
app: web
spec:
topologySpreadConstraints:
- maxSkew: 1 # Max difference between zones
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule # Hard requirement
labelSelector:
matchLabels:
app: web
containers:
- name: nginx
image: nginx

5.2 Пояснення параметрів

Розділ «5.2 Пояснення параметрів»
ПараметрОпис
maxSkewМаксимально допустима різниця в кількості Подів між доменами
topologyKeyКлюч мітки, що визначає домени (зона, Нода тощо)
whenUnsatisfiableDoNotSchedule (жорстко) або ScheduleAnyway (м’яко)
labelSelectorЯкі Поди враховувати при розподілі
┌────────────────────────────────────────────────────────────────┐
│ Розподіл топології (maxSkew: 1) │
│ │
│ Зона A Зона B Зона C │
│ [под][під] [під] [під] │
│ Кількість: 2 Кількість: 1 Кількість: 1 │
│ │
│ Макс. різниця = 2-1 = 1 ≤ maxSkew ✓ │
│ │
│ Прибуває новий Під — куди його можна розмістити? │
│ Зона A: 3 Поди → різниця 3-1=2 > maxSkew ❌ │
│ Зона B: 2 Поди → різниця 2-1=1 ≤ maxSkew ✓ │
│ Зона C: 2 Поди → різниця 2-1=1 ≤ maxSkew ✓ │
│ │
└────────────────────────────────────────────────────────────────┘

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

Розділ «Частина 6: Послідовність прийняття рішень при плануванні»
┌────────────────────────────────────────────────────────────────┐
│ Послідовність прийняття рішень при плануванні │
│ │
│ Под створено │
│ │ │
│ ▼ │
│ Фільтрація Нод │
│ ├── nodeSelector збігається? │
│ ├── Обов'язкова спорідненість Нод збігається? │
│ ├── Taints допущені? │
│ ├── Ресурси доступні? │
│ ├── Анти-спорідненість Подів задоволена? │
│ └── Обмеження розподілу топології виконані? │
│ │ │
│ ▼ │
│ Оцінка залишених Нод │
│ ├── Бажана спорідненість Нод │
│ ├── Бажана спорідненість Подів │
│ └── Оптимізація ресурсів │
│ │ │
│ ▼ │
│ Вибір Ноди з найвищим балом │
│ │ │
│ ▼ │
│ Прив'язування Поду до Ноди │
│ │
└────────────────────────────────────────────────────────────────┘

Частина 7: Діагностика планування

Розділ «Частина 7: Діагностика планування»

7.1 Поширені проблеми

Розділ «7.1 Поширені проблеми»
СимптомЙмовірна причинаКоманда для діагностики
Pending (без подій)Жодна Нода не відповідає обмеженнямkubectl describe pod
Pending (Insufficient)Брак ресурсівПеревірити ресурси Ноди
Pending (Taints)Немає toleration для taintПеревірити taints Ноди, tolerations Поду
Pending (Affinity)Жодна Нода не відповідає правилам спорідненостіСпростити/прибрати спорідненість

7.2 Команди для діагностики

Розділ «7.2 Команди для діагностики»
Terminal window
# Check pod events
kubectl describe pod <pod-name> | grep -A10 Events
# Check node labels
kubectl get nodes --show-labels
# Check node taints
kubectl describe node <node> | grep Taints
# Check node resources
kubectl describe node <node> | grep -A10 "Allocated resources"
# Simulate scheduling
kubectl get pods -o wide # See where pods landed

  • Ноди площини управління за замовчуванням мають taint node-role.kubernetes.io/control-plane:NoSchedule. Ось чому звичайні Поди там не запускаються.

  • Спорідненості можна комбінувати. Ви можете мати nodeAffinity, podAffinity і podAntiAffinity одночасно на одному Поді.

  • Кілька topologySpreadConstraints об’єднуються через І (AND). Усі обмеження мають бути задоволені.

  • DaemonSets ігнорують taints за замовчуванням для деяких системних taints. Саме так вони працюють на кожній Ноді.


ПомилкаПроблемаРішення
Друкарська помилка в nodeSelectorПод залишається в стані PendingПеревірте, чи мітка існує на цільовій Ноді
Відсутня tolerationПод не може бути розміщений на Ноді з taintДодайте відповідну toleration
Неправильний topologyKeyСпорідненість працює не так, як очікувалосяВикористовуйте правильний ключ мітки
NoExecute замість NoScheduleПоди несподівано витісненіВикористовуйте NoSchedule лише для нових Подів
Занадто строга анти-спорідненістьНедостатньо Нод для всіх реплікВикористовуйте preferred або зменшіть кількість реплік

  1. Яка різниця між nodeSelector і спорідненістю Нод (node affinity)?

    Відповідь **nodeSelector** — це просте зіставлення ключ-значення (логіка І, мають збігатися всі). **Спорідненість Нод** є виразнішою: з операторами (In, NotIn, Exists), м'якими перевагами та кількома варіантами (логіка АБО в nodeSelectorTerms).
  2. Нода має taint gpu=nvidia:NoSchedule. Що повинен мати Под, щоб бути розміщеним там?

    Відповідь Toleration, що відповідає taint: ```yaml tolerations: - key: "gpu" operator: "Equal" value: "nvidia" effect: "NoSchedule" ``` Або використайте `operator: Exists`, щоб відповідати будь-якому значенню.
  3. Що означає topologyKey: kubernetes.io/hostname в анти-спорідненості Подів?

    Відповідь Це означає «розподілити Поди між різними Нодами». Кожне ім'я хосту Ноди є окремим доменом топології. Правило анти-спорідненості запобігає запуску Подів із відповідними мітками на одній Ноді.
  4. Під у стані Pending з подією «0/3 nodes are available: 1 node(s) had taint». Що не так?

    Відповідь Под не має tolerations для taint принаймні однієї Ноди. Або додайте відповідну toleration до Поду, або видаліть taint з Ноди.

Завдання: Попрактикуйте всі техніки планування.

Кроки:

  1. Додайте мітку Ноді та використайте nodeSelector:
Terminal window
# Get a node name
NODE=$(kubectl get nodes -o jsonpath='{.items[0].metadata.name}')
# Label the node
kubectl label node $NODE disk=ssd
# Create pod with nodeSelector
cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: ssd-pod
spec:
nodeSelector:
disk: ssd
containers:
- name: nginx
image: nginx
EOF
# Verify placement
kubectl get pod ssd-pod -o wide
# Cleanup
kubectl delete pod ssd-pod
kubectl label node $NODE disk-

Частина B: Taints і Tolerations

Розділ «Частина B: Taints і Tolerations»
  1. Додайте taint та створіть Под з toleration:
Terminal window
# Taint the node
kubectl taint nodes $NODE dedicated=special:NoSchedule
# Try to create pod without toleration
kubectl run no-toleration --image=nginx
# Check - should be Pending or on different node
kubectl get pod no-toleration -o wide
# Create pod with toleration
cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: with-toleration
spec:
tolerations:
- key: "dedicated"
operator: "Equal"
value: "special"
effect: "NoSchedule"
containers:
- name: nginx
image: nginx
EOF
# Verify placement
kubectl get pod with-toleration -o wide
# Cleanup
kubectl delete pod no-toleration with-toleration
kubectl taint nodes $NODE dedicated-

Частина C: Анти-спорідненість Подів

Розділ «Частина C: Анти-спорідненість Подів»
  1. Розподіліть Поди між Нодами:
Terminal window
cat << EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: spread-deploy
spec:
replicas: 3
selector:
matchLabels:
app: spread
template:
metadata:
labels:
app: spread
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
app: spread
topologyKey: kubernetes.io/hostname
containers:
- name: nginx
image: nginx
EOF
# Check pod distribution
kubectl get pods -l app=spread -o wide
# Cleanup
kubectl delete deployment spread-deploy

Критерії успіху:

  • Вмієте використовувати nodeSelector
  • Вмієте додавати/видаляти taints Нод
  • Вмієте додавати tolerations до Подів
  • Розумієте спорідненість та анти-спорідненість
  • Вмієте діагностувати проблеми з плануванням

Вправа 1: nodeSelector (Ціль: 3 хвилини)

Розділ «Вправа 1: nodeSelector (Ціль: 3 хвилини)»
Terminal window
NODE=$(kubectl get nodes -o jsonpath='{.items[0].metadata.name}')
# Label node
kubectl label node $NODE env=production
# Create pod with nodeSelector
kubectl run selector-test --image=nginx --dry-run=client -o yaml | \
kubectl patch --dry-run=client -o yaml -f - \
-p '{"spec":{"nodeSelector":{"env":"production"}}}' | kubectl apply -f -
# Or simpler - just use YAML
cat << 'EOF' | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: selector-test
spec:
nodeSelector:
env: production
containers:
- name: nginx
image: nginx
EOF
# Verify
kubectl get pod selector-test -o wide
# Cleanup
kubectl delete pod selector-test
kubectl label node $NODE env-

Вправа 2: Taints (Ціль: 5 хвилин)

Розділ «Вправа 2: Taints (Ціль: 5 хвилин)»
Terminal window
NODE=$(kubectl get nodes -o jsonpath='{.items[0].metadata.name}')
# Add taint
kubectl taint nodes $NODE app=critical:NoSchedule
# View taint
kubectl describe node $NODE | grep Taints
# Pod without toleration - will be Pending or elsewhere
kubectl run no-tol --image=nginx
kubectl get pod no-tol -o wide
# Pod with toleration
cat << 'EOF' | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: with-tol
spec:
tolerations:
- key: "app"
operator: "Equal"
value: "critical"
effect: "NoSchedule"
containers:
- name: nginx
image: nginx
EOF
kubectl get pod with-tol -o wide
# Cleanup
kubectl delete pod no-tol with-tol
kubectl taint nodes $NODE app-

Вправа 3: Спорідненість Нод (Ціль: 5 хвилин)

Розділ «Вправа 3: Спорідненість Нод (Ціль: 5 хвилин)»
Terminal window
NODE=$(kubectl get nodes -o jsonpath='{.items[0].metadata.name}')
kubectl label node $NODE size=large
cat << 'EOF' | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: affinity-test
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: size
operator: In
values:
- large
- xlarge
containers:
- name: nginx
image: nginx
EOF
kubectl get pod affinity-test -o wide
# Cleanup
kubectl delete pod affinity-test
kubectl label node $NODE size-

Вправа 4: Анти-спорідненість Подів (Ціль: 5 хвилин)

Розділ «Вправа 4: Анти-спорідненість Подів (Ціль: 5 хвилин)»
Terminal window
cat << 'EOF' | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: anti-affinity
spec:
replicas: 3
selector:
matchLabels:
app: anti-test
template:
metadata:
labels:
app: anti-test
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: anti-test
topologyKey: kubernetes.io/hostname
containers:
- name: nginx
image: nginx
EOF
# Check distribution (each pod on different node)
kubectl get pods -l app=anti-test -o wide
# Cleanup
kubectl delete deployment anti-affinity

Вправа 5: Діагностика — Під у стані Pending (Ціль: 5 хвилин)

Розділ «Вправа 5: Діагностика — Під у стані Pending (Ціль: 5 хвилин)»
Terminal window
NODE=$(kubectl get nodes -o jsonpath='{.items[0].metadata.name}')
# Create impossible scenario
kubectl taint nodes $NODE impossible=true:NoSchedule
cat << 'EOF' | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: pending-pod
spec:
nodeSelector:
nonexistent: label
containers:
- name: nginx
image: nginx
EOF
# Diagnose
kubectl get pod pending-pod
kubectl describe pod pending-pod | grep -A10 Events
# YOUR TASK: Why is it Pending? Fix it.
# Cleanup
kubectl delete pod pending-pod
kubectl taint nodes $NODE impossible-
Відповідь

Под у стані Pending з двох причин:

  1. nodeSelector вимагає мітку nonexistent=label, якої немає на жодній Ноді
  2. Усі Ноди мають taint, який Под не допускає

Виправте одним із способів:

  • Додайте мітку до Ноди: kubectl label node $NODE nonexistent=label
  • Додайте toleration та видаліть nodeSelector

Вправа 6: Виклик — складне планування

Розділ «Вправа 6: Виклик — складне планування»

Створіть Под, який:

  1. Повинен працювати на Нодах із міткою tier=frontend
  2. Бажано на Нодах із міткою zone=us-east-1a
  3. Допускає taint frontend=true:NoSchedule
Terminal window
# YOUR TASK: Create this pod
Відповідь
Terminal window
NODE=$(kubectl get nodes -o jsonpath='{.items[0].metadata.name}')
kubectl label node $NODE tier=frontend zone=us-east-1a
kubectl taint nodes $NODE frontend=true:NoSchedule
cat << 'EOF' | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: complex-schedule
spec:
tolerations:
- key: "frontend"
operator: "Equal"
value: "true"
effect: "NoSchedule"
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: tier
operator: In
values:
- frontend
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
preference:
matchExpressions:
- key: zone
operator: In
values:
- us-east-1a
containers:
- name: nginx
image: nginx
EOF
kubectl get pod complex-schedule -o wide
# Cleanup
kubectl delete pod complex-schedule
kubectl label node $NODE tier- zone-
kubectl taint nodes $NODE frontend-

Модуль 2.7: ConfigMaps і Secrets — Управління конфігурацією застосунків.