вход двигателя контейнера не работает

У меня есть простой контейнер в реестре контейнеров Google, который в основном выполняет несколько функций и выполняет двоичный файл, который является сервером на основе go, вот содержимое DockerFile:

FROM debian:stable

WORKDIR /workspace/

COPY key.json .
COPY bin/user-creds.

EXPOSE 1108

ENV GOOGLE_APPLICATION_CREDENTIALS /workspace/key.json

RUN apt-get update \
    && apt-get install -y ca-certificates \
    && chmod +x user-creds

CMD ["./user-creds"]

этот контейнер протестирован локально и отлично работает. Итак, используя облачную оболочку Google, я запустил этот контейнер:

kubectl run user-creds --image=eu.gcr.io/GCLOUD_PROJECT/user-creds:COMMIT_SHA --port=1108

Затем, как сказано в документе, я выставил его на nodeport

kubectl expose deployment user-creds --target-port=1108 --type=NodePort

Затем я создал вход с путем к сервису:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: INGRESS_NAME
  annotations:
      kubernetes.io/ingress.global-static-ip-name: IP_NAME
spec:
  rules:
    - http:
        paths:
        - path: /user/creds/*
          backend:
            serviceName: user-creds
            servicePort: 1108

затем я создал вход:

kubectl create -f INGRESS_NAME.yaml

вход был создан, и я подождал некоторое время, вот подробности входа:

NAME                     HOSTS     ADDRESS        PORTS     AGE
INGRESS_NAME             *         IP_ADDRESS     80        38m

но когда я перехожу по фактическому URL-адресу с путем, я получаю ошибку 502:  введите описание изображения здесь

Когда я перехожу на любой другой путь, я получаю ошибку 404 бэкэнд по умолчанию, но когда я посещаю конкретный / user / creds / путь, я получаю ошибку 502.

Чтобы проверить, не что-то не так с кластером или моим конкретным контейнером, портом или чем-то еще, я попытался выставить контейнер как LoadBalancer, и он отлично работает, Команда:

kubectl expose deployment user-creds --target-port=1108 --port=80 --type=LoadBalancer

детали услуги:

NAME         TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
kubernetes   ClusterIP      INT_IP_ADDRESS  <none>          443/TCP        1h
user-creds   LoadBalancer   INT_IP_ADDRESS  IP_ADDRESS      80:31618/TCP   1m

Результат: 200 с самым коренным откликом кузова.

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

Любая помощь или предложение будут оценены, спасибо :)


comment
Зайдите в консоль GCP и просмотрите созданный балансировщик нагрузки. Бэкенды показывают 0 / N работоспособных экземпляров? Щелкните ссылку проверки работоспособности, чтобы увидеть, какие настройки проверки работоспособности были созданы. Если ваш двоичный файл user-creds не возвращает 200 по пути /, значит, проверки работоспособности не работают.   -  person Sardonic    schedule 14.11.2017
comment
выяснил, что случилось, это было связано с проверкой работоспособности, спасибо за помощь   -  person edwinj    schedule 15.11.2017


Ответы (1)


Наконец разобрался, это было связано с проверкой работоспособности. Проверка работоспособности посещает / и ожидает 200, если она не получает его, то помечает бэкэнд как неработоспособный и возвращает 502 для каждого отправленного ему запроса. Моя проблема заключалась в том, что я использовал конечную точку /, которая обычно возвращала бы 400, если бы она вызывалась без определенных параметров запроса.

На самом деле это была человеческая ошибка с моей стороны, в документации даже специально сказано: https://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer#remarks

Еще одна вещь, которую следует учитывать, заключается в том, что вход возвращает все пути до маршрута, поэтому в моем случае сервер должен буквально прослушивать / user / creds /.

person edwinj    schedule 14.11.2017