如何管理同一主机名上的两个路径?

问题描述 投票:0回答:2

我正在使用

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 资源文件来访问我的两个服务?

kubernetes nginx kubernetes-ingress nginx-ingress
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-service,对 http://web.example.com/app2 的请求将转到 app2-服务。

注意:我删除了您的

nginx.ingress.kubernetes.io/rewrite-target
注释,因为您在此示例中没有进行任何基于正则表达式的路径重写。


我在网上放置了一个可部署的示例这里


0
投票

只需在单个入口中删除您的rewritepath即可实现它。

如果您要创建多个,请确保按照 Larsks 的建议更改名称,否则它将覆盖现有名称。

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
© www.soinside.com 2019 - 2024. All rights reserved.