Ответ
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, и он уже там, сука, орёт "Мууу!" и строит твои пода. Ёперный театр, а не технология.