ingress nginx - 代理到外部 URL

TIP*_*vin 4 nginx kubernetes nginx-ingress

我搜索(很多天以来......)如何使用 Ingress Nginx 以便使用外部 url 作为后端。

是的,我使用带有 externalName 的服务对象。我还在 nginx 中测试了很多指令但没有成功......

目标很简单:

  • 用户只能解析并加入我的公共 URL(url-public.com 和 url-public-2.com)
  • 我想将请求发送到超出我控制范围和集群的外部后端(url-ext.com)

我的入口可以解析 url-ext.com,但用户不能。当然,url-ext.com 这里有适当的证书,并且公开为 HTTPS ;)。注意:我的入口暴露了 2 个 url,但我认为这并不重要。

我的代码:

服务 :

kind: Service
apiVersion: v1
metadata:
  name: external-eip
  namespace: external-url
spec:
  type: ExternalName
  externalName: url-ext.com
Run Code Online (Sandbox Code Playgroud)

入口:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: external-eip
  namespace: external-url
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/upstream-vhost: "url-ext.com"
    nginx.ingress.kubernetes.io/configuration-snippet: |
      #      more_clear_input_headers "Host" "X-Forwarded-Host";
      more_set_input_headers 'Host: url-ext.com';
      proxy_set_header Host url-ext.com;

spec:
  rules:
  - host: url-public.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: external-eip
            port:
              number: 443
  - host: url-public-2.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: external-eip
            port:
              number: 443
Run Code Online (Sandbox Code Playgroud)

结果(curl 或浏览器访问):

<html>
<head><title>504 Gateway Time-out</title></head>
<body>
<center><h1>504 Gateway Time-out</h1></center>
<hr><center>nginx</center>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

和入口日志:

2021/08/06 21:44:45 [error] 10873#10873: *2914631 upstream timed out (110: Operation timed out) while connecting to upstream, client: 10.203.65.14, server: url-public.com, request: "GET / HTTP/2.0", upstream: "https://10.203.64.5:443/", host: "url-ext.com"
Run Code Online (Sandbox Code Playgroud)

10.203.64.5是url-ext.com的真实IP。

curl https://10.203.64.5:443/ -k -v -H "Host: url-ext.com"工作。

不要问我“为什么使用这个注释”,我不知道:p很多谷歌搜索和很多测试......

那么,当这个 externalName(可能)也在 RP 下时,使用 externalName 的正确入口配置是什么?

注意:重写和其他重定向不起作用,因为它重写了用户位置,而我不想要它。用户无法访问和解析 url-ext.com,只能访问和解析 url-public.com。

兄弟,谢谢

TIP*_*vin 6

回复我自己。问题是我的 Ingress(以及我所有的 K8S 集群)都在 HTTP Squid 代理下。

我已经安装了代理的所有环境变量,但似乎 Ingress 容器不使用它......

因此,为了使其正常工作,我允许集群将 80/443 端口出站到目的地。

你只需要这个注释:

    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/upstream-vhost: "url-ext.com"
Run Code Online (Sandbox Code Playgroud)

但是,如果你们中有人知道如何设置我的 Ingress 以使用我的 HTTP 代理,我将需要它。

br