Как управлять двумя путями на одном имени хоста?

Я использую Kubernetes v1.23.16 cluster (One master and three workers) голое железо.

Я создал пару сервисов в отдельном пространстве имен. То же, что и ниже.

$ 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                  11d
app1          app1-service      ClusterIP   10.103.151.235   <none>        80/TCP                   19h
app2          app2-service      ClusterIP   10.105.88.151    <none>        80/TCP                   11d
kube-system   kube-dns          ClusterIP   10.96.0.10       <none>        53/UDP,53/TCP,9153/TCP   11d

Теперь у меня ниже nginx resource yml доступ к сервису снаружи. Например, я хотел бы получить доступ, как указано ниже.

  1. http://web.example.com/app1
  2. http://web.example.com/app2
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  name: app-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: web.example.com
    http:
      paths:
      - path: /app1
        pathType: Prefix
        backend:
          service:
            name: app1-service
            port: 
              number: 80

      - path: /app2
        pathType: Prefix
        backend:
          service:
            name: app2-service
            port:
              number: 80

Когда я применяю файл nginx resource yml, он говорит service not found ошибка.

$ kubectl describe ingress app-ingress
Name:             app-ingress
Labels:           <none>
Namespace:        default
Address:
Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
  Host             Path  Backends
  ----             ----  --------
  web.example.com
                   /app1    app1-service:80 (<error: endpoints "app1-service" not found>)
                   /app2    app2-service:80 (<error: endpoints "app2-service" not found>)
Annotations:       nginx.ingress.kubernetes.io/rewrite-target: /$2

Поскольку мои службы приложений работают в разных пространствах имен отдельно, а мой nginx resource yml работает в default пространстве имен. Итак, как мне настроить файл ресурсов nginx для доступа к обоим моим сервисам?

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
0
0
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ресурс Ingress может ссылаться только на службы в том же пространстве имен, что и Ingress. Чтобы управлять двумя путями на одном и том же имени хоста, ведущими к бэкендам в разных пространствах имен, вам потребуются два отдельных ресурса Ingress.

В пространстве имен app1:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  namespace: app1
spec:
  ingressClassName: nginx
  rules:
  - host: web.example.com
    http:
      paths:
      - path: /app1
        pathType: Prefix
        backend:
          service:
            name: app1-service
            port:
              number: 80

И в пространстве имен app2:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  namespace: app2
spec:
  ingressClassName: nginx
  rules:
  - host: web.example.com
    http:
      paths:
      - path: /app2
        pathType: Prefix
        backend:
          service:
            name: app2-service
            port:
              number: 80

При наличии этих ресурсов запросы на http://web.example.com/app1 будут отправляться в службу app1, а запросы на http://web.example.com/app2 — в app2. -услуга.

NB: я удалил вашу аннотацию nginx.ingress.kubernetes.io/rewrite-target, потому что в этом примере вы не выполняете переписывание пути на основе регулярных выражений.


Я разместил развертываемый пример онлайн здесь.

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

Если вы создаете множественное число, обязательно измените имя, как предложил Ларск, иначе оно перезапишет существующее.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: web.example.com
    http:
      paths:
      - path: /app1
        pathType: Prefix
        backend:
          service:
            name: app1-service
            port: 
              number: 80

      - path: /app2
        pathType: Prefix
        backend:
          service:
            name: app2-service
            port:
              number: 80

Другие вопросы по теме

Похожие вопросы