如何使用nginx-ingress进行proxy_pass?

Pet*_*ang 3 kubernetes nginx-ingress

我想设置一个 k8s 集群,但我对 nginx-ingress 控制器和我需要设置的一些特殊设置感到绝望:尤其是 proxy_pass。

我已经尝试使用“server-snippet”-snippet 来实现这一点,但是没有用。

apiVersion: networking.k8s.io/v1beta1 # for versions before 1.14 use extensions/v1beta1
kind: Ingress
metadata:
    name: ingress
    annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /$1
        nginx.ingress.kubernetes.io/affinity: "cookie"
        nginx.ingress.kubernetes.io/session-cookie-name: "route"
        nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
        nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
        nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
        nginx.ingress.kubernetes.io/ssl-redirect: "false"
        nginx.ingress.kubernetes.io/hsts: "false"
        nginx.ingress.kubernetes.io/server-snippet: |
            location / {
                internal;
                proxy_set_header X-Forwarded-Host $host;
                proxy_set_header X-Forwarded-Server $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_buffering off;

                proxy_pass http://localhost:30022/site/;
                proxy_redirect default;
                proxy_cookie_path /site/ /;
            }
spec:
    rules:
        - host: preview.test.de
          http:
              paths:
                  - path: /
                    backend:
                        serviceName: backend-service
                        servicePort: 8080

Run Code Online (Sandbox Code Playgroud)

我想要实现的是这个 nginx 配置:

location / {
                internal;
                proxy_set_header X-Forwarded-Host $host;
                proxy_set_header X-Forwarded-Server $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_buffering off;

                proxy_pass http://localhost:30022/site/;
                proxy_redirect default;
                proxy_cookie_path /site/ /;
            }
Run Code Online (Sandbox Code Playgroud)

在最佳世界中,我希望实现 proxy_pass 指令中的主机和端口将取决于我要连接的后端 pod,因此没有硬编码端口。

谁能帮我解决这个问题?

cew*_*ood 7

我相信你正在寻找的是:

nginx.ingress.kubernetes.io/rewrite-target: /site

然而,这实际上意味着您只能将此特定入口实例用于此应用程序或其他类似应用程序,因为此重写将适用于该入口实例的所有规则。

您也许可以使用基于正则表达式的规则来完成同样的事情,但这种方法绝对更简单。

关于如何处理需要重写的两个不同路径的问题,使用以下入口配置应该是可能的:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
    name: ingress
    annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /$1
        nginx.ingress.kubernetes.io/use-regex: true
spec:
    rules:
        - host: preview.test.de
          http:
              paths:
                  - path: /(site/.*)
                    backend:
                        serviceName: backend-service
                        servicePort: 8080
                  - path: /(cms/.*)
                    backend:
                        serviceName: cms-service
                        servicePort: 8080
Run Code Online (Sandbox Code Playgroud)

然而,正如您可能猜到的,如果您最终拥有许多路径并随后进行大量重写,这可能会变得更加困难。

至于配置此类设置的最佳实践,我通常建议采用子域。为您想要访问的每个站点/路径设置一个,并让他们拥有自己独特的 nginx/ingress/etc 来根据需要处理他们的重写。然后,如果您想稍后将它们结合到某个其他顶级域/站点中,这很容易完成,而且不必在一个位置管理许多重写规则,这会变得非常混乱。