Кубернетес Входная дорожка переписывает - PullRequest
0 голосов
/ 02 марта 2019

Я запускаю Ingress для некоторых служб в Kubernets, и хотя службы перенаправляют на эти IP-адреса кластера (несколько корректно), я не уверен, как правильно разрешать пути после этих базовых путей, например, еслиУ меня есть Tomcat на пути / и Nginx на пути /nginx, любой путь Tomcat после / не разрешается, и ни один путь Nginx не разрешается даже для /.У меня уже установлено nginx.ingress.kubernetes.io/rewrite-target: / в моем ingress.yaml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: tomcat-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
  namespace: kube-system
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: tomcat-deployment-service 
          servicePort: 8080
      - path: /nginx
        backend:
          serviceName: nginx-deployment-service 
          servicePort: 80

Если Tomcat требует, например, файл /main.css, браузер попытается получить /main.css, но это вернет default-backend.

Кроме того, если я пытаюсь посетить /nginx (пытаясь нажать /) на сервере Nginx, Nginx сообщает, что /nginx не найден (очевидно).

2019/03/02 08:12:04 [error] 8#8: *343 open() "/usr/share/nginx/html/nginx" failed (2: No such file or directory), client: 10.128.0.7, server: localhost, request: "GET /nginx HTTP/1.1", host: "REDACTED_SERVER_IP"
10.128.0.7 - - [02/Mar/2019:08:12:04 +0000] "GET /nginx HTTP/1.1" 404 153 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:65.0) Gecko/20100101 Firefox/65.0" "REDACTED_CLIENT_IP, REDACTED_SERVER_IP"
10.40.1.1 - - [02/Mar/2019:08:12:05 +0000] "GET /nginx HTTP/1.1" 404 153 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:65.0) Gecko/20100101 Firefox/65.0" "REDACTED_CLIENT_IP, REDACTED_SERVER_IP"
2019/03/02 08:12:05 [error] 8#8: *344 open() "/usr/share/nginx/html/nginx" failed (2: No such file or directory), client: 10.40.1.1, server: localhost, request: "GET /nginx HTTP/1.1", host: "REDACTED_SERVER_IP"

Как я могу сделать пути после указанного path в ingress.yaml разрешить с учетом начальной части пути, как видно из службы?

т.е.

  1. Если Tomcat был подключен к /tomcat, как я могу сделать так, чтобы /tomcat/main.css отображался как /main.css на сервере Tomcat (а не преобразовывался в резервную копию по умолчанию)?
  2. Если Nginx был подключен к/nginx, как я могу заставить /nginx отображаться как / на сервере Nginx (а не как /nginx)?

Я думал, что именно это /rewrite-target предполагалосьделать.

Нужно ли использовать групповые символы или что-то еще?

Мой вход следующий:

Name:             tomcat-ingress
Namespace:        kube-system
Address:          REDACTED_SERVER_IP
Default backend:  default-http-backend:80 (10.40.0.6:8080)
Rules:
  Host  Path  Backends
  ----  ----  --------
  *         
        /        tomcat-deployment-service:8080 (10.40.2.15:8080)
        /nginx   nginx-dep-ser:80 (10.40.0.26:80,10.40.1.46:80)
Annotations:
  ingress.kubernetes.io/url-map:                     k8s-um-kube-system-tomcat-ingress--b0fc8aa23db1001d
  kubectl.kubernetes.io/last-applied-configuration:  {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{"nginx.ingress.kubernetes.io/rewrite-target":"/"},"name":"tomcat-ingress","namespace":"kube-system"},"spec":{"rules":[{"http":{"paths":[{"backend":{"serviceName":"tomcat-deployment-service","servicePort":8080},"path":"/"},{"backend":{"serviceName":"nginx-dep-ser","servicePort":80},"path":"/nginx"}]}}]}}

  nginx.ingress.kubernetes.io/rewrite-target:  /
  ingress.kubernetes.io/backends:              {"k8s-be-30985--b0fc8aa23db1001d":"HEALTHY","k8s-be-31229--b0fc8aa23db1001d":"HEALTHY","k8s-be-32736--b0fc8aa23db1001d":"HEALTHY"}
  ingress.kubernetes.io/forwarding-rule:       k8s-fw-kube-system-tomcat-ingress--b0fc8aa23db1001d
  ingress.kubernetes.io/target-proxy:          k8s-tp-kube-system-tomcat-ingress--b0fc8aa23db1001d
Events:
  Type    Reason  Age                From                      Message
  ----    ------  ----               ----                      -------
  Normal  CREATE  33m                nginx-ingress-controller  Ingress kube-system/tomcat-ingress
  Normal  ADD     33m                loadbalancer-controller   kube-system/tomcat-ingress
  Normal  UPDATE  3m (x65 over 33m)  nginx-ingress-controller  Ingress kube-system/tomcat-ingress
  Normal  CREATE  3m (x31 over 33m)  loadbalancer-controller   ip: REDACTED_SERVER_IP

1 Ответ

0 голосов
/ 07 марта 2019

Я полагаю, что у вас достаточно свежая версия входного контроллера, и в соответствии с документацией :

Начиная с версии 0.22.0, входные определения с использованием аннотации nginx.ingress.kubernetes.io/rewrite-target не обратно совместимы с предыдущими версиями.В версии 0.22.0 и более поздних версиях любые подстроки в URI запроса, которые необходимо передать по переписанному пути, должны быть явно определены в группе захвата .

Например:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
  name: tomcat-ingress
  namespace: default 
spec:
  rules:
  - host: rewrite.bar.com
    http:
      paths:
      - backend:
          serviceName: tomcat-deployment-service
          servicePort: 8080
        path: /tomcat/?(.*)
      - backend:
          serviceName: nginx-deployment-service
          servicePort: 80
        path: /nginx/?(.*)

Ваша текущая конфигурация работает хорошо только для / и /nginx адресатов только с последней версией входного контроллера.

Еще один важный момент, объект Ingress должен быть создан в том же самомпространство имен с сервисом (ами), на которое оно ссылается.В противном случае ingress-nginx обычно возвращает ошибку 503 Service Temporarily Unavailable.

И не разрешается ссылаться на службу в другом пространстве имен в serviceName:

метка DNS-1035 должна состоять из буквенно-цифровых символов в нижнем регистре или '-', начинаются с буквенного символа и заканчиваются буквенно-цифровым символом (например, «my-name» или «abc-123», для проверки используется регулярное выражение «az?»)

...