Разберем внутреннее устройство сервисов 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-forward | L4 (Локально) | Быстрая отладка разработчиком. |
| NodePort | L4 (Узел) | Простые кластеры без облачного провайдера. |
| LoadBalancer | L4 (Облако) | Когда нужен публичный IP для одного сервиса. |
| Ingress | L7 (HTTP) | Промышленный стандарт для множества HTTP-сервисов. |
Deep Dive Note: В режиме iptables (по умолчанию для kube-proxy) выбор пода происходит случайно. Если вам нужна более продвинутая балансировка или работа с тысячами сервисов, лучше переключить kube-proxy в режим IPVS, который работает быстрее и эффективнее.