← До програми курсу

Модуль 2 / 19

Kubernetes API, kubectl і життєвий цикл об’єктів

KUBERNETES

Зміст
01

1. Цілі модуля

Після модуля ви зможете читати Kubernetes API як контракт, обирати підтримувану версію ресурсу, розрізняти spec і status, безпечно застосовувати маніфести та діагностувати невдалий rollout за станом об’єктів.

  • Discovery замість вгадування apiVersion
  • структуроване читання об’єктів
  • server-side validation до зміни кластера
  • Server-Side Apply і володіння полями
02

2. Теорія: Kubernetes API як контракт

kubectl, контролери, scheduler, kubelet та оператори працюють з API Server. Тип ресурсу задають API group, version і kind; екземпляр додатково визначають namespace та name.

spec описує бажаний стан, status публікують контролери. metadata.generation змінюється разом зі spec, а status.observedGeneration показує вже оброблену контролером ревізію.

terminal
kubectl api-resources
kubectl api-versions
kubectl explain deployment.spec.strategy
kubectl get --raw /api
kubectl get --raw /apis
03

3. Теорія: Discovery та версії API

Не вгадуйте apiVersion з пам’яті: Discovery API показує ресурси конкретного кластера. Перед upgrade перевіряйте deprecation guide та видалені API цільової версії.

  • core-група записується як v1
  • alpha API може зникнути без періоду сумісності
  • beta API має обмежені гарантії
  • GA API надає найсуворіші гарантії сумісності
04

4. Теорія: анатомія об’єкта

metadata ідентифікує об’єкт, spec задає намір, status відображає результат. Selector пов’язує Deployment з Pods, після створення є незмінним і має збігатися з template labels.

terminal
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  namespace: lab-api
spec:
  replicas: 2
  selector:
    matchLabels:
      app.kubernetes.io/name: web
  template:
    metadata:
      labels:
        app.kubernetes.io/name: web
    spec:
      containers:
        - name: nginx
          image: nginx:1.28-alpine
          ports:
            - name: http
              containerPort: 80
05

5. Теорія: Apply та володіння полями

Server-Side Apply записує managedFields і виявляє конфлікти власників. field-manager має стабільно ідентифікувати автоматизацію. У production маніфест зберігається в Git; kubectl edit та несистемний patch створюють drift.

terminal
kubectl apply --server-side --field-manager=course-lab -f deployment.yaml
kubectl get deploy web -n lab-api -o json | jq '.metadata.managedFields[] | {manager,operation}'
kubectl diff -f deployment.yaml
06

6. Методичні вказівки

  • Перед зміною перевіряйте context і namespace
  • Спочатку використовуйте kubectl diff та --dry-run=server
  • Для скриптів обирайте JSON, jsonpath або Go template
  • get показує об’єкт, describe додає Events, logs читає контейнер
  • Не застосовуйте --force-conflicts, доки не встановили власника поля
07

7. Лабораторна робота: досліджуємо API

Визначте групи й версії ресурсів свого кластера. Потім збережіть маніфест як deployment.yaml і дослідіть схему полів через kubectl explain.

terminal
kubectl api-resources
kubectl api-versions
kubectl explain deployment.spec.strategy
kubectl get --raw /api
kubectl get --raw /apis
terminal
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  namespace: lab-api
spec:
  replicas: 2
  selector:
    matchLabels:
      app.kubernetes.io/name: web
  template:
    metadata:
      labels:
        app.kubernetes.io/name: web
    spec:
      containers:
        - name: nginx
          image: nginx:1.28-alpine
          ports:
            - name: http
              containerPort: 80
08

8. Лабораторна робота: створюємо й спостерігаємо об’єкт

Створіть namespace, застосуйте Deployment через Server-Side Apply, дочекайтеся rollout і збільшіть desired replicas до трьох.

terminal
kubectl create namespace lab-api
kubectl apply --server-side --field-manager=course-lab -f deployment.yaml
kubectl rollout status deployment/web -n lab-api --timeout=120s
kubectl scale deployment/web -n lab-api --replicas=3
kubectl get pods -n lab-api -w
terminal
kubectl get deploy,pods -n lab-api -o wide
kubectl get deploy web -n lab-api -o yaml
kubectl describe deploy web -n lab-api
kubectl events -n lab-api --for deployment/web

Критерій: Available=True, observedGeneration дорівнює generation, доступні три Pod, а managedFields містить manager course-lab.

09

9. Діагностика відмови

Установіть неіснуючий image tag. Timeout rollout очікуваний: спочатку зберіть evidence, потім виконайте rollback та очищення.

terminal
kubectl set image deployment/web nginx=nginx:does-not-exist -n lab-api
kubectl rollout status deployment/web -n lab-api --timeout=30s
kubectl get pods -n lab-api
kubectl events -n lab-api --types=Warning
kubectl rollout undo deployment/web -n lab-api
kubectl rollout status deployment/web -n lab-api --timeout=120s
kubectl delete namespace lab-api

Порядок: перевірити context і namespacegeneration → Conditions Deployment → стани Pod → Warning Events → мінімальна оборотна зміна.

10

10. Контроль і шпаргалка

  • Чим ресурс відрізняється від об’єкта?
  • Чому status не можна зберігати як бажаний стан у Git?
  • Що показує observedGeneration?
  • Навіщо потрібен server-side dry-run?
  • Як managedFields допомагає під час конфлікту?

Модуль засвоєно, якщо ви знаходите ресурс через Discovery, пояснюєте GVK та identity об’єкта, перевіряєте зміну до apply і доводите причину невдалого rollout даними API.

PDF для роботи офлайн

Завантажте оформлену версію модуля для читання без підключення до мережі.

Завантажити PDFPDF