Расскажите о вашем опыте работы с Kubernetes. Какие сущности использовали и для каких целей?

Ответ

Да, я активно использовал Kubernetes для оркестрации контейнеризированных приложений. Он является стандартом де-факто для развертывания, масштабирования и управления микросервисами.

Основные сущности и задачи:

  • Pod: Базовая единица развертывания. Обычно я не управляю подами напрямую, а использую более высокоуровневые абстракции.
  • Deployment: Использовал для декларативного описания и управления жизненным циклом stateless-приложений. Обеспечивает репликацию, развертывание и откаты.
  • StatefulSet: Применял для stateful-приложений, таких как базы данных, которым требуется стабильное сетевое имя и постоянное хранилище.
  • Service: Для обеспечения сетевого доступа к подам. Использовал ClusterIP для внутреннего взаимодействия, NodePort для отладки и LoadBalancer для предоставления доступа извне.
  • Ingress: Управлял внешним доступом к сервисам в кластере, обычно для HTTP/HTTPS. Настраивал маршрутизацию на основе хоста или пути.
  • ConfigMap / Secret: Для управления конфигурацией и секретами (пароли, токены) отдельно от кода приложения.
  • PersistentVolume (PV) / PersistentVolumeClaim (PVC): Для организации постоянного хранилища данных для stateful-приложений.
  • Liveness / Readiness Probes: Настраивал пробы для автоматического контроля состояния приложений. Readiness-проба определяет, готово ли приложение принимать трафик, а liveness-проба — нужно ли его перезапускать.

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-app-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: go-app
  template:
    metadata:
      labels:
        app: go-app
    spec:
      containers:
      - name: go-app-container
        image: my-registry/go-app:1.0.0
        ports:
        - containerPort: 8080
        readinessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 10

Инструменты экосистемы:

  • Helm: Использовал для пакетирования и управления приложениями (чарты).
  • Prometheus + Grafana: Настраивал для мониторинга метрик приложений и инфраструктуры.
  • client-go: Применял эту Go-библиотеку для программного взаимодействия с Kubernetes API, например, для написания собственных операторов или контроллеров.

Ответ 18+ 🔞

А, кубер, ёпта! Ну да, ворочал я этими контейнерами, как последний грузчик на пивном складе. Эта штука сейчас — как царь и бог, если хочешь микросервисы по полочкам разложить, чтобы они не перегрызлись между собой. Стандарт, блядь, де-факто, хоть тресни.

Вот эта вся мура, с которой постоянно имел дело:

  • Pod: Это типа базовая пешка, солдатик. Но я, как умный человек, редко в солдатиков руками тыкаю. Беру штуки по-круче.
  • Deployment: А вот это моя любовь, для всего, что без состояния. Сказал ему: «Хочу три копии!» — и он их делает, обновляет, откатывает, если накосячил. Красота, блядь.
  • StatefulSet: А это уже для серьёзных пацанов — для баз данных всяких. Тут уже имена стабильные нужны, и хранилище, чтобы не потерялось. С ним как с хрустальной вазой — осторожно, но мощно.
  • Service: Сетевой бармен, сука. Подам нужно друг с другом общаться? ClusterIP. Хочешь снаружи к одному постучаться для дебага? NodePort. Надо полновесный вход для толпы? LoadBalancer. Всё у него есть.
  • Ingress: А это главный швейцар на входе в клуб для HTTP-трафика. Ему правила говоришь: «Этого — по такому пути, того — на этот домен», и он всех расводит. Удобно, блядь.
  • ConfigMap / Secret: Ну тут всё ясно. Конфиги и пароли-токены отдельно от кода приложения. Чтобы не было как в той поговорке — «ключи от квартиры, где деньги лежат» в открытом репозитории. Пиздец и позор.
  • PersistentVolume (PV) / PersistentVolumeClaim (PVC): Для данных, которые должны пережить перезапуск пода. Типа диски виртуальные. Stateful-приложения без этого — как водка без закуски, бесполезно и тошнит потом.
  • Liveness / Readiness Probes: Самые главные стукачи в системе. Один (Readiness) докладывает: «Приложение готово трафик жрать!». Второй (Liveness) орёт: «Да это приложение сдохло, нахуй, перезапускай!». Автоматизация, ебать её в сраку.

Вот, смотри, как я обычно Deployment этот самый и сочинял:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-app-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: go-app
  template:
    metadata:
      labels:
        app: go-app
    spec:
      containers:
      - name: go-app-container
        image: my-registry/go-app:1.0.0
        ports:
        - containerPort: 8080
        readinessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 10

А ещё вокруг этого добра целая куча инструментов летает:

  • Helm: Это как менеджер пакетов, только для кубера. Упаковываешь всё приложение в «чарт» — и потом одним файлом его на десять кластеров натягиваешь. Лень — двигатель прогресса, ёпта.
  • Prometheus + Grafana: Это мои глаза и уши. Один (Prometheus) всё время метрики снимает, как сумасшедший, а второй (Grafana) красивые графики из них рисует. Чтобы видеть, где сейчас всё горит, а где просто тлеет.
  • client-go: А вот это для настоящих извращенцев, которые хотят с кубером на «ты» через код. Go-библиотека, чтобы свои операторы писать или скрипты умные. Когда стандартных возможностей уже не хватает, и ты чувствуешь себя богом, который лепит свою вселенную. Страшно, блядь, но охуенно.