Вход в контейнерный двигатель не работает

У меня есть простой контейнер в реестре контейнеров 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

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

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/ path, я получаю ошибку 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 с телом ответа корреста.

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

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

1 ответ

Решение

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

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

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