Ingress nginx 公开TCP服务

背景

公司业务繁多, HTTP、GRPC、TCP多种协议服务并存,Kubernetes流量入口复杂,所以萌生了通过LoadBalancer + Ingress-nginx 的方式完全的结果入口流量,当然在高并发的场景下可以对LoadBalancer 和Ingress-nginx 进行拆分管理。

HTTP以及GRPC在Ingress上的使用就不过多说明了。 主要验证下ingres-nginx对TCP流量的转发,以及简单窥探下实现逻辑。

搞起

首先先准备好内部TCP环境, 这里使用mysql作为测试服务,使用如下命令对服务进行部署。

cat > mysql.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-master
  labels:
    name: mysql-master
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql-master
      name: mysql-master
  template:
    metadata:
      labels:
        app: mysql-master
        name: mysql-master
    spec:
      containers:
      - name: mysql-master
        image: mysql:9
        imagePullPolicy: Always
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "123456"
---
kind: Service
apiVersion: v1
metadata:
  name: mysql
  namespace: default
spec:
  type: ClusterIP
  clusterIP: None
  ports:
   - name: mysql
     port: 3306
  selector:
    name: mysql-master
---
# 创建ingress tcp转发用到的configmap
apiVersion: v1
kind: ConfigMap
metadata:
  name: tcp-services
  namespace: ingress-nginx
data:
  9000: "default/mysql:3306"
EOF
kubectl apply -f mysql.yaml

ingress对于TCP与UDP的转发通过增加--tcp-services-configmap--udp-services-configmap参数配置,用于指定配置保存的configmap。
configmap 格式如下:
<external port>:<namespace/service name>:<service port/name>:[PROXY]:[PROXY]

  • external port:表示ingress对外暴露的端口,需要在ingress service进行添加。 下一步添加。
  • <namespace/service name>:service 所在的namespace及名称。
  • <service port/name>:service的名称或端口。
  • [PROXY]:[PROXY]:TCP 服务中使用代理协议解码 (listen) 和/或编码 (proxy_pass)。第一个PROXY控制代理协议的解码,第二个PROXY控制使用代理协议的编码。(可选)

拓展( PROXY Protocol )

什么是 PROXY Protocol ? 其实很简单,就是为了解决多层NET或TCP转发时 无法获取客户端真实IP的问题,在 TCP 第一行加入了一些信息标识协议、客户端地址、转发地址以及端口等。目前有 v1 和 v2 两个版本。

开源版本支持:

  • HTTP 的 PROXY 协议:NGINX Open Source 1.5.12及更高版本
  • TCP 客户端 PROXY 协议:NGINX Open Source 1.9.3及更高版本
  • 接受 TCP 的 PROXY 协议:NGINX Open Source 1.11.4及更高版本
  • PROXY 协议 v2:NGINX Open Source 1.13.11及更高版本
    NGINX Open Source 默认不包含HTTP和Stream TCP的 Real-IP 模块;

一般获取客户端真实IP有以下2种方案:

HTTP:

  • 使用 X-Forwarded-For(XFF)头
  • Proxy Protocol + X-Forwarded-For

TCP:

  • Proxy Protocol + nginx日志分析
  • 基于网络层信息获取(toa)

然后接着说, 需要对ingress-nginx service 开启相应的端口转发,增加如下配置。

    - name: proxied-tcp-9000
      port: 9000
      targetPort: 9000
      protocol: TCP

最后,修改ingress-nginx deployment , 在启动参数中加入如下配置,用来更新nginx 关于TCP/UDP的转发配置。

args:
    - /nginx-ingress-controller
    - --tcp-services-configmap=ingress-nginx/tcp-services

完结~撒花🎉~~

参考

nginx-ingress 服务架构图
在这里插入图片描述
根据配置的信息自动加载后端IP、Port (https://github.com/kubernetes/ingress-nginx/blob/main/rootfs/etc/nginx/lua/tcp_udp_balancer.lua)
在这里插入图片描述

您想了解关于在 Kubernetes 中使用 Nginx 部署 SSL 的方法吗?如果是这样,您可以按照以下步骤进行操作: 1. 生成 SSL 证书和密钥 您可以使用 OpenSSL 工具生成 SSL 证书和密钥。例如,使用以下命令生成一个自签名的 SSL 证书和密钥: ``` openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=example.com" ``` 2. 创建 Kubernetes 密钥和证书对象 使用 kubectl 命令创建 Kubernetes 密钥和证书对象: ``` kubectl create secret tls tls-secret --key tls.key --cert tls.crt ``` 3. 部署 Nginx Ingress Controller 您可以使用 Helm 安装 Nginx Ingress Controller,例如: ``` helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm repo update helm install my-release ingress-nginx/ingress-nginx ``` 4. 配置 Ingress 路由 在您的应用程序 Ingress 路由中添加以下注释来启用 SSL: ``` apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: my-ingress annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true" nginx.ingress.kubernetes.io/ssl-passthrough: "true" nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" spec: tls: - hosts: - example.com secretName: tls-secret rules: - host: example.com http: paths: - path: / backend: serviceName: my-service servicePort: 80 ``` 其中: - `nginx.ingress.kubernetes.io/ssl-redirect: "true"` 启用所有流量重定向到 HTTPS。 - `nginx.ingress.kubernetes.io/ssl-passthrough: "true"` 配置 SSL 透传。 - `nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"` 告诉 Nginx 与后端服务通信时使用 HTTPS 协议。 - `tls` 部分定义了 SSL 证书和密钥。 - `rules` 部分定义了路由规则。 在这个例子中,所有的流量都将被重定向到 HTTPS,并且 SSL 透传将被启用。请注意,这需要在 Nginx Ingress Controller 中启用 TCP/UDP 透传。 希望这些步骤能帮助到您。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值