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

Модуль 3.5: Застарівання API

Hands-On Lab Available
K8s Cluster intermediate 30 min
Launch Lab ↗

Opens in Killercoda in a new tab

Складність: [QUICK] — Концептуальне розуміння з практичними командами

Час на виконання: 20–25 хвилин

Передумови: Розуміння версіювання API Kubernetes


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

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

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

  • Діагностувати невдалий kubectl apply, спричинений видаленим API, і виправити його менш ніж за 2 хвилини
  • Визначити правильну версію API для будь-якого ресурсу за допомогою kubectl explain та kubectl api-resources
  • Оновити застарілий маніфест до поточної версії API, включно зі структурними змінами
  • Пояснити політику застарівання Kubernetes та які гарантії вона надає

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

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

Kubernetes розвивається стрімко. API, які працюють сьогодні, можуть бути оголошені застарілими завтра і видалені в майбутніх версіях. Розуміння застарівання API запобігає зламаним маніфестам та невдалим розгортанням.

Іспит CKAD перевіряє:

  • Обізнаність про застарілі API
  • Як визначити версії API для ресурсів
  • Оновлення маніфестів для використання поточних API

Аналогія з ремонтом дороги

Застарівання API — як ремонт дороги. Спочатку знаки попереджають, що дорогу закриють (застарівання). У вас є час знайти альтернативні маршрути (нова версія API). Врешті-решт стара дорога повністю закривається (видалення API). Якщо ви ігноруєте попередження — залишитесь ні з чим, коли дорога зникне.


Основи версіювання API

Розділ «Основи версіювання API»
ЕтапЗначенняСтабільність
alpha (v1alpha1)Експериментальний, може змінитися або зникнутиНестабільний
beta (v1beta1)Функціонально завершений, може змінитисяПереважно стабільний
stable (v1, v2)Готовий до продакшну, зворотно суміснийСтабільний
v1alpha1 → v1alpha2 → v1beta1 → v1beta2 → v1
# Основна група (без префікса)
apiVersion: v1
kind: Pod
# Іменовані групи
apiVersion: apps/v1
kind: Deployment
apiVersion: networking.k8s.io/v1
kind: Ingress
apiVersion: batch/v1
kind: Job

Типові застарівання

Розділ «Типові застарівання»

Історичні приклади

Розділ «Історичні приклади»
Старий APIПоточний APIВидалено у
extensions/v1beta1 Ingressnetworking.k8s.io/v11.22
apps/v1beta1 Deploymentapps/v11.16
rbac.authorization.k8s.io/v1beta1rbac.authorization.k8s.io/v11.22
networking.k8s.io/v1beta1 IngressClassnetworking.k8s.io/v11.22
batch/v1beta1 CronJobbatch/v11.25
policy/v1beta1 PodSecurityPolicyВидалено (використовуйте Pod Security Admission)1.25

Поточне середовище іспиту

Розділ «Поточне середовище іспиту»

Іспит CKAD використовує нещодавні версії Kubernetes. Більшість beta API вже видалено. Завжди використовуйте стабільні (v1) версії.


Пошук правильних версій API

Розділ «Пошук правильних версій API»

Перелік ресурсів API

Розділ «Перелік ресурсів API»
Terminal window
# Усі ресурси з версіями API
k api-resources
# Конкретний ресурс
k api-resources | grep -i deployment
# Вивід: deployments deploy apps/v1 true Deployment
# З короткими назвами
k api-resources --sort-by=name
apps/v1
# Отримати версію API для ресурсу
k explain deployment
k explain ingress
# Вивід показує: VERSION: networking.k8s.io/v1
k explain cronjob
# Вивід показує: VERSION: batch/v1

Перегляд наявних об’єктів

Розділ «Перегляд наявних об’єктів»
apps/v1
# Побачити, яку версію використовують наявні об'єкти
k get deployment nginx -o yaml | head -5
# kind: Deployment

Перевірка на застарілі API

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

kubectl Convert (якщо доступний)

