Как вы использовали Kubernetes в проекте?

Ответ

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

Ключевые объекты и их применение:

  1. Deployment: Определяет желаемое состояние для подов (реплики, образ). Обеспечивает rolling updates и rollback.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: api-service
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: api-service
      template: # Шаблон пода
        metadata:
          labels:
            app: api-service
        spec:
          containers:
          - name: api
            image: my-registry/api-service:v1.2.0
            ports:
            - containerPort: 8080
            envFrom:
            - configMapRef:
                name: api-config # Конфигурация из ConfigMap
  2. Service: Абстракция для доступа к группе подов (обычно по селектору app: api-service). Создает стабильный DNS-имя и балансировку нагрузки.

    apiVersion: v1
    kind: Service
    metadata:
      name: api-service
    spec:
      selector:
        app: api-service
      ports:
        - protocol: TCP
          port: 80          # Порт сервиса
          targetPort: 8080  # Порт контейнера
      type: ClusterIP
  3. Ingress: Управляет внешним HTTP/HTTPS доступом к сервисам, маршрутизируя трафик на основе хоста или пути.

Практические преимущества:

  • Self-healing: Kubernetes автоматически перезапускает упавшие контейнеры и заменяет неисправные ноды.
  • Горизонтальное масштабирование: kubectl scale deployment api-service --replicas=5.
  • Управление конфиденциальными данными: Использование Secrets для хранения паролей и токенов.
  • Хранение данных: Использование PersistentVolumes и PersistentVolumeClaims для stateful-приложений.

Ответ 18+ 🔞

А, вот это я понимаю — тема! Kubernetes, блядь, это ж как взять кучу этих... контейнеров-пиздюков, которые сами по себе бегают, и заставить их работать как слаженный оркестр, только дирижёр тут — ты, и он немного ебнутый, потому что постоянно что-то ломает и чинит автоматически. Красота, ёпта!

Смотри, как это обычно устроено, на пальцах, но с технической точностью, а то я не шучу тут.

Главные герои этой дорамы:

  1. Deployment (Развёртывание, блядь). Это ты начальнику говоришь: «Мне нужно три одинаковых работника (пода), которые будут делать одно и то же». Ты ему не просто говоришь, а пишешь бумажку (манифест), где всё расписано: какой образ, сколько штук, как обновлять. Он эту бумажку читает и следит, чтобы всегда было ровно три работника. Один сдох — он нового нанимает. Ты сказал «обновись на новую версию» — он по одному старых увольняет и новых нанимает, чтобы работа не вставала. Гениально, сука!

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: api-service
    spec:
      replicas: 3 # Три штуки, бля! Ни больше, ни меньше!
      selector:
        matchLabels:
          app: api-service
      template: # А вот и шаблон для каждого бедолаги-пода
        metadata:
          labels:
            app: api-service
        spec:
          containers:
          - name: api
            image: my-registry/api-service:v1.2.0 # Вот он, родной, образ контейнера
            ports:
            - containerPort: 8080
            envFrom:
            - configMapRef:
                name: api-config # А конфиг ему сюда подсуну, чтоб не в коде хранить
  2. Service (Сервис, ёбаный). А это, понимаешь, такая хитрая жопа. У тебя три пода бегают, у каждого свой внутренний IP-адрес, который может поменяться, если под переродится. И как к ним обращаться? Ты создаёшь Сервис — этакую вывеску «API-Сервис». Он знает всех работников (подов) с меткой app: api-service, стоит перед ними и говорит: «Ко мне обращайтесь, ребята, я всех распределю!». И даёт им одно стабильное DNS-имя внутри кластера. Типа api-service.default.svc.cluster.local. Удобно, блядь!

    apiVersion: v1
    kind: Service
    metadata:
      name: api-service
    spec:
      selector:
        app: api-service # Ищет всех, кто с этой меткой
      ports:
        - protocol: TCP
          port: 80          # Порт, на который стучатся снаружи сервиса
          targetPort: 8080  # А этот порт уже внутри самого пода-контейнера
      type: ClusterIP # Тип такой, что снаружи кластера его не видно, только внутри
  3. Ingress (Вход, блять). А это уже для внешнего мира. Представь, у тебя куча сервисов внутри: api, frontend, admin-panel. И всем им нужен доступ из интернета по 80-му или 443-му порту. Так вот, Ingress — это такой умный швейцар-маршрутизатор на входе. К нему приезжает трафик, он смотрит: «А, запрос на myapp.com/api? Так, велкам к сервису api-service на порт 80». Всё, пидарас, разобрался. Без него пришлось бы на каждый сервис городить свой внешний IP, а это, блядь, дорого и некрасиво.

А в чём, собственно, кайф, спросишь ты?

  • Self-healing (Самолечение, ёпта). Работник (под) взял и сдох. Твоему начальнику (Deployment) похуй. Он видит, что их теперь два вместо трёх, и тут же создаёт нового. Нода (сервер) вся накрылась медным тазом? Поды с неё переезжают на другие живые ноды. Вообще охуенно.
  • Масштабирование — раз плюнуть. Запросов овердохуища? Сидишь такой, попивая кофе, и пишешь в консоли: kubectl scale deployment api-service --replicas=15. И всё, блядь! Через минуту у тебя уже 15 копий приложения гребут лопатой трафик. Хуй с горы!
  • Секреты (Secrets) — не в коде же их хранить, кретин! Пароли от базы, токены, ключи — всё это в специальный засекреченный объект, а подам подсовываешь как переменные окружения или файлы. Красиво, безопасно.
  • Диски (PersistentVolumes). А что, если приложению нужно что-то писать на диск, и чтобы это пережило перезапуск пода? Без проблем! Создаёшь том (PersistentVolume), заявляешь на него права (PersistentVolumeClaim), и подключаешь к поду. Данные останутся, даже если контейнер десять раз переродится. Для stateful-приложений — то, что доктор прописал, в рот меня чих-пых!

Вот и вся магия, если без лишней ереси. Сначала мозг взрывается, а потом привыкаешь и без этого жить не можешь. Как без воздуха, блядь.