← К программе курса

Модуль 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