好看的公司网站,深圳宝安网站建设学习网,网站后台 行间距调整,高性能网站建设文章目录 背景搞起拓展( PROXY Protocol )参考 背景
公司业务繁多#xff0c; HTTP、GRPC、TCP多种协议服务并存#xff0c;Kubernetes流量入口复杂#xff0c;所以萌生了通过LoadBalancer Ingress-nginx 的方式完全的结果入口流量#xff0c;当然在高并发的场景下可以对… 文章目录 背景搞起拓展( PROXY Protocol )参考 背景
公司业务繁多 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-masterlabels:name: mysql-masternamespace: default
spec:replicas: 1selector:matchLabels:app: mysql-mastername: mysql-mastertemplate:metadata:labels:app: mysql-mastername: mysql-masterspec:containers:- name: mysql-masterimage: mysql:9imagePullPolicy: Alwaysports:- containerPort: 3306env:- name: MYSQL_ROOT_PASSWORDvalue: 123456
---
kind: Service
apiVersion: v1
metadata:name: mysqlnamespace: default
spec:type: ClusterIPclusterIP: Noneports:- name: mysqlport: 3306selector:name: mysql-master
---
# 创建ingress tcp转发用到的configmap
apiVersion: v1
kind: ConfigMap
metadata:name: tcp-servicesnamespace: ingress-nginx
data:9000: default/mysql:3306
EOF
kubectl apply -f mysql.yamlingress对于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 nameservice 所在的namespace及名称。service port/nameservice的名称或端口。[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 协议 v2NGINX Open Source 1.13.11及更高版本 NGINX Open Source 默认不包含HTTP和Stream TCP的 Real-IP 模块
一般获取客户端真实IP有以下2种方案
HTTP:
使用 X-Forwarded-ForXFF头Proxy Protocol X-Forwarded-For
TCP:
Proxy Protocol nginx日志分析基于网络层信息获取(toa)
然后接着说 需要对ingress-nginx service 开启相应的端口转发增加如下配置。 - name: proxied-tcp-9000port: 9000targetPort: 9000protocol: TCP
最后修改ingress-nginx deployment , 在启动参数中加入如下配置用来更新nginx 关于TCP/UDP的转发配置。
args:- /nginx-ingress-controller- --tcp-services-configmapingress-nginx/tcp-services
完结撒花
参考
nginx-ingress 服务架构图 根据配置的信息自动加载后端IP、Port https://github.com/kubernetes/ingress-nginx/blob/main/rootfs/etc/nginx/lua/tcp_udp_balancer.lua