Из каких основных компонентов состоит архитектура Kubernetes?

Ответ

Kubernetes — это распределенная система оркестрации контейнеров, состоящая из двух основных групп компонентов: Control Plane (Плоскость управления) и Worker Nodes (Рабочие узлы).

Control Plane (Мастер-узел/ы)

Управляет всем кластером. Компоненты могут работать на одном или распределенных узлах.

  1. kube-apiserver:

    • Фронтенд Control Plane. Единственный компонент, с которым взаимодействуют все остальные (CLI, UI, узлы).
    • Предоставляет REST API для управления кластером (создание, обновление, удаление ресурсов).
  2. etcd:

    • Распределенное key-value хранилище. Сохраняет всю конфигурацию и состояние кластера (желаемое и текущее).
    • Единственный компонент с состоянием (stateful) в Control Plane.
  3. kube-scheduler:

    • Отвечает за распределение подов (Pods) по рабочим узлам.
    • Учитывает требования ресурсов (CPU/RAM), политики affinity/anti-affinity, ограничения и т.д.
  4. kube-controller-manager:

    • Запускает контроллеры — фоновые циклы, которые следят за состоянием кластера и приводят его к желаемому.
    • Примеры контроллеров: Node Controller, Replication Controller, Endpoints Controller, Service Account Controller.

Worker Nodes (Рабочие узлы)

Запускают рабочие нагрузки (контейнеры).

  1. kubelet:

    • Агент на каждом узле. Отвечает за запуск, остановку и поддержание состояния подов в соответствии с PodSpec, полученными от API-сервера.
    • Сообщает о состоянии узла и подов обратно в Control Plane.
  2. kube-proxy:

    • Сетевой прокси на каждом узле. Реализует концепцию Service (сервиса).
    • Поддерживает сетевые правила, которые обеспечивают коммуникацию с подами как внутри узла, так и снаружи.
  3. Container Runtime:

    • Программное обеспечение, которое непосредственно запускает контейнеры (например, containerd, CRI-O, Docker Engine).
    • Kubernetes взаимодействует с ним через Container Runtime Interface (CRI).

Основные абстракции (Ресурсы)

  • Pod: Наименьшая и простейшая единица развертывания. Группа из одного или нескольких контейнеров с общими сетевыми и storage-ресурсами.
  • Service: Абстракция, определяющая логический набор подов и политику доступа к ним (стабильный IP/DNS имя).
  • Ingress: Управляет внешним HTTP/HTTPS доступом к сервисам внутри кластера (роутинг, SSL).

Пример минимального манифеста Pod:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-example
spec:
  containers:
  - name: nginx
    image: nginx:1.21
    ports:
    - containerPort: 80

Ответ 18+ 🔞

А, ну вот, опять про эту вашу магию, про кубернетес! Сидишь, слушаешь, а там такие термины летят — ебать мои старые костыли, прямо волнение ебать. Ладно, разберём по полочкам, как оно там внутри устроено, а то все умные слова кидают, а суть-то где?

Представь себе, что это такая большая, охуенно сложная ферма для выращивания контейнеров. И там есть две главные банды: Царь-Горы (Control Plane) и Рабочая КОЛХОЗная Бригада (Worker Nodes). Первые командуют, вторые — пашут.

Царь-Горы (Мастер-узлы, они же Control Plane)

Это главный штаб, мозги всей операции. Могут сидеть на одной машине или раскидаться, как тараканы.

  1. kube-apiserver:

    • Это, блядь, приёмная царя. Единственная дверь, в которую стучатся ВСЕ — и ты со своей командной строкой, и интерфейсы, и сами рабочие узлы. Хочешь что-то сделать в кластере? Иди нахуй к апи-серверу, других вариантов нет.
    • Даёт тебе REST API, через который ты и говоришь: «Создай», «Удали», «Обнови».
  2. etcd:

    • А это, сука, священная книга истины, распределённое хранилище «ключ-значение». В нём лежит ВСЁ: как должно быть и как есть на самом деле. Единственный компонент, который помнит всё, даже если вырубить свет. Stateful, блядь, в чистом виде.
  3. kube-scheduler:

    • Дежурный по распределению. Его работа — смотреть на свежесозданные поды (Pods) и решать, на какую конкретно рабочую машину их засунуть. Учитывает кучу всего: сколько там CPU, памяти, кто с кем дружит, кто кого нахуй не переносит. Настоящий таксист от мира контейнеров.
  4. kube-controller-manager:

    • Надзиратель и исправитель. Запускает кучу фоновых циклов-контроллеров, которые только и делают, что смотрят: «А реальность совпадает с тем, что в священной книге (etcd) написано?». Не совпадает? Щас исправим! Контроллер узлов, реплик, сервис-аккаунтов — все они тут.

Рабочая КОЛХОЗная Бригада (Worker Nodes)

А это те самые поля, где наши контейнеры-картошки растут. На каждой такой машине три главных мудака:

  1. kubelet:

    • Главный бригадир на участке. Его задача — получить от Царь-Горы (апи-сервера) план работ (PodSpec) и следить, чтобы на его узле поды запускались, работали и не дохли. Он же стучится обратно в штаб и докладывает: «У меня тут всё пиздато» или «Бля, контейнер сдох, ёпта».
  2. kube-proxy:

    • Сетевой шаман и диспетчер. Отвечает за то, чтобы трафик попадал куда надо. Реализует магию Сервисов (Service). Создаёт на узле такие сетевые правила, чтобы когда ты обращаешься к какому-нибудь «сервису-nginx», запрос улетал к реальным подам, которые могут бегать с одного узла на другой. Без него был бы пиздец и бардак.
  3. Container Runtime:

    • Непосредственно пахарь с лопатой. Это софтина, которая уже реально запускает контейнеры (типа containerd или CRI-O). Сам кубер с ним через специальный протокол (CRI) общается, говорит: «Запусти-ка мне этот образ, дружок».

На чём вся эта хуйня строится (Основные абстракции)

  • Pod: Самая мелкая боевая единица. Это как один или несколько солдатиков (контейнеров), засунутых в один окоп (общие сеть и диски). Обычно один контейнер, но бывает и больше.
  • Service: Постоянная вывеска для меняющихся подов. Поды могут дохнуть и перерождаться, их IP мелькают, а у Сервиса — стабильный IP или DNS-имя. Он знает, куда сейчас слать трафик.
  • Ingress: Привратник для внешнего мира. Если Сервис — это внутренняя телефонная книга, то Ingress — это секретарь на входе, который внешние HTTP/HTTPS запросы принимает и грамотно раскидывает по внутренним сервисам.

Вот, смотри, как простой под на коленке пишется, ни хуя сложного:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-example
spec:
  containers:
  - name: nginx
    image: nginx:1.21
    ports:
    - containerPort: 80

Вот и вся, блядь, архитектура. Царь-Горы командуют, Рабочие узлы пашут, а между ними бегают эти абстракции, как мартышлюшки, связывая всё в кучу. Ёперный театр, конечно, но когда въезжаешь — вроде логично.