Какие есть способы публикации приложений в Kubernetes?

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

Ответ

Публикация приложения в Kubernetes — это его деплой и предоставление доступа. Вот ключевые способы и ресурсы:

1. Ресурсы для управления рабочими нагрузками (Deployment)

  • Deployment: Основной ресурс для stateless-приложений. Управляет ReplicaSet, обеспечивает rolling updates, откаты и масштабирование.
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: frontend
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: frontend
      template:
        metadata:
          labels:
            app: frontend
        spec:
          containers:
          - name: nginx
            image: nginx:1.21
  • StatefulSet: Для stateful-приложений (БД, Kafka). Гарантирует устойчивые идентификаторы подов, стабильные сетевые имена и упорядоченный деплой/масштабирование.
  • DaemonSet: Гарантирует, что копия пода будет работать на всех (или некоторых) нодах. Идеально для агентов мониторинга (Prometheus Node Exporter) или логирования (Fluentd).
  • Job / CronJob: Для разовых задач (миграция БД) или периодических (бэкапы).

2. Ресурсы для предоставления доступа (Service & Ingress)

  • Service: Абстракция, определяющая логический набор подов и политику доступа к ним. Создает стабильный DNS-имя и IP (ClusterIP).
    • ClusterIP: Доступ только внутри кластера.
    • NodePort: Открывает порт на каждой ноде.
    • LoadBalancer: Создает внешний балансировщик нагрузки у облачного провайдера.
  • Ingress: Управляет внешним HTTP/HTTPS доступом к сервисам внутри кластера. Один Ingress может маршрутизировать трафик на множество сервисов на основе хоста или пути. Требует Ingress Controller (например, nginx-ingress).
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: my-ingress
    spec:
      rules:
      - host: app.mycompany.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: frontend-service
                port:
                  number: 80

3. Инструменты упаковки и управления (Helm, Kustomize)

  • Helm: Менеджер пакетов для Kubernetes. Позволяет упаковывать приложение (чарт) со всеми зависимостями, параметризировать конфиги и управлять жизненным циклом.
    helm install my-app ./my-chart --values production-values.yaml
  • Kustomize: Декларативный инструмент для кастомизации конфигураций через оверлеи (база + патчи для dev/stage/prod). Интегрирован в kubectl (kubectl apply -k ./overlays/prod/).