k8s traefik tcp 转发需要在部署完deploy和svc后,设置两样东西,一个是ingress,一个是ingressroutetcp。其中一样ingress设置和普通的http转发设置基本一样。这里设置的tcp转发都是非tls的。以设置mysql为例
//mysql-ingressroutetcp.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteTCP
metadata:
name: mysql-ingressroutetcp
namespace: cephfs
spec:
entryPoints:
- "web"
routes:
- match: HostSNI(`*`)
services:
- name: mysql-web
namespace: cephfs
port: 3306
//mysql-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-mysql
namespace: cephfs
spec:
ingressClassName: "traefik"
tls:
- secretName: shell-com-cert
rules:
- host: mysql.shell.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: mysql-web
port:
name: http
这里绑定的svc名为mysql-web,其上
ports:
- name: http
containerPort: 3306
其中ingress设置成功显示如下
//kubectl describe ing ingress-mysql -n cephfs
Name: ingress-mysql
Namespace: cephfs
Address:
Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
TLS:
shell-com-cert terminates
Rules:
Host Path Backends
---- ---- --------
mysql.shell.com
/ mysql-web:http (22.244.7.191:3306)
Annotations: <none>
Events: <none>
ingressroutetcp设置成功可以在traefik的dashboard上查看
我这里tcp转发用的web这个entrypoint ,在traefik对外暴露的端口号是30934
访问mysql就可以配置连接如下
关于tcp转发我查了好多资料,都说要在traefik配置中另开entrypoint,但没讲明原因。开始不理解,等测试通了才知道原因,设置一个服务的tcp转发,如果和其他服务公用一个entrypoint入口点就会有冲突,如果有两个或两个以上tcp服务,在 ingressroutetcp 中的
routes:
- match: HostSNI(`*`)
中也会出现冲突,比如这里先配了mysql的3306端口转发,有配redis的6379端口转发,连接redis可以成功,但再输入任何信息,都会报如下错误
Error: Protocol error, got "J" as reply type byte
tcp转发会跑到3306端口上去,所以配置多个tcp转发时,需要在traefik上设置专有entrypoint入口点的。我这里做过测试,设置ingressroutetcp的入口点位web,也就是常用的80端口的http服务的入口点,会发现tcp的3306转发可以正常运行,但所有非tls服务都无法正常访问了。