在Kubernetes Traefik Ingress中开放HTTP/HTTPS以外的端口
解决Traefik 1.7在K8s中转发TCP端口(如MySQL 3306)的问题
嗨,很高兴能帮你解决这个问题!你当前使用的Traefik 1.7版本,普通的Ingress资源仅支持HTTP/HTTPS协议,而MySQL这类TCP服务需要用Traefik的TCP路由能力来配置,具体步骤如下:
1. 更新Traefik的端口配置
首先要让Traefik监听3306端口,同时把这个端口暴露到集群外部:
修改Traefik Deployment
在Traefik的Pod模板里,添加3306的容器端口,同时更新启动参数添加对应的entrypoint:
apiVersion: apps/v1 kind: Deployment metadata: name: traefik spec: replicas: 1 selector: matchLabels: app: traefik template: metadata: labels: app: traefik spec: containers: - name: traefik image: traefik:v1.7 args: - --api - --kubernetes - --logLevel=INFO # 添加mysql entrypoint - --entrypoints='Name:http Address::80' - --entrypoints='Name:https Address::443' - --entrypoints='Name:mysql Address::3306' ports: - name: http containerPort: 80 - name: https containerPort: 443 # 添加mysql端口 - name: mysql containerPort: 3306
更新Traefik Service
把3306端口暴露到集群外部(根据你的集群环境选择NodePort或LoadBalancer类型):
apiVersion: v1 kind: Service metadata: name: traefik spec: type: NodePort # 或者 LoadBalancer ports: - name: http port: 80 targetPort: 80 - name: https port: 443 targetPort: 443 - name: mysql port: 3306 targetPort: 3306 nodePort: 30306 # 可选,指定固定NodePort selector: app: traefik
2. 创建TCP路由规则(用Traefik CRD)
Traefik 1.7提供了自定义CRD IngressRoute来支持TCP路由,你需要创建这个资源来把3306端口的流量转发到MySQL Service:
apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: mysql-ingressroute namespace: default # 替换成你的MySQL所在命名空间 spec: entryPoints: - mysql # 对应我们之前定义的entrypoint名称 routes: - match: "HostSNI(`*`)" # TCP协议没有HTTP Host头,用HostSNI匹配所有请求 services: - name: mysql-service # 替换成你的MySQL Service名称 port: 3306
注意:如果你的集群还没安装Traefik的IngressRoute CRD,可以通过Traefik官方提供的CRD定义文件创建,或者检查你之前使用的部署仓库是否已经包含该CRD的安装步骤。
3. 验证配置
配置完成后,等待Traefik Pod重启和路由生效,然后用以下方式测试:
# 用telnet测试端口连通性 telnet <你的集群节点IP> 3306 # 或者用mysql客户端直接连接 mysql -h <集群节点IP> -P 3306 -u <mysql用户名> -p
如果能成功连接,说明配置生效了!
内容的提问来源于stack exchange,提问作者redxlus
相关产品推荐
相关产品推荐

