使用 Traefik v2 在 Kubernetes 上运行 MySQL

使用 Traefik v2 在 Kubernetes 上运行 MySQL

我正在尝试在 Kubernetes 集群上部署 MySQL。我有 Traefik v2 入口控制器,并且正在使用IngressRouteTCPCRD。

这是我的Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: db
  name: db
spec:
  replicas: 1
  selector:
    matchLabels:
      app: db
  template:
    metadata:
      labels:
        app: db
    spec:
      containers:
        - image: mariadb:10.5
          name: db
          env:
            MYSQL_ROOT_PASSWORD: foobar
          ports:
            - containerPort: 3306
              name: mysql

这是我的Service

apiVersion: v1
kind: Service
metadata:
  name: db
spec:
  selector:
    app: db
  ports:
    - name: mysql
      port: 3306

这是我的IngressRouteTCP

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteTCP
metadata:
  name: db
spec:
  entryPoints:
    - mysql
  routes:
    - match: HostSNI(`*`)
      kind: Rule
      services:
        - name: db
          port: 3306

我已经mysql为端口创建了一个入口点3306

当我部署这些对象时,我会从集群内部测试连接:

$ kubectl exec -it ubuntu -- mysql -h db -p -e 'SHOW DATABASES'
Enter password: 
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
$

因此一切都正常,但是当通过 Traefik ingress 公开服务器时,却不行。

从集群外部:

$ nmap -Pn -p 3306 db.myserver
Starting Nmap 7.80 ( https://nmap.org ) at 2020-07-25 09:13 GMT
Nmap scan report for db.myserver ([CENSORED])
Host is up (0.063s latency).

PORT     STATE SERVICE
3306/tcp open  mysql

Nmap done: 1 IP address (1 host up) scanned in 0.24 seconds

端口已打开,但侦听器未接收连接......

$ mysql -h db.myserver --connect-timeout=10 -p -e 'SHOW DATABASES'
Enter password: 
ERROR 2013 (HY000): Lost connection to MySQL server at 'handshake: reading inital communication packet', system error: 110

有任何想法吗?

编辑 2020-07-25 17:46

我替换了mariadb:10.5该对象containous/whoamitcp:latest并对其进行了设置,以检查它是否能与简单的 TCP 回显服务器配合使用。它运行完美。targetPort: 8080Service

$ nc db.myserver 3306
FOO
Received: FOO

编辑 2020-07-25 18:30

containous/whoamitcp:latest再次替换为mariadb:10.5,我看到了一些奇怪的事情。如果我在外部执行 netcat,它会挂起,但如果我输入一些内容,它会打印出适当的 MySQL/MariaDB 术语。见下文:

$ nc db.myserver 3306
SOME INPUT
m
5.5.5-10.5.4-MariaDB-1:10.5.4+maria~focal`9:Y0#_5-+v24Ptvvk9xpmysql_native_password!#08S01Got packets out of order

编辑 2020-07-25 19:06

我在我的机器上设置了 Minikube,设置了 Traefik 并将其部署在那里。它运行完美。所以这似乎是 Scaleway 的问题,我在其上运行 Kubernetes 集群的云提供商(Kapsule)。

$ nc 172.17.0.3 31269
m
5.5.5-10.5.4-MariaDB-1:10.5.4+maria~focal   e}d\!/e1-`tGFgVY<^DxQmysql_native_password

答案1

经过彻底调查,问题似乎归结为 MySQL/MariaDB 不支持主机 SNI。因此无法在 Traefik 或其他入口控制器中使用 TCP 路由。

相关内容