← Назад к вопросам

Что такое kubeproxy?

1.7 Middle🔥 171 комментариев
#Kubernetes#Сети и протоколы

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое kube-proxy?

Kube-proxy — это критически важный сетевой компонент, работающий на каждой ноде (узле) в кластере Kubernetes. Его основная задача — обеспечить сетевую связность между подами (pods) и внешними клиентами (например, пользователями или другими сервисами), реализуя абстракцию Сервиса (Service). По сути, kube-proxy действует как интеллектуальный сетевой прокси и балансировщик нагрузки, управляя правилами маршрутизации трафика внутри кластера.

Основные функции и обязанности

  • Реализация абстракции Service: Когда вы создаете объект Service (например, типа ClusterIP или NodePort), вы определяете логический набор подов и политику доступа к ним. kube-proxy отслеживает изменения в этих объектах и соответствующих им Pods (через API-сервер Kubernetes) и динамически обновляет сетевые правила на ноде, чтобы трафик, направленный на виртуальный IP-адрес (VIP) Сервиса, перенаправлялся на один из здоровых подов, соответствующих селекторам этого Сервиса.
  • Балансировка нагрузки: kube-proxy распределяет входящие соединения между подами бэкенда. По умолчанию используется балансировка по алгоритму random (случайный выбор) или с сохранением сессии (в режиме iptables это реализуется через вероятностное распределение).
  • Обеспечение сетевой изоляции: Работая в связке с сетевой политикой (NetworkPolicy) и CNI-плагином, kube-proxy помогает применять правила фильтрации трафика.

Режимы работы kube-proxy

kube-proxy может работать в нескольких режимах, которые определяют, как именно он реализует правила маршрутизации. Выбор режима влияет на производительность, функциональность и сложность отладки.

1. Режим iptables (режим по умолчанию в большинстве дистрибутивов)

В этом режиме kube-proxy управляет правилами в таблицах iptables (или ip6tables) ядра Linux. Он не проксирует трафик сам, а лишь настраивает правила NAT (маскарадинга) и фильтрации.

Принцип работы:

  • kube-proxy следит за изменениями Services и Endpoints через API-сервер.
  • При каждом изменении он полностью перезаписывает набор правил iptables в цепочках KUBE-SERVICES, KUBE-NODEPORTS, KUBE-POSTROUTING и др.
  • Когда пакет приходит на виртуальный IP Сервиса или порт ноды, iptables по заданным вероятностным правилам перенаправляет его (через DNAT) на IP-адрес конкретного пода.

Пример упрощенного правила iptables для Service:

# Примерное правило для перенаправления трафика на ClusterIP 10.96.0.1:80 на под 192.168.1.5:8080
-A KUBE-SVC-XXXXXXXX -d 10.96.0.1/32 -p tcp -m tcp --dport 80 -j KUBE-SEP–YYYYYYYY
-A KUBE-SEP–YYYYYYYY -s 192.168.1.5/32 -j KUBE-MARK-MASQ
-A KUBE-SEP–YYYYYYYY -p tcp -m tcp -j DNAT --to-destination 192.168.1.5:8080

Плюсы:

  • Высокая производительность, так как фильтрация происходит на уровне ядра.
  • Низкая задержка (latency).
  • Стабильность и предсказуемость.

Минусы:

  • При большом количестве сервисов и подов размер таблиц iptables может стать огромным, что замедляет их обход.
  • Балансировка нагрузки — только случайная (random) или вероятностная.
  • Невозможность перезаписи заголовков (например, Host), что нужно для некоторых продвинутых сценариев.

2. Режим IPVS (IP Virtual Server)

Более современный режим, использующий подсистему IPVS ядра Linux, специально разработанную для балансировки нагрузки на уровне L4.

Принцип работы:

  • kube-proxy создает виртуальный сервер (IPVS-сервис) для каждого Kubernetes Service.
  • В качестве бэкендов (реальных серверов) для этого виртуального сервера регистрируются IP-адреса подов.
  • Балансировка осуществляется ядром по выбранному алгоритму (rr, lc, dh, sh, sed, nq).

Настройка алгоритма балансировки в манифесте Service:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ports:
  - port: 80
    targetPort: 9376
  selector:
    app: MyApp
  # Аннотация для выбора алгоритма IPVS (некоторые версии kube-proxy)
  annotations:
    # Например, для round-robin (круговая)
    scheduler.k8s.io/ipvs-scheduler: "rr"

Плюсы:

  • Значительно лучше масштабируется на тысячи сервисов благодаря хэш-таблицам в ядре.
  • Поддерживает разнообразные алгоритмы балансировки нагрузки (round-robin, least-connection, source-hashing и др.).
  • Более высокая пропускная способность и меньшая задержка по сравнению с iptables в крупных кластерах.

Минусы:

  • Требует загрузки модулей ядра (ip_vs, ip_vs_rr, ip_vs_wrr и т.д.).
  • Менее зрелый в плане интеграции со всеми функциями Kubernetes (например, с SessionAffinity раньше были нюансы).

3. Режим userspace (устаревший)

Исторически первый режим. kube-proxy открывает порт на ноде и полностью проксирует трафик через свой процесс в пользовательском пространстве.

Принцип работы: Для каждого Service создается прокси-процесс, который принимает соединения и устанавливает новые соединения с подами. Этот режим крайне неэффективен и не используется в production из-за высоких накладных расходов и низкой производительности.

Как kube-proxy интегрируется в общую архитектуру

  1. Запуск: kube-proxy обычно работает как DaemonSet или системный демон на каждой ноде.
  2. Наблюдение: Компонент подключается к Kubernetes API Server и наблюдает (watch) за изменениями объектов Service и Endpoints (или EndpointSlices в современных версиях).
  3. Синхронизация: При любом изменении (создание/удаление Service, изменение набора подов) kube-proxy запускает цикл синхронизации. В этом цикле он перестраивает все сетевые правила (iptables, IPVS) на данной ноде в соответствии с новым состоянием кластера.
  4. Обработка трафика: После настройки правил весь входящий трафик, предназначенный для сервисов, обрабатывается сетевым стеком ядра согласно этим правилам, без дальнейшего участия процесса kube-proxy.

Вывод

Kube-proxy — это "невидимый рабочий" сети Kubernetes, который превращает статичные IP-адреса эфемерных подов в стабильные и доступные сетевые конечные точки (Services). Выбор его режима работы (iptables или IPVS) является важным решением при проектировании кластера и зависит от ожидаемого масштаба, требований к производительности и нужных алгоритмов балансировки. Понимание его принципов работы необходимо для эффективной отладки сетевых проблем в Kubernetes.