Какие ключевые сущности (ресурсы) существуют в Kubernetes?

«Какие ключевые сущности (ресурсы) существуют в Kubernetes?» — вопрос из категории DevOps, который задают на 22% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Kubernetes оперирует объектами (ресурсами), которые описывают состояние кластера. Основные из них:

1. Pod

Минимальная и неделимая единица развертывания. Контейнер (или несколько тесно связанных контейнеров), которые разделяют:

  • Сетевое пространство (один IP-адрес).
  • Тома хранения данных (Volumes).

2. Deployment

Декларативный объект для управления Pod'ами. Обеспечивает:

  • Обновление версий (rolling update).
  • Откат на предыдущую версию (rollback).
  • Масштабирование количества реплик Pod'ов.

3. Service

Абстракция для доступа к набору Pod'ов. Определяет стабильную конечную точку (IP и DNS-имя). Типы:

  • ClusterIP — внутренний IP (доступ только внутри кластера).
  • NodePort — открывает порт на каждой ноде кластера.
  • LoadBalancer — создает внешний балансировщик нагрузки (в облачных провайдерах).

4. ConfigMap & Secret

  • ConfigMap — хранит конфигурационные данные в виде пар «ключ-значение» (например, настройки приложения).
  • Secret — аналогичен ConfigMap, но предназначен для хранения чувствительных данных (пароли, токены) в закодированном виде (base64).

5. Volume & PersistentVolume (PV) / PersistentVolumeClaim (PVC)

  • Volume — механизм хранения данных, живущий пока жив Pod.
  • PersistentVolume (PV) — ресурс хранения в кластере (например, диск в облаке).
  • PersistentVolumeClaim (PVC) — запрос пользователя на выделение PV определенного размера и типа.

6. Namespace

Виртуальный кластер внутри физического. Позволяет делить ресурсы кластера между командами или окружениями (dev, staging, prod).

7. Ingress

Управляет внешним HTTP/HTTPS доступом к сервисам внутри кластера. Обеспечивает маршрутизацию на основе хоста или пути.

Пример манифеста Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3 # Количество идентичных Pod'ов
  selector:
    matchLabels:
      app: nginx # Выбирает Pod'ы с этим лейблом
  template: # Шаблон для создания Pod'ов
    metadata:
      labels:
        app: nginx # Лейбл для этого Pod'а
    spec:
      containers:
      - name: nginx
        image: nginx:1.21-alpine
        ports:
        - containerPort: 80