Каковы основные задачи Kubernetes и что описывает манифест Deployment

Ответ

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

Основные задачи, решаемые Kubernetes:

  • Оркестрация контейнеров: Автоматическое размещение контейнеров на узлах кластера на основе доступных ресурсов.
  • Самовосстановление: Перезапуск упавших контейнеров, замена и перераспределение подов при сбое узла.
  • Масштабирование: Горизонтальное масштабирование (увеличение/уменьшение количества реплик) вручную или автоматически (HPA - Horizontal Pod Autoscaler).
  • Автоматизация развертываний и откатов: Позволяет применять обновления к приложениям без простоя (rolling updates) и легко откатываться к предыдущей версии.
  • Балансировка нагрузки и обнаружение сервисов: Предоставляет подам собственные IP-адреса и единое DNS-имя для группы подов, а также распределяет нагрузку между ними.

Манифест Deployment — это YAML-файл, который декларативно описывает желаемое состояние для группы идентичных подов. Kubernetes постоянно работает над тем, чтобы текущее состояние соответствовало описанному в манифесте.

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-deployment # Имя самого Deployment
spec:
  replicas: 3 # Желаемое количество работающих подов
  selector:
    matchLabels:
      app: my-app # Указывает, какими подами управляет этот Deployment
  template: # Шаблон для создания подов
    metadata:
      labels:
        app: my-app # Метка, которая будет присвоена подам
    spec:
      containers:
      - name: my-app-container
        image: my-registry/my-app:1.0.0 # Образ контейнера
        ports:
        - containerPort: 80
        resources:
          requests: # Минимально запрашиваемые ресурсы
            cpu: "100m"
            memory: "128Mi"
          limits: # Максимальные ресурсы, которые может использовать контейнер
            cpu: "200m"
            memory: "256Mi"

Ответ 18+ 🔞

А, Кубернетис! Ну, это такая штука, блядь, которая из кучки серваков делает одну здоровенную, управляемую тварь. Представь, у тебя есть стадо контейнеров, и они разбегаются, как тараканы, а ты, сука, должен за ними следить. Так вот, Кубер — это такой цифровой пастух с плеткой, который орет "Мууу!" и все контейнеры строятся в ряд, блядь.

Что он, этот пастух, делает, кроме ора:

  • Расставляет контейнеры по местам: Сам решает, на каком сервере что запустить, чтобы ресурсы не простаивали. Умный, сука.
  • Сам лечит: Упал контейнер — он его перезапустит. Отвалился целый сервер — он перетащит все коробки на другие. Самовосстановление, ёпта! Не надо бегать с криком "всё пропало!".
  • Растягивает и сжимает: Народу на сайт набежало — он новых клонов твоего приложения наштампует. Народ разошелся — лишних прибьёт. Горизонтальное масштабирование называется, а по-простому — "размножил нахуй" или "поубивал нахуй".
  • Обновляет без пиздеца: Можно новую версию приложения вкатить так, что никто и не заметит. А если что-то пошло не так — откатиться назад, как будто ничего и не было. Rolling update, блядь, магия!
  • Балансирует и знакомит: Он всем контейнерам выдает IP-адреса и говорит: "Ребята, вот вам общее DNS-имя, общайтесь". А трафик снаружи сам раскидывает между ними. Удобно, сука.

А теперь про Deployment. Это, блядь, не бумажка какая-то, а священный скрижаль, инструкция для Кубера. Ты в YAML-файле пишешь, как ты хочешь, чтобы всё было. Например: "Хочу три одинаковых пода с моим приложением, версия 1.0.0". А Кубер, как раб на галерах, будет пыхтеть и делать так, чтобы реальность соответствовала твоим хотелкам. Если один под сдохнет — он нового создаст. Ты сказал "три" — будет три, блядь, ни больше, ни меньше.

Вот смотри, как эта инструкция выглядит, в рот меня чих-пых:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-deployment # Имя этой всей затеи, чтобы потом орать "kubectl get deployment my-app-deployment"
spec:
  replicas: 3 # Хочу три штуки! Три пода, Карл!
  selector:
    matchLabels:
      app: my-app # Эй, Кубер, управляй только теми подами, у которых бирка "app=my-app"
  template: # А вот и чертёж для каждого пода
    metadata:
      labels:
        app: my-app # Вешаем на каждый созданный под эту самую бирку
    spec:
      containers:
      - name: my-app-container
        image: my-registry/my-app:1.0.0 # Берём образ вот отсюда, не перепутай!
        ports:
        - containerPort: 80 # Слушай на 80 порту внутри себя
        resources:
          requests: # Минимум, без чего я не запущусь, дай хоть это
            cpu: "100m" # Сотую часть ядерца
            memory: "128Mi" # И 128 мегабайтиков памяти
          limits: # А больше этого лимита жрать не смей, жадина!
            cpu: "200m"
            memory: "256Mi"

Вот и вся магия. Написал такой файл, отправил Куберу командой kubectl apply -f deployment.yaml, и он уже там, сука, орёт "Мууу!" и строит твои пода. Ёперный театр, а не технология.