Модуль 3.5: Застарівання API
Складність:
[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Групи API
Розділ «Групи API»# Основна група (без префікса)apiVersion: v1kind: Pod
# Іменовані групиapiVersion: apps/v1kind: Deployment
apiVersion: networking.k8s.io/v1kind: Ingress
apiVersion: batch/v1kind: JobТипові застарівання
Розділ «Типові застарівання»Історичні приклади
Розділ «Історичні приклади»| Старий API | Поточний API | Видалено у |
|---|---|---|
extensions/v1beta1 Ingress | networking.k8s.io/v1 | 1.22 |
apps/v1beta1 Deployment | apps/v1 | 1.16 |
rbac.authorization.k8s.io/v1beta1 | rbac.authorization.k8s.io/v1 | 1.22 |
networking.k8s.io/v1beta1 IngressClass | networking.k8s.io/v1 | 1.22 |
batch/v1beta1 CronJob | batch/v1 | 1.25 |
policy/v1beta1 PodSecurityPolicy | Видалено (використовуйте Pod Security Admission) | 1.25 |
Поточне середовище іспиту
Розділ «Поточне середовище іспиту»Іспит CKAD використовує нещодавні версії Kubernetes. Більшість beta API вже видалено. Завжди використовуйте стабільні (v1) версії.
Пошук правильних версій API
Розділ «Пошук правильних версій API»Перелік ресурсів API
Розділ «Перелік ресурсів API»# Усі ресурси з версіями APIk api-resources
# Конкретний ресурсk api-resources | grep -i deployment# Вивід: deployments deploy apps/v1 true Deployment
# З короткими назвамиk api-resources --sort-by=nameКоманда Explain
Розділ «Команда Explain»# Отримати версію API для ресурсуk explain deploymentk explain ingress# Вивід показує: VERSION: networking.k8s.io/v1
k explain cronjob# Вивід показує: VERSION: batch/v1Перегляд наявних об’єктів
Розділ «Перегляд наявних об’єктів»# Побачити, яку версію використовують наявні об'єктиk get deployment nginx -o yaml | head -5# kind: DeploymentПеревірка на застарілі API
Розділ «Перевірка на застарілі API»kubectl Convert (якщо доступний)
Розділ «kubectl Convert (якщо доступний)»# Конвертувати старий маніфест у новий APIkubectl convert -f old-deployment.yaml --output-version apps/v1Примітка: kubectl convert може бути недоступний у всіх середовищах.
Ручна перевірка
Розділ «Ручна перевірка»# Перевірити, що використовує маніфестhead -5 my-manifest.yaml
# Порівняти з поточним APIk api-resources | grep -i <resource-type>Попередження API Server
Розділ «Попередження API Server»Коли ви застосовуєте застарілий API, сервер попереджає:
$ k apply -f old-ingress.yamlWarning: 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/v1beta1kind: Ingressmetadata: name: my-ingressspec: rules: - host: example.com http: paths: - path: / backend: serviceName: my-service servicePort: 80Новий (поточний):
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: my-ingressspec: rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: my-service port: number: 80Ключові зміни, які часто потрібні
Розділ «Ключові зміни, які часто потрібні»- apiVersion — Оновити до стабільної версії
- Структура spec — Може змінюватися між версіями
- Нові обов’язкові поля — Як
pathTypeдля Ingress
Стратегія для іспиту
Розділ «Стратегія для іспиту»Перед написанням YAML
Розділ «Перед написанням YAML»# Завжди спочатку перевіряйте поточну версію APIk explain <resource>
# Прикладk explain ingressk explain cronjobk explain networkpolicyШвидка довідка для типових ресурсів
Розділ «Швидка довідка для типових ресурсів»| Ресурс | Поточний apiVersion |
|---|---|
| Pod | v1 |
| Service | v1 |
| ConfigMap | v1 |
| Secret | v1 |
| Deployment | apps/v1 |
| StatefulSet | apps/v1 |
| DaemonSet | apps/v1 |
| Job | batch/v1 |
| CronJob | batch/v1 |
| Ingress | networking.k8s.io/v1 |
| NetworkPolicy | networking.k8s.io/v1 |
| Role/RoleBinding | rbac.authorization.k8s.io/v1 |
| ClusterRole/ClusterRoleBinding | rbac.authorization.k8s.io/v1 |
Політика застарівання
Розділ «Політика застарівання»Гарантії Kubernetes
Розділ «Гарантії Kubernetes»- Beta API оголошуються застарілими щонайменше за 3 випуски перед видаленням
- Стабільні API майже ніколи не видаляються (лише при зміні мажорної версії)
- Попередження про застарівання показуються у відповідях 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 |
| Ігнорування попереджень про застарівання | Маніфести зламаються після оновлення | Оновлюйте негайно |
| Незнання поточних версій | Витрата часу на іспиті | Запам’ятайте типові ресурси |
Тест
Розділ «Тест»-
Як знайти поточну версію API для ресурсу?
Відповідь
`kubectl explain` або `kubectl api-resources | grep ` -
Яка поточна apiVersion для Ingress?
Відповідь
`networking.k8s.io/v1` -
Яка поточна apiVersion для CronJob?
Відповідь
`batch/v1` -
Що станеться, якщо використати видалену версію API?
Відповідь
API server поверне помилку, і ресурс не вдасться створити/оновити.
Практична вправа
Розділ «Практична вправа»Завдання: Попрактикуватися у пошуку та використанні правильних версій API.
Частина 1: Дослідження версій API
# Перелічити всі ресурси APIk api-resources | head -20
# Знайти конкретні ресурсиk api-resources | grep -i deploymentk api-resources | grep -i ingressk api-resources | grep -i cronjob
# Використати explaink explain deploymentk explain ingressk explain cronjobЧастина 2: Створення ресурсів з правильними API
# Створити 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: Перевірка наявних ресурсів
# Перевірити, яку версію використовують наявні ресурсиk get deployments -A -o jsonpath='{range .items[*]}{.apiVersion}{"\t"}{.metadata.name}{"\n"}{end}'Практичні вправи
Розділ «Практичні вправи»Вправа 1: Ресурси API (Ціль: 2 хвилини)
Розділ «Вправа 1: Ресурси API (Ціль: 2 хвилини)»# Знайти версію API для різних ресурсівk explain pod | head -5k explain service | head -5k explain deployment | head -5k explain ingress | head -5k explain networkpolicy | head -5Вправа 2: Перелік ресурсів API (Ціль: 2 хвилини)
Розділ «Вправа 2: Перелік ресурсів API (Ціль: 2 хвилини)»# Перелічити ресурси та їхні групиk api-resources --sort-by=name | grep -E "^NAME|deployment|ingress|job|cronjob"Вправа 3: Генерація правильного YAML (Ціль: 3 хвилини)
Розділ «Вправа 3: Генерація правильного YAML (Ціль: 3 хвилини)»# Згенерувати маніфести та перевірити версії API
# Deploymentk create deploy drill3-deploy --image=nginx --dry-run=client -o yaml | grep apiVersion
# Jobk create job drill3-job --image=busybox -- echo done --dry-run=client -o yaml | grep apiVersion
# CronJobk create cronjob drill3-cron --image=busybox --schedule="* * * * *" -- echo hi --dry-run=client -o yaml | grep apiVersionВправа 4: Визначення груп ресурсів (Ціль: 2 хвилини)
Розділ «Вправа 4: Визначення груп ресурсів (Ціль: 2 хвилини)»# До якої групи належить кожен?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.
# Потрібні ресурси: 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
Розділ «Підсумок Частини 3»Ви завершили розділ «Спостережуваність та обслуговування застосунків»:
- Модуль 3.1: Проби — Перевірка стану з liveness, readiness, startup
- Модуль 3.2: Логування — Доступ до логів контейнерів
- Модуль 3.3: Налагодження — Системний процес усунення несправностей
- Модуль 3.4: Моніторинг — Використання ресурсів з kubectl top
- Модуль 3.5: Застарівання API — Використання поточних версій API
Наступні кроки
Розділ «Наступні кроки»Пройдіть Кумулятивний тест Частини 3, щоб перевірити своє розуміння, а потім переходьте до Частина 4: Середовище, конфігурація та безпека застосунків.