Розділ «kubectl Convert (якщо доступний)»
Terminal window
# Конвертувати старий маніфест у новий API
kubectl convert -f old-deployment.yaml --output-version apps/v1

Примітка: kubectl convert може бути недоступний у всіх середовищах.

Terminal window
# Перевірити, що використовує маніфест
head -5 my-manifest.yaml
# Порівняти з поточним API
k api-resources | grep -i <resource-type>

Попередження API Server

Розділ «Попередження API Server»

Коли ви застосовуєте застарілий API, сервер попереджає:

Terminal window
$ k apply -f old-ingress.yaml
Warning: networking.k8s.io/v1beta1 Ingress is deprecated in v1.19+,
unavailable in v1.22+; use networking.k8s.io/v1 Ingress

Оновлення маніфестів

Розділ «Оновлення маніфестів»

Приклад: Оновлення Ingress

Розділ «Приклад: Оновлення Ingress»

Старий (застарілий):

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /
backend:
serviceName: my-service
servicePort: 80

Новий (поточний):

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80

Ключові зміни, які часто потрібні

Розділ «Ключові зміни, які часто потрібні»
  1. apiVersion — Оновити до стабільної версії
  2. Структура spec — Може змінюватися між версіями
  3. Нові обов’язкові поля — Як pathType для Ingress

Стратегія для іспиту

Розділ «Стратегія для іспиту»

Перед написанням YAML

Розділ «Перед написанням YAML»
Terminal window
# Завжди спочатку перевіряйте поточну версію API
k explain <resource>
# Приклад
k explain ingress
k explain cronjob
k explain networkpolicy

Швидка довідка для типових ресурсів

Розділ «Швидка довідка для типових ресурсів»
РесурсПоточний apiVersion
Podv1
Servicev1
ConfigMapv1
Secretv1
Deploymentapps/v1
StatefulSetapps/v1
DaemonSetapps/v1
Jobbatch/v1
CronJobbatch/v1
Ingressnetworking.k8s.io/v1
NetworkPolicynetworking.k8s.io/v1
Role/RoleBindingrbac.authorization.k8s.io/v1
ClusterRole/ClusterRoleBindingrbac.authorization.k8s.io/v1

Політика застарівання

Розділ «Політика застарівання»
  1. Beta API оголошуються застарілими щонайменше за 3 випуски перед видаленням
  2. Стабільні API майже ніколи не видаляються (лише при зміні мажорної версії)
  3. Попередження про застарівання показуються у відповідях API server

Приклад хронології

Розділ «Приклад хронології»
1.19: v1beta1 оголошено застарілим (попередження)
1.20: v1beta1 ще працює (попередження продовжується)
1.21: v1beta1 ще працює (попередження продовжується)
1.22: v1beta1 ВИДАЛЕНО (помилка при використанні)

  • PodSecurityPolicy було повністю видалено в Kubernetes 1.25. Його замінив Pod Security Admission, який працює по-іншому.

  • Плагін kubectl convert може конвертувати між версіями API, але він не встановлений типово і може бути відсутній на іспиті.

  • CRD можуть мати власний графік застарівання, встановлений оператором/постачальником, який їх створив.

  • Запуск kubectl apply із застарілими API все ще працює до видалення, але щоразу ви отримуватимете попередження.


ПомилкаЧому це шкодитьРішення
Використання beta API у нових маніфестахЗламається в майбутньомуЗавжди використовуйте стабільні v1
Копіювання старих прикладів з інтернетуЗастарілі APIПеревіряйте версію через k explain
Ігнорування попереджень про застаріванняМаніфести зламаються після оновленняОновлюйте негайно
Незнання поточних версійВитрата часу на іспитіЗапам’ятайте типові ресурси

  1. Як знайти поточну версію API для ресурсу?

    Відповідь `kubectl explain ` або `kubectl api-resources | grep `
  2. Яка поточна apiVersion для Ingress?

    Відповідь `networking.k8s.io/v1`
  3. Яка поточна apiVersion для CronJob?

    Відповідь `batch/v1`
  4. Що станеться, якщо використати видалену версію API?

    Відповідь API server поверне помилку, і ресурс не вдасться створити/оновити.

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

