Я пытаюсь развернуть MySQL в своем кластере Kubernetes. У меня есть контроллер входящего трафика 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, это не так.
Со стороны кластера:
$ 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
и установить targetPort: 8080
на Service
объект, чтобы проверить, работает ли он с простым эхо-сервером TCP. Работает отлично.
$ 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
После тщательного исследования выяснилось, что проблема сводится к тому, что MySQL / MariaDB не поддерживает Host SNI. Таким образом, невозможно использовать маршрутизацию TCP в Traefik или других контроллерах входящего трафика.