kubernetes 入口替换路径

kubernetes 入口替换路径

我有两个后端 api 服务:

  1. api-服务-v1
  2. api-服务-v2

均对“/api/”路径做出响应

我已将此配置作为 docker-compose 设置运行良好,其中 nginx 服务用作代理,配置文件如下

/etc/nginx/conf.d/default.conf:

server {
    ...

    location /apiv1/ {
        proxy_pass http://api-service-v1/api/;
    }
    ...

    location /apiv2/ {
        proxy_pass http://api-service-v2/api/;
    }
    ...
}

现在我想将设置部署到 k8s 集群。我被 ingress 配置卡住了。ingress.yml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: dev-ingress
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"

spec:
  rules:
    - host: demo.com
      http:
        paths:
          - pathType: Prefix
            path: "/"
            backend:
              service:
                name: frontend-service
                port:
                  number: 80

          - pathType: Prefix
            path: "/apiv1/"
            backend:
              service:
                name: api-service-v1
                port:
                  number: 80

          - pathType: Prefix
            path: "/apiv2/"
            backend:
              service:
                name: api-service-v2
                port:
                  number: 80

路径“/”可以正常工作。但是路径“/apiv1/”和“/apiv2/”不起作用。

请帮忙。

谢谢!

答案1

入口只会将整个路径转发到服务。

例如,您api-service-v1将收到诸如 https://yourhost/apiv1/asdfq 之类的 URL

如果你希望 ingress 修改用于访问服务的路径,你需要告诉它重写,如下所述:https://kubernetes.github.io/ingress-nginx/examples/rewrite/

path将api-service 路径分别更改为/apiv1(/|$)(.*)/apiv2(/|$)(.*)

然后添加nginx.ingress.kubernetes.io/rewrite-target: /api$1$2注释。

不幸的是,这也意味着您的 / 需要位于另一个入口,否则对前端的请求也将被重写以命中/api/您的前端服务。

答案2

我正在尝试做同样的事情,但只使用一个 api 和前端。我无法让它工作... 只使用一个入口可以吗?

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: dev-ingress
  annotations:

spec:
  rules:
    - host: demo.com
      http:
        paths:
          - pathType: Prefix
            path: "/"
            backend:
              service:
                name: frontend
                port:
                  number: 80

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

相关内容