Какие основные сущности (ресурсы) в Kubernetes вы используете в работе и для чего?

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

Ответ

В ежедневной работе с Kubernetes мы оперируем набором основных ресурсов для развёртывания, управления и поддержки приложений.

Основные рабочие сущности:

  1. Pod

    • Для чего: Минимальная deployable unit. В реальности редко создаём Pod напрямую, используем контроллеры.
    • Пример из практики: Pod с sidecar-контейнером (например, fluentd для сбора логов или vault-agent для инжекта секретов).
  2. Deployment

    • Для чего: Основной ресурс для stateless-приложений. Управляет репликами Pod'ов, обеспечивает rolling updates и rollbacks.
    • Практика: Всегда настраиваем readinessProbe и livenessProbe.
      apiVersion: apps/v1
      kind: Deployment
      metadata:
      name: api-deployment
      spec:
      replicas: 3
      strategy:
      type: RollingUpdate
      rollingUpdate:
        maxUnavailable: 1
      template:
      spec:
        containers:
        - name: api
          image: my-registry/api:v1.2.3
          readinessProbe:
            httpGet:
              path: /health
              port: 8080
  3. StatefulSet

    • Для чего: Для stateful-приложений (базы данных, Kafka, Redis с персистентностью). Гарантирует порядок и уникальность Pod'ов, стабильные сетевые идентификаторы и томы.
  4. Service (ClusterIP, NodePort, LoadBalancer)

    • Для чего: Абстракция для доступа к группе Pod'ов. ClusterIP — для внутренней коммуникации, LoadBalancer — для внешнего трафика (часто интегрируется с облачным LB).
  5. Ingress & IngressController

    • Для чего: Управление внешним HTTP/HTTPS доступом, роутинг, SSL/TLS termination. Используем с контроллерами (nginx-ingress, traefik).
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
      name: app-ingress
      annotations:
      nginx.ingress.kubernetes.io/rewrite-target: /
      spec:
      tls:
      - hosts:
      - app.mycompany.com
      secretName: tls-secret
      rules:
      - host: app.mycompany.com
      http:
        paths:
        - path: /api
          pathType: Prefix
          backend:
            service:
              name: api-service
              port:
                number: 80
  6. ConfigMap & Secret

    • Для чего: Хранение конфигурации и чувствительных данных отдельно от образов. Secrets храним зашифрованными (используя Sealed Secrets или внешние хранилища типа HashiCorp Vault).
  7. PersistentVolume (PV) & PersistentVolumeClaim (PVC)

    • Для чего: Предоставление персистентного хранилища Pod'ам. Настраиваем StorageClass для динамического provisioning (например, gp2 в AWS, standard в GKE).
  8. Namespace

    • Для чего: Логическое разделение кластера (по командам, окружениям: dev, staging, prod). Используем ResourceQuotas и LimitRanges для контроля потребления.
  9. HorizontalPodAutoscaler (HPA)

    • Для чего: Автоматическое масштабирование нагрузки на основе CPU, памяти или кастомных метрик из Prometheus.
  10. CustomResourceDefinition (CRD) & Operators

    • Для чего: Расширение Kubernetes для управления сложными stateful-приложениями (например, операторы для PostgreSQL, Elasticsearch).

Рабочий процесс: Мы описываем эти ресурсы в виде манифестов (Helm charts, Kustomize), которые проходят через CI/CD пайплайн, где применяются с помощью kubectl apply или GitOps-инструментов (ArgoCD, Flux).