кубернете нездоровый входной

Я выполнил учебник балансировки нагрузки: https://cloud.google.com/container-engine/docs/tutorials/http-balancer, который отлично работает, когда я использую изображение Nginx, когда я пытаюсь использовать свой собственный образ приложения, хотя backend переключается на нездоровый.

Мое приложение перенаправляет на/(возвращает 302), но я добавил livenessProbe в определении контейнера:

    livenessProbe:
      httpGet:
        path: /ping
        port: 4001
        httpHeaders:
          - name: X-health-check
            value: kubernetes-healthcheck
          - name: X-Forwarded-Proto
            value: https
          - name: Host
            value: foo.bar.com

Мой вход выглядит так:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: foo
spec:
  backend:
    serviceName: foo
    servicePort: 80
  rules:
  - host: foo.bar.com

Конфигурация сервиса:

kind: Service
apiVersion: v1
metadata:
  name: foo
spec:
  type: NodePort
  selector:
    app: foo
  ports:
    - port: 80 
      targetPort: 4001

Здоровье Backends в ingress describe ing выглядит следующим образом:

backends:       {"k8s-be-32180--5117658971cfc555":"UNHEALTHY"}

и правила входа выглядят так:

Rules:
  Host  Path    Backends
  ----  ----    --------
  * *   foo:80 (10.0.0.7:4001,10.0.1.6:4001)

Любые указатели получили очень много, я старался работать в течение нескольких часов без везения.

Обновить

Я добавил readinessProbe к моему развертыванию, но что-то все еще кажется ударом /, и вход по-прежнему нездоровый. Мой зонд выглядит так:

    readinessProbe:
      httpGet:
        path: /ping
        port: 4001
        httpHeaders:
          - name: X-health-check
            value: kubernetes-healthcheck
          - name: X-Forwarded-Proto
            value: https
          - name: Host
            value: foo.com

Я изменил свой сервис на:

kind: Service
apiVersion: v1
metadata:
  name: foo
spec:
  type: NodePort
  selector:
    app: foo
  ports:
    - port: 4001
      targetPort: 4001

Update2

После того, как я удалил пользовательские заголовки из readinessProbe он начал работать! Большое спасибо.

Ответы

Ответ 1

Вам нужно добавить готовностьProbe (просто скопируйте ваш livenessProbe).

Это объясняется в GCE L7 Ingress Docs.

Проверка здоровья

В настоящее время все служебные серверы должны удовлетворять одному из следующих требований для прохождения проверок работоспособности HTTP, отправленных ему от балансировщика нагрузки GCE: 1. Ответьте с 200 на '/'. Содержание не имеет значения. 2. Выставьте произвольный URL в качестве зонда готовности на бобах, поддерживающих Сервис.

Также убедитесь, что readinessProbe указывает на тот же порт, который вы открываете для Ingress. В вашем случае это хорошо, так как у вас есть только один порт, если вы добавите еще один, вы можете столкнуться с проблемами.

Ответ 2

У меня была такая же проблема. Затем последовал Tex, но продолжал видеть это сообщение. Оказывается, мне пришлось подождать несколько минут до входа, чтобы проверить работоспособность службы. Если кто - то собирается к тому же и сделали все шаги, как readinessProbe и linvenessProbe, просто обеспечить ваш вход указывает на услугу, которая является либо NodePort, и подождать несколько минут, пока желтый значок предупреждения не превращается в один зеленый. Кроме того, проверьте журнал на StackDriver, чтобы лучше понять, что происходит.