Доступ к поддоменам веб-приложения, обрабатываемого nginx-ingress

#kubernetes #shiny #nginx-ingress

#kubernetes #блестящий #nginx-вход

Вопрос:

У меня запущены две службы:

 $kubectl get services
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP          49m
shiny        NodePort    10.110.49.57   <none>        3838:30240/TCP   34m
web          NodePort    10.98.56.71    <none>        80:31758/TCP     39m
 

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

 apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: / 
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - http:
      paths:
      - path: /*
        backend:
          serviceName: web
          servicePort: 80
      - path: /shiny/*
        backend:
          serviceName: shiny
          servicePort: 3838
 

Я получаю желаемое поведение shiny , если получаю к нему прямой доступ через minikube service shiny :

После применения входа поддомены перестают работать:

Почему это происходит? Я хотел бы получить доступ к материалам внутри shiny , из web , через URL-адреса. Например. <iframe src=.../shiny/test1></iframe> .

Ответ №1:

Следующие настройки yaml решили проблему:

 apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - http:
      paths:
      - path: /*
        backend:
          serviceName: web
          servicePort: 80
      - path: /shiny(/|$)(.*)
        backend:
          serviceName: shiny
          servicePort: 3838
 

Источник: https://kubernetes.github.io/ingress-nginx/examples/rewrite /

Редактировать:

Вышесказанное привело к еще большим проблемам в будущем. В конце концов, я выбрал следующую конфигурацию входа:

 apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/configuration-snippet: |
      rewrite /$1 break;
      rewrite /shiny/(.*) /$1 break;
spec:
  rules:
    - http:
        paths:
          - path: /
            backend:
              serviceName: web
              servicePort: 80
          - path: /shiny
            backend:
              serviceName: shiny
              servicePort: 3838
 

Ответ №2:

Nginx использует регулярные выражения для сопоставления путей / местоположений ваших запросов. Попробуйте изменить:

 /shiny/* to /shiny/.*
 

Комментарии:

1. Привет, это не решило проблему. В итоге я просто указал разные имена хостов для каждой службы, теперь она работает так, как ожидалось.