如何将请求代理到 Kubernetes 中的外部端口?

How can I proxy requests to an External Port in Kubernetes?

我在本地网络的一个端口上有一个 Web 服务 运行,暴露在端口 6003 上。我在同一网络上的另一台机器上也有一个 Kubernetes 集群 运行,它使用 Nginx代理集群中所有服务的入口。如何设置代理到机器的入口?我有一个有效的设置。但是现在,我要么在 nginx pod 上收到 DNS 错误,要么在浏览器中响应超时,但没有任何反应。

这是我一直在使用的清单。

apiVersion: v1
kind: Service
metadata:
  name: myservice-service
spec:
  type: ExternalName
  externalName: 192.xxx.xx.x
ports:
  - name: myservice
    port: 80
    protocol: TCP
    targetPort: 6003
---
apiVersion: v1
kind: Endpoints
metadata:
  name: myservice-ip
subsets:
  - addresses:
      # list all external ips for this service
      - ip: 192.xxx.xx.x
    ports:
      - name: myservice
        port: 6003
        protocol: TCP
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: service.example.com
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  rules:
    - host: service.example.com
      http:
        paths:
          - backend:
              serviceName: myservice-service
              servicePort: 80
            path: /
  tls:
    - secretName: secret-prod-tls
      hosts:
        - service.example.com

编辑以获取更多信息: 这个清单确实有效。我意识到你 必须 指定 https 即使入口有一个 tls 块。不过,这仍然在 Nginx-ingress pod 中显示 Lua DNS 错误。

此处不需要 ExternalName。通常的无头服务将完成这项工作:

apiVersion: v1
kind: Service
metadata:
  name: external-ip
spec:
  ports:
  - name: http
    port: 80
  clusterIP: None
  type: ClusterIP
---
apiVersion: v1
kind: Endpoints
metadata:
  name: external-ip
subsets:
- addresses:
  - ip: 172.17.0.5
  ports:
  - name: http
    port: 80

如果上游侦听 HTTPS 请求,您必须在入口资源中指定 nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"。所以,这与后端有关,而不是入口本身。 TLS 配置用于 Ingress(前端),不适用于后端应用程序。