在 Kubernetes 的 Nginx Ingress 对象中设置代理通道的最佳方法是啥

Posted

技术标签:

【中文标题】在 Kubernetes 的 Nginx Ingress 对象中设置代理通道的最佳方法是啥【英文标题】:What is the Best way to Setup Proxy Pass in an Nginx Ingress object for Kubernetes在 Kubernetes 的 Nginx Ingress 对象中设置代理通道的最佳方法是什么 【发布时间】:2019-09-20 06:57:11 【问题描述】:

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

ProxyPass /something http://example.com/something
ProxyPassReverse /something http://example.com/something

我想在 nginx 入口中模仿这一点

首先我尝试使用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

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

模拟这个代理通道的最佳方法是什么?

【问题讨论】:

【参考方案1】:

首先你可以为你的 nginx 入口控制器使用自定义配置,文档可以找到here

另外,如果你只是想使用 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

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

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

kubectl logs nginx-ingress-controller-xxxxx

希望对你有帮助!

【讨论】:

这正是我必须做的。我不明白每个入口都是它自己的proxy_pass。当我了解到这一切非常简单地结合在一起时。 @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 服务指令? @AnjanaDyna 检查这个kubernetes.github.io/ingress-nginx/user-guide/…

以上是关于在 Kubernetes 的 Nginx Ingress 对象中设置代理通道的最佳方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes入口中基于Traefik路径的路由无法按预期工作

kubernetes下的Nginx加Tomcat三部曲之二:细说开发

当我拥有 Kubernetes 时,nginx 的意义何在?

使用 nginx 反向代理在 Kubernetes 中公开服务

Kubernetes Ingress Nginx 加载资源 404

Kubernetes Nginx Ingress 找不到服务端点