Kubernetes https ingress 400 ответ

У меня есть кластер kubernetes без оболочки (1.13), и я запускаю контроллер входящего трафика nginx (развернутый через helm в пространство имен по умолчанию, v0.22.0).

У меня есть вход в другое пространство имен, которое пытается использовать контроллер nginx.

#ingress.yaml
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: myapp
annotations:
  kubernetes.io/backend-protocol: https
  nginx.ingress.kubernetes.io/enable-rewrite-log: "true"
  nginx.ingress.kubernetes.io/rewrite-target: "/$1"
spec:
  tls:
  - hosts:
    - my-host
    secretName: tls-cert
  rules:
  - host: my-host
    paths:
    - backend:
        servicename: my-service
        servicePort: https
      path: "/api/(.*)"

Контроллер nginx успешно находит вход и сообщает, что есть конечные точки. Если я попадаю в конечную точку, я получаю 400 без содержимого. Если я включу https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/configmap.md#custom-http-errors, то я получаю 404 от nginx; моя служба не пострадала. Согласно перезапись ведения журнала, URL-адрес переписывается правильно.

Я также подключился к сервису прямо из модуля, и это тоже работает.

#service.yaml
kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  ports:
  - name: https
    protocol: TCP
    port: 5000
    targetPort: https
  selector:
    app: my-app
  clusterIP: <redacted>
  type: ClusterIP
  sessionAffinity: None

Что могло пойти не так?

ИЗМЕНИТЬ: отключение https по-прежнему дает ту же ошибку 400. Однако, если мое приложение ожидает HTTPS-запросы, а nginx отправляет HTTP-запросы, тогда запросы попадают в приложение (но оно не может их обрабатывать).


person soandos    schedule 16.05.2019    source источник
comment
ваш сервис использует действующий сертификат SSL? Nginx откажется подключаться к сервису с недействительным сертификатом.   -  person Vasili Angapov    schedule 16.05.2019
comment
Что значит действительный? Сертификат самоподписанный.   -  person soandos    schedule 16.05.2019
comment
на самом деле я не уверен, нужен ли действующий сертификат в наши дни (он был нужен в более старых версиях). Можете ли вы проверить логи Nginx на наличие 400 ошибок?   -  person Vasili Angapov    schedule 16.05.2019
comment
Я вижу 400 в журналах, но не откуда (даже на -v = 5)   -  person soandos    schedule 16.05.2019
comment
если Nginx не дает повода для 400 - то 400 генерируется не Nginx. Вам следует изучить журналы своего приложения.   -  person Vasili Angapov    schedule 16.05.2019
comment
Приложение не показывает, что оно получило запрос   -  person soandos    schedule 16.05.2019
comment
также Nginx может молча выйти из строя с 400, если в запросе есть недопустимые заголовки. Вы можете поймать это только с помощью tcpdump.   -  person Vasili Angapov    schedule 19.05.2019
comment
@VasilyAngapov, это была ошибка. Если вы опубликуете это как ответ, я приму это   -  person soandos    schedule 20.05.2019
comment
рад слышать. Вы можете сказать, какой заголовок вызвал проблему?   -  person Vasili Angapov    schedule 20.05.2019
comment
Это был заголовок хоста. Не уверен, почему это было проблемой   -  person soandos    schedule 20.05.2019


Ответы (1)


Nginx выдаст 400, если заголовки запроса недействительны (например, специальные символы в нем). Вы можете отладить это с помощью tcpdump.

person Vasili Angapov    schedule 20.05.2019