在 Kubernetes 的 Nginx Ingress 对象中设置代理传递的最佳方法是什么

Pab*_*ero 11 proxy nginx kubernetes kubernetes-ingress nginx-ingress

目前,我正在尝试将位于 Apache 负载平衡服务器上的站点迁移到我的 k8s 集群。然而,该应用程序使用 proxypass 和 proxyreversepass 进行了奇怪的设置,如下所示:

ProxyPass /something http://example.com/something
ProxyPassReverse /something http://example.com/something
Run Code Online (Sandbox Code Playgroud)

我想在 Nginx Ingress 中模仿这个

首先,我尝试使用rewrite-target注释,但是它不会保留Location让应用程序再次运行所必需的标头。

然后我尝试proxy-redirect-to/from在特定位置块中放置注释,如下所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: gpg-app-ingress
  annotations:
    nginx.ingress.kubernetes.io/proxy-redirect-from: http://originalapp.com/something
    nginx.ingress.kubernetes.io/proxy-redirect-to: http://example.com/something
spec:
  rules:
  - host: example.com
    http:
      paths:
        - path: /something
          backend:
            serviceName: example-com
            servicePort: 80
Run Code Online (Sandbox Code Playgroud)

我希望能够改用自定义proxy_pass变量,但似乎不可能。

模仿此代理通行证的最佳方法是什么?

coo*_*oid 7

首先,您可以为 nginx 入口控制器使用自定义配置,可以在此处找到文档

此外,如果您只想使用 nginx 入口控制器作为反向代理,则每个入口规则都已经proxy_pass为相关的上游/后端服务创建了指令。

如果路径与您的规则和后端服务相同,那么您不必指定重写规则,只需指定后端服务的路径。但是如果路径不同,那么考虑使用nginx.ingress.kubernetes.io/rewrite-target注释,否则你会得到404 backend错误

因此,要将来自前端的请求重定向http://example.com/something到后端example-com/something,您的入口规则应类似于以下内容

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: gpg-app-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
   #nginx.ingress.kubernetes.io/rewrite-target: /different-path
spec:
  rules:
  - host: example.com
    http:
      paths:
        - path: /something
          backend:
            serviceName: example-com
            servicePort: 80
Run Code Online (Sandbox Code Playgroud)

有关注释的更多解释,请查看Nginx Ingress Annotations

另外,如果出现问题,请考虑检查 nginx-ingress-controller pod 的日志

kubectl logs nginx-ingress-controller-xxxxx
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!

  • @coolinuxoid 当入口规则自动为相关上游/后端服务创建 proxy_pass 指令时,它是 http。对于我的服务,它创建 `proxy_pass http://default-my-ingress-test.myapp.com-myapp-88;` 指令。但相反,我需要它是这样的 https:`proxy_pass https://default-my-ingress-test.myapp.com-myapp-88;`。然后只有我的应用程序可以工作,因为该后端仅接受 https 请求。有没有办法为此目的修改服务的“proxy_pass”指令? (3认同)