Назад | Перейти на главную страницу

MySQL на Kubernetes с Traefik v2

Я пытаюсь развернуть 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 или других контроллерах входящего трафика.