Что такое Kubernetes?

Ответ

Kubernetes (K8s) — это open-source платформа для оркестрации контейнеризированных приложений. Она автоматизирует их развертывание, масштабирование и управление.

Ключевые концепции и возможности:

  • Кластер и ноды: Кластер состоит из управляющей плоскости (control plane) и рабочих нод, на которых запускаются поды (pods).
  • Поды: Наименьшая вычислительная единица, содержащая один или несколько контейнеров.
  • Самовосстановление: Kubernetes автоматически перезапускает упавшие контейнеры, заменяет и убивает не отвечающие поды, а также убирает поды, не прошедшие проверки готовности (readiness probes).
  • Автомасштабирование: Horizontal Pod Autoscaler (HPA) динамически изменяет количество подов на основе метрик CPU, памяти или кастомных метрик.
  • Объявления и контроллеры: Вы описываете желаемое состояние приложения (например, в Deployment), а контроллеры непрерывно работают для его поддержания.
  • Сервисы и ингрессы: Сервисы обеспечивают стабильную сетевую точку доступа к набору подов, а ингрессы управляют внешним HTTP/HTTPS трафиком.

Пример простого Deployment для веб-приложения:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      labels:
        app: web-app
    spec:
      containers:
      - name: app-container
        image: myregistry/web-app:latest
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: "128Mi"
            cpu: "250m"
          limits:
            memory: "256Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /health
            port: 8080

В DevOps-практике Kubernetes стал стандартом для запуска микросервисных архитектур, обеспечивая переносимость между облаками и эффективное использование ресурсов.

Ответ 18+ 🔞

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

Представь себе: у тебя есть кластер. Это типа штаб-квартира (control plane) и куча рабочих-рабов (ноды), которые реальную работу делают. На этих нодах живут поды — это как самые мелкие квартирки, куда ты заселяешь свои контейнеры. Можешь в одну квартиру несколько контейнеров пихнуть, чтобы они друг с другом болтали быстро.

А самое офигенное — это самовосстановление. Представь, один из твоих контейнеров взял и накрылся медным тазом. Ты бы руками бегал, перезапускал. А тут система сама, блядь, видит — ой, а этот под помер. И тут же нового запускает! Чисто волшебство. Она их ещё и проверяет постоянно: «Ты живой? Ты готов запросы принимать?». Если нет — нахуй с пляжа, следующий!

Автомасштабирование — это вообще песня. Нагрузка пошла вверх, CPU зашкаливает. Раньше бы паника, алёрты, ночные побудки. А тут Horizontal Pod Autoscaler (HPA) смотрит на это и такой: «О, ребята, надо помочь!». И бац — запускает ещё пару-тройку таких же подов, чтобы нагрузку распределить. Нагрузка упала — лишние аккуратно прибивает. Экономия, ёбана!

Вся философия в том, что ты не команды «сделай то-то» даёшь. Ты описываешь желаемое состояние в YAML-файле: «Хочу, чтобы у меня было три копии моего приложения, вот с таким образом, на таком порту». А дальше всякие контроллеры (типа Deployment) берут эту бумажку и делают всё, чтобы реальность под неё подогнать. Если что-то сломалось или не совпадает — они это чинят. Доверия ебать ноль к ручному управлению, только декларативный подход!

Ну и как к этому всему извне подключиться? Для этого есть Сервисы. Это такая постоянная табличка на здании, даже если квартиранты внутри (поды) постоянно меняются. А если нужно с улицы, из интернета, HTTP-трафик пустить, то выставляешь Ингресс — этакий умный швейцар-маршрутизатор.

Вот, смотри, как примерно выглядит объявление такого желаемого состояния для какого-нибудь веб-приложения. Это как инструкция для системы:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      labels:
        app: web-app
    spec:
      containers:
      - name: app-container
        image: myregistry/web-app:latest
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: "128Mi"
            cpu: "250m"
          limits:
            memory: "256Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /health
            port: 8080

Видишь? Говорим: «Хочу три реплики (replicas: 3)». Образ контейнера вот такой. Даём ему скромные ресурсы на старт (requests), но ставим жёсткий потолок (limits), чтобы жрачун один весь кластер не сожрал. И главное — проверка живости (livenessProbe). Система будет стучаться на /health и если там не 200 OK — значит, контейнер сдох, надо перезапустить. Автоматически, блядь!

В общем, в современном DevOps без этой штуки — вообще никуда. Если у тебя микросервисов больше двух, и они как-то между собой общаются, то K8s — это спасение от администрирования ебаного. Переносимость между облаками — один хуй везде работает одинаково. Эффективное использование железа — не простаивает же ничего. Короче, стандарт де-факто, ядрёна вошь. Выучил его — и ты уже на полпути к просветлению, чувак.