Вход в контейнерный двигатель не работает
У меня есть простой контейнер в реестре контейнеров 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 / в моем случае.