Частина 1: Дослідження версій API

Terminal window
# Перелічити всі ресурси API
k api-resources | head -20
# Знайти конкретні ресурси
k api-resources | grep -i deployment
k api-resources | grep -i ingress
k api-resources | grep -i cronjob
# Використати explain
k explain deployment
k explain ingress
k explain cronjob

Частина 2: Створення ресурсів з правильними API

Terminal window
# Створити Deployment (apps/v1)
k create deploy api-test --image=nginx --dry-run=client -o yaml | head -10
# Згенерувати CronJob (batch/v1)
k create cronjob api-cron --image=busybox --schedule="*/5 * * * *" -- echo hello --dry-run=client -o yaml | head -10

Частина 3: Перевірка наявних ресурсів

Terminal window
# Перевірити, яку версію використовують наявні ресурси
k get deployments -A -o jsonpath='{range .items[*]}{.apiVersion}{"\t"}{.metadata.name}{"\n"}{end}'

Вправа 1: Ресурси API (Ціль: 2 хвилини)

Розділ «Вправа 1: Ресурси API (Ціль: 2 хвилини)»
Terminal window
# Знайти версію API для різних ресурсів
k explain pod | head -5
k explain service | head -5
k explain deployment | head -5
k explain ingress | head -5
k explain networkpolicy | head -5

Вправа 2: Перелік ресурсів API (Ціль: 2 хвилини)

Розділ «Вправа 2: Перелік ресурсів API (Ціль: 2 хвилини)»
Terminal window
# Перелічити ресурси та їхні групи
k api-resources --sort-by=name | grep -E "^NAME|deployment|ingress|job|cronjob"

Вправа 3: Генерація правильного YAML (Ціль: 3 хвилини)

Розділ «Вправа 3: Генерація правильного YAML (Ціль: 3 хвилини)»
Terminal window
# Згенерувати маніфести та перевірити версії API
# Deployment
k create deploy drill3-deploy --image=nginx --dry-run=client -o yaml | grep apiVersion
# Job
k create job drill3-job --image=busybox -- echo done --dry-run=client -o yaml | grep apiVersion
# CronJob
k create cronjob drill3-cron --image=busybox --schedule="* * * * *" -- echo hi --dry-run=client -o yaml | grep apiVersion

Вправа 4: Визначення груп ресурсів (Ціль: 2 хвилини)

Розділ «Вправа 4: Визначення груп ресурсів (Ціль: 2 хвилини)»
Terminal window
# До якої групи належить кожен?
k api-resources | grep -E "^NAME|^deployments|^services|^ingresses|^networkpolicies"
# Очікувано:
# deployments - apps
# services - core (без групи)
# ingresses - networking.k8s.io
# networkpolicies - networking.k8s.io

Вправа 5: Повний пошук версій (Ціль: 3 хвилини)

Розділ «Вправа 5: Повний пошук версій (Ціль: 3 хвилини)»

Сценарій: Вам потрібно написати YAML для кількох ресурсів. Знайдіть правильні версії API.

Terminal window
# Потрібні ресурси: Deployment, Service, Ingress, ConfigMap, Secret, NetworkPolicy
# Швидкий пошук
for res in deployment service ingress configmap secret networkpolicy; do
echo -n "$res: "
k explain $res 2>/dev/null | grep "VERSION:" | awk '{print $2}'
done

Ви завершили розділ «Спостережуваність та обслуговування застосунків»:

  • Модуль 3.1: Проби — Перевірка стану з liveness, readiness, startup
  • Модуль 3.2: Логування — Доступ до логів контейнерів
  • Модуль 3.3: Налагодження — Системний процес усунення несправностей
  • Модуль 3.4: Моніторинг — Використання ресурсів з kubectl top
  • Модуль 3.5: Застарівання API — Використання поточних версій API

Пройдіть Кумулятивний тест Частини 3, щоб перевірити своє розуміння, а потім переходьте до Частина 4: Середовище, конфігурація та безпека застосунків.