Сервисы Deep Dive

Сервисы Deep Dive

Разберем внутреннее устройство сервисов Kubernetes. Главный секрет в том, что объект Service — это не процесс и не программа, а запись в базе данных, которую считывает специальный агент на каждой ноде.

Внутреннее устройство: kube-proxy

На каждой ноде кластера работает компонент kube-proxy. Его задача - следить за появлением новых сервисов и эндпоинтов (IP-адресов подов) и настраивать правила фильтрации трафика.

  • Как это работает: Когда вы создаете Service, API-сервер уведомляет kube-proxy. Тот идет в ядро Linux и создает правила в iptables или IPVS.
  • Результат: Когда пакет летит на виртуальный IP сервиса (ClusterIP), ядро Linux перехватывает его и перенаправляет на реальный IP одного из подов.

Способы публикации сервиса

Если вам нужно получить доступ к приложению извне, есть несколько путей - от простых отладочных до промышленных.

1. Локальный доступ (для разработки)

Используется только для тестов. Трафик идет через ваш компьютер.

  • kubectl proxy: создает туннель к API-серверу. Сервис доступен по длинному URL через API.
  • kubectl port-forward: пробрасывает порт с локальной машины прямо на порт сервиса или пода.
    • Пример: kubectl port-forward service/my-service 10000:80 (зайти можно через localhost:10000).

2. NodePort

Открывает статический порт на каждом узле кластера. Трафик, пришедший на этот порт, перенаправляется на внутренний ClusterIP сервиса.

  • Диапазон портов: 30000–32767.
  • Минус: Вам нужно знать IP-адреса нод, и если нода упадет, нужно переключаться на другую.

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

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  selector:
    app: MyApp
  ports:
    - port: 80         # Порт внутри кластера
      targetPort: 80   # Порт в контейнере
      nodePort: 30007  # Внешний порт на всех нодах

3. LoadBalancer

Используется в облаках (AWS, GCP, Azure). Kubernetes запрашивает у провайдера создание внешнего балансировщика с публичным IP.

  • Плюс: Вы получаете единую точку входа (DNS/IP), которая сама распределяет трафик по нодам.

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

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: LoadBalancer
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

4. Ingress

Это не тип сервиса, а отдельный ресурс. Он работает как умный прокси (Nginx/HAProxy) и позволяет на одном внешнем IP держать сотни сервисов, разделяя их по доменным именам и путям (например, myapp.com/api и myapp.com/web).

Итог

МетодУровеньКогда использовать?
kubectl port-forwardL4 (Локально)Быстрая отладка разработчиком.
NodePortL4 (Узел)Простые кластеры без облачного провайдера.
LoadBalancerL4 (Облако)Когда нужен публичный IP для одного сервиса.
IngressL7 (HTTP)Промышленный стандарт для множества HTTP-сервисов.

Deep Dive Note: В режиме iptables (по умолчанию для kube-proxy) выбор пода происходит случайно. Если вам нужна более продвинутая балансировка или работа с тысячами сервисов, лучше переключить kube-proxy в режим IPVS, который работает быстрее и эффективнее.