【问题标题】:Kubernetes Ingress needs Reverse Proxy settingKubernetes Ingress 需要反向代理设置
【发布时间】:2019-10-11 03:09:34
【问题描述】:

在我的 Kubernetes 集群中,我在 Ingress 方面遇到了一些挑战。例如,我通过 Helm 安装了 NodeRed 和 Nginx-ingress。 NodeRed 可通过

获得

现在我创建了一个 Ingress:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: nr-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  tls:
  - secretName: tls-secret1
    hosts:
    - my.server.name
  rules:
  - host: my.server.name
    http:
      paths:
      - path: /nr
        backend:
          serviceName: my-nodered-node-red
          servicePort: 1880

当我执行 Get http://my.server.name/nr 时,我只看到部分工作,请看截图:

在我看来,我错过了反向代理设置。通常我会像这样将这些东西放在 nginx 中的反向代理设置中。但这是不可能的,因为我使用的是 Nginx-ingress。

location / {
     proxy_pass http://localhost:1880/;
    }

但我不知道如何在 Kubernetes 中做到这一点?我想念什么? kubernetes 版本是 1.14.1。

【问题讨论】:

    标签: kubernetes reverse-proxy node-red kubernetes-helm nginx-ingress


    【解决方案1】:

    我没有使用它,所以我不确定它是否有帮助,但您可能想尝试为Proxy redirect 添加注释。

    使用注释nginx.ingress.kubernetes.io/proxy-redirect-fromnginx.ingress.kubernetes.io/proxy-redirect-to 可以在proxied server responseLocationRefresh 标头字段中设置应更改的文本

    在注解nginx.ingress.kubernetes.io/proxy-redirect-from 中设置“off”或“default”会禁用nginx.ingress.kubernetes.io/proxy-redirect-to,否则必须同时使用这两个注解。注意每个注解必须是一个不带空格的字符串。

    默认情况下,每个注释的值为“关闭”。

    您也可以使用ConfigMap 自定义您的 Nginx 配置。

    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: nginx-configuration
      namespace: ingress-nginx
      labels:
        app: ingress-nginx
    data:
    
      http-snippet: |
          location = / {       
            proxy_pass http://localhost:1880/;
          }
    

    server-snippets 注释为您的Ingress

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: nr-ingress
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /
        nginx.ingress.kubernetes.io/server-snippet: |
          location = / {       
            proxy_pass http://localhost:1880/;
          }
    spec:
      tls:
      - secretName: tls-secret1
        hosts:
        - my.server.name
      rules:
      - host: my.server.name
        http:
          paths:
          - path: /nr
            backend:
              serviceName: my-nodered-node-red
              servicePort: 1880
    

    我希望这会有所帮助。

    【讨论】:

    • 嗨,很遗憾没有。我试过了,但感谢您的帮助。也许在接下来的几天里我会有一个幸运的发现:-)
    • @Mchoeti,这应该按照 nginx 文档中的说明工作。您是否遇到错误或这不起作用?也许就像 Vasily Angapov 所说的那样。
    • 正在寻找简单的 proxy_pass 解决方案,第二个解决方案效果很好。甚至不需要尝试第一个。谢谢
    【解决方案2】:

    也许答案为时已晚,但我遇到了同样的问题并解决了:

    1-changed httpRoot: '/nr' in node red settings.xml 配置文件(在 kubernetes 中,可能在 PV 中定义)(@vasili-angapov 提到)

    2 组入口:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: nodered-ingress
      annotations:
        kubernetes.io/ingress.class: "nginx"
    spec:
      rules:
        - http:
            paths:
              - path: /nr
                pathType: Prefix
                backend:
                  service:
                    name: nodered
                    port:
                      number: 1880
    

    【讨论】:

      【解决方案3】:

      看起来您的静态内容仍在使用根路径前缀,您可以使用浏览器开发者控制台进行验证。常见的应用程序应该有一个配置,以了解它们在非根路径前缀上运行。您应该在应用程序中找到该配置选项并正确配置它。 Nginx ingress 与此错误无关。

      【讨论】:

      • hm.. 但是当我设置像那个位置 / { proxy_pass localhost:1880; 这样的 NGINX 配置时} 这是工作。我的问题是如何在 Kubernetes 中做到这一点
      • 因为您指定了根路径前缀(位置 /)。在 ingress 中,您指定的是非根路径前缀 (/nr),看到区别了吗?
      • 是的,我看到了区别,但不幸的是,这并不能解决我的问题
      猜你喜欢
      • 2019-07-02
      • 2023-01-03
      • 1970-01-01
      • 2012-01-07
      • 2018-03-12
      • 2023-03-19
      • 2012-03-19
      • 2018-07-18
      • 2019-01-20
      相关资源
      最近更新 更多