Что должно произойти в Kubernetes, чтобы сервис начал отправлять запросы?

«Что должно произойти в Kubernetes, чтобы сервис начал отправлять запросы?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для того чтобы сервис в Kubernetes начал маршрутизировать трафик, должны выполниться несколько условий:

  1. Поды готовы и работают: Поды, соответствующие селекторам сервиса, должны быть в состоянии Running, и их контейнеры должны пройти проверки готовности (readinessProbe). Только тогда их IP-адреса попадут в Endpoints.
  2. Создан объект Endpoints: Kubernetes автоматически создает и обновляет объект Endpoints с тем же именем, что и у сервиса. Этот объект содержит список IP-адресов и портов готовых подов. Без активных Endpoints сервис никуда не направляет трафик.
  3. Работает kube-proxy: Компонент kube-proxy, работающий на каждой ноде, наблюдает за изменениями сервисов и Endpoints. Он настраивает правила iptables или IPVS для перенаправления трафика, предназначенного для ClusterIP сервиса, на IP-адреса реальных подов.
  4. Для внешнего доступа: Если сервис типа 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 начнут перенаправляться на поды.