Почему мой Ingress-контроллер kubernetes nginx без оболочки возвращает 308?

Я пытаюсь добавить контроллер входа nginx в свой кластер kubernetes. В моем текущем кластере 3 узла, и все они имеют открытые правила брандмауэра между ними. (Примечание: это кластер без операционной системы для образовательных целей)

Я создал развертывание со следующей конфигурацией

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nodejs-test
  labels:
    app: nodejs
spec:
  replicas: 5
  selector:
    matchLabels:
      app: nodejs
  template:
    metadata:
      labels:
        app: nodejs
    spec:
      containers:
      - name: nodejs-container
        image: gcr.io/infrastructure/test-nodejs-server
        ports:
        - containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
  name: test-deployment-service
spec:
  selector:
    app: nodejs
  ports:
  - protocol: TCP
    port: 80
    targetPort: 3000

После запуска kubectl create -f file.yaml

Я вижу, что все модули и службы работают. Внутри кластера я могу свернуть этот служебный ip и получить ответ от модулей.

Теперь иду создать ингресс.

Сначала я выполнил шаги по установке, указанные на странице https://github.com/kubernetes/ingress-nginx/tree/master/deploy

Я вижу, что мой входной контроллер работает.

    NAMESPACE       NAME                                         READY     STATUS    RESTARTS   AGE
default         my-test-6445d9bb7b-blm7t                     1/1       Running   0          3h
default         nodejs-test-5657f7bb74-7hwqk                 1/1       Running   0          23h
default         nodejs-test-5657f7bb74-bh44x                 1/1       Running   0          23h
default         nodejs-test-5657f7bb74-dw4g4                 1/1       Running   0          23h
default         nodejs-test-5657f7bb74-k7bf4                 1/1       Running   0          23h
default         nodejs-test-5657f7bb74-xdthl                 1/1       Running   0          23h
ingress-nginx   default-http-backend-55c6c69b88-4d5bf        1/1       Running   0          26m
ingress-nginx   nginx-ingress-controller-5c6698dfbf-gs9zd    1/1       Running   0          25m
kube-system     etcd-yoda.me.com                      1/1       Running   1          1d
kube-system     kube-apiserver-yoda.me.com            1/1       Running   1          1d
kube-system     kube-controller-manager-yoda.me.com   1/1       Running   1          1d
kube-system     kube-dns-6f4fd4bdf-62bxg                     3/3       Running   3          1d
kube-system     kube-flannel-ds-jbmwg                        1/1       Running   1          1d
kube-system     kube-flannel-ds-r8nfb                        1/1       Running   2          1d
kube-system     kube-flannel-ds-rczbx                        1/1       Running   0          1d
kube-system     kube-proxy-brm2g                             1/1       Running   0          1d
kube-system     kube-proxy-qjgcv                             1/1       Running   1          1d
kube-system     kube-proxy-sz6rw                             1/1       Running   1          1d
kube-system     kube-scheduler-yoda.me.com            1/1       Running   1          1d
kube-system     kubernetes-dashboard-5bd6f767c7-stscl        1/1       Running   1          23h
kube-system     tiller-deploy-59d854595c-tngg6               1/1       Running   0          23h

Затем я создаю вход со следующим файлом

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - http:
      paths:
      - path: /whoop
        backend:
          serviceName: test-deployment-service
          servicePort: 80

Затем я запускаю kubectl get services --all-namespaces, чтобы найти порт моего входящего контроллера.

NAMESPACE       NAME                      TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
default         kubernetes                ClusterIP   10.96.0.1        <none>        443/TCP                      1d
default         my-test                   ClusterIP   10.110.102.5     <none>        80/TCP                       4h
default         test-deployment-service   ClusterIP   10.104.239.37    <none>        80/TCP                       23h
ingress-nginx   default-http-backend      ClusterIP   10.105.218.87    <none>        80/TCP                       29m
ingress-nginx   ingress-nginx             NodePort    10.110.39.104    <none>        80:30652/TCP,443:31624/TCP   27m
kube-system     kube-dns                  ClusterIP   10.96.0.10       <none>        53/UDP,53/TCP                1d
kube-system     kubernetes-dashboard      ClusterIP   10.100.219.110   <none>        443/TCP                      23h
kube-system     tiller-deploy             ClusterIP   10.101.179.202   <none>        44134/TCP                    23h

Теперь я скручиваю свой сервер:

curl -v myserver:30652/whoop/

В результате получается такой ответ:

*   Trying myip...
* TCP_NODELAY set
* Connected to myserver (myip) port 30652 (#0)
> GET /whoop/ HTTP/1.1
> Host: myserver:30652
> User-Agent: curl/7.54.0
> Accept: */*
> 
< HTTP/1.1 308 Permanent Redirect
< Server: nginx/1.13.9
< Date: Fri, 02 Mar 2018 14:38:21 GMT
< Content-Type: text/html
< Content-Length: 187
< Connection: keep-alive
< Location: https://myserver:30652/whoop/
< Strict-Transport-Security: max-age=15724800; includeSubDomains;
< 
<html>
<head><title>308 Permanent Redirect</title></head>
<body bgcolor="white">
<center><h1>308 Permanent Redirect</h1></center>
<hr><center>nginx/1.13.9</center>
</body>
</html>
* Connection #0 to host myserver left intact

Я ожидал получить ответ от своих капсул. Однако я всегда получаю 308.

Если я закручу случайный путь

curl myserver: 30652 / случайный

Я получаю ответ

default backend - 404

Как я могу подключить свой входной и входной контроллер, чтобы маршрутизация работала правильно?


person nbroeking    schedule 02.03.2018    source источник
comment
когда он перенаправляет, каков заголовок Location ответа (используйте curl -v). и что произойдет, если вы попробуете curl myserver: 30652 / whoop / (с косой чертой в конце)?   -  person Jonah Benton    schedule 02.03.2018
comment
308 - это код статуса перенаправления по умолчанию для nginx сейчас. разница между 308 и 301 в том, что пользовательские агенты не сохраняют метод на 301, а на 308.   -  person Jonah Benton    schedule 02.03.2018
comment
@JonahBenton Я попробовал и отредактировал исходный вопрос. Короче говоря, косая черта не имеет значения.   -  person nbroeking    schedule 02.03.2018
comment
Хорошо. Итак, если 308 - это код статуса перенаправления по умолчанию, я думаю, вопрос должен заключаться в том, почему я получаю перенаправление вместо моего приложения?   -  person nbroeking    schedule 02.03.2018
comment
Ах, посмотрите на заголовок Location: - там написано https :. Сервер сообщает браузеру, что ему нужно перенаправить на https с http. Также есть заголовок Strict-Transport-Security - это инструкция для браузера, что он должен ВСЕГДА обращаться к этому домену (включая поддомены с дополнительной аннотацией в заголовке) по https. Я не верю, что это значение по умолчанию для входящего - так это исходит из вашего приложения?   -  person Jonah Benton    schedule 02.03.2018
comment
Нет, я дважды проверил. Это не из приложения. Что интересно, если я использую вход по умолчанию, все работает. В этом входе есть что-то, что не позволяет маршрутизировать этот трафик.   -  person nbroeking    schedule 04.03.2018
comment
Хорошо, попробуйте это - curl -v myserver: 30652 / whoop. Это должно сработать (если, конечно, сертификат соответствует домену). Также обратите внимание на github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/ и github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/. Вот что с тобой происходит. Попробуйте добавить в конфигурационную карту ssl-redirect: false и hsts: false.   -  person Jonah Benton    schedule 04.03.2018


Ответы (3)


Ключевым моментом здесь является присвоение имени хосту, в противном случае правило входа применяется к серверу по умолчанию, который по умолчанию настроен для перенаправления HTTP на HTTPS.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /whoop
        backend:
          serviceName: test-deployment-service
          servicePort: 80

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

person David Stephenson    schedule 23.03.2018
comment
Вот и получилось !! Спасибо! - person nbroeking; 24.03.2018

У меня была та же проблема, но я не хотел добавлять значение host. Чтобы предотвратить перенаправление HTTP на HTTPS сервером по умолчанию, например Дэвид, вместо этого я добавил эту аннотацию к входящему запросу, и он исправлен это для меня: nginx.ingress.kubernetes.io/ssl-redirect: "false".

Теперь мой рабочий вход выглядит так:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.class: "internal-nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - http:
      paths:
      - path: /*
        backend:
          serviceName: app1
          servicePort: 80
      - path: /app2/*
        backend:
          serviceName: app2
          servicePort: 80
person JessG    schedule 27.06.2018

У меня возникли проблемы с перенаправлением HTTP-вызовов на HTTPS (проверено с помощью журналов скрипачей).

Добавление этого в мой файл yml заставило меня работать.

Аннотации:

nginx.ingress.kubernetes.io/ssl-redirect: "false"
person jayozeus    schedule 08.01.2021