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服务都无法正常访问了。


 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