Nginx Ingress 4层代理笔记

Nginx Ingress Controller 在 Kubernetes 中充当了一个代理和负载均衡器的角色,它可以根据 Ingress 资源的规则将外部的 HTTP/HTTPS 流量转发到集群内部的服务。然而,对于非 HTTP/HTTPS 的流量,例如 TCP/UDP,Nginx Ingress Controller 也提供了代理的功能,但它并不是通过 Ingress 资源来配置,而是需要通过 ConfigMap 进行配置。

以下是 Nginx Ingress 的 TCP 代理的工作原理:

  1. 集群外部的 TCP 连接请求:当有一个来自集群外部的 TCP 连接请求到达 Nginx Ingress Controller 时,Nginx 会根据这个请求的目标端口来决定如何处理这个请求。
  2. ConfigMap 配置:Nginx Ingress Controller 会读取一个特定的 ConfigMap(通常名为 tcp-servicesudp-services),在这个 ConfigMap 中,你可以定义一个端口到服务的映射。这个映射告诉 Nginx Ingress Controller,对于到达特定端口的 TCP 请求,应该将其转发到哪个服务。
  3. TCP 请求转发:根据 ConfigMap 的配置,Nginx Ingress Controller 会将 TCP 请求转发到对应的服务。这个服务可以是集群内的任何服务,不论它是运行在哪个 Namespace 中,或者是使用哪种协议。
  4. 服务响应:当服务处理完请求并返回响应时,Nginx Ingress Controller 会将这个响应返回给原始的 TCP 客户端。

值得注意的是,Nginx Ingress 的 TCP/UDP 代理比 HTTP/HTTPS 代理少了很多功能,例如基于路径的路由、SSL 终止、主机名路由等。因为 TCP 和 UDP 是传输层协议,它们并不像 HTTP/HTTPS 那样提供丰富的应用层信息,所以 Nginx Ingress Controller 只能根据 TCP/UDP 请求的目标端口来决定如何转发请求。

Nginx Ingress Controller 提供了 TCP 服务的代理功能,但是它并不支持基于路径或主机名的路由,这是因为 TCP 是一种传输层协议,它并不包含这些应用层信息。所以,如果你想要代理 TCP 服务到集群内部的多个服务,你需要为每个服务指定一个唯一的端口。

你可以在一个名为 tcp-servicesudp-services 的 ConfigMap 中定义端口到服务的映射。例如:

apiVersion: v1
kind: ConfigMap
metadata:
  name: tcp-services
  namespace: ingress-nginx
data:
  9000: "default/my-service-1:9000"
  9001: "default/my-service-2:9001"

在这个例子中,所有发送到端口 9000 的 TCP 请求将被转发到名为 my-service-1 的服务的端口 9000,所有发送到端口 9001 的 TCP 请求将被转发到名为 my-service-2 的服务的端口 9001。

请注意,你需要在 Nginx Ingress Controller 的部署配置中添加一个参数,指定这个 ConfigMap 的名称。例如:

args:
  - /nginx-ingress-controller
  - --configmap=$(POD_NAMESPACE)/tcp-services

这样,Nginx Ingress Controller 就会加载这个 ConfigMap,并根据它的配置来代理 TCP 请求。

最后,你需要在 Nginx Ingress Controller 的 Service 中公开这些端口,以便外部的 TCP 客户端可以连接到它们。例如:

apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
spec:
  ports:
    - name: http
      port: 80
      targetPort: http
    - name: https
      port: 443
      targetPort: https
    - name: tcp-9000
      port: 9000
      targetPort: 9000
    - name: tcp-9001
      port: 9001
      targetPort: 9001
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

这样,你就可以把集群外部的 TCP 请求转发到集群内部的多个服务了。

tag(s): none
show comments · back · home
Edit with markdown