Ответ
Для того чтобы сервис в Kubernetes начал маршрутизировать трафик, должны выполниться несколько условий:
- Поды готовы и работают: Поды, соответствующие селекторам сервиса, должны быть в состоянии
Running, и их контейнеры должны пройти проверки готовности (readinessProbe). Только тогда их IP-адреса попадут в Endpoints. - Создан объект Endpoints: Kubernetes автоматически создает и обновляет объект
Endpointsс тем же именем, что и у сервиса. Этот объект содержит список IP-адресов и портов готовых подов. Без активных Endpoints сервис никуда не направляет трафик. - Работает kube-proxy: Компонент
kube-proxy, работающий на каждой ноде, наблюдает за изменениями сервисов и Endpoints. Он настраивает правила iptables или IPVS для перенаправления трафика, предназначенного для ClusterIP сервиса, на IP-адреса реальных подов. - Для внешнего доступа: Если сервис типа
LoadBalancer, облачный контроллер должен создать внешний балансировщик нагрузки и назначить ему внешний IP. Если используетсяIngress, должен быть развернут и настроен Ingress Controller (например, nginx-ingress), который будет направлять внешний трафик на соответствующие сервисы.
Пример: Деплоймент с readinessProbe и простой сервис.
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: app
image: nginx:alpine
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
---
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- port: 80
targetPort: 80
После применения этих манифестов и успешного прохода readinessProbe, запросы к my-service начнут перенаправляться на поды.