我正在尝试在 Kubernetes 集群上部署 MySQL。我有 Traefik v2 入口控制器,并且正在使用IngressRouteTCP
CRD。
这是我的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: 8080
Service
$ 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 路由。