Juil 15 2021

Chart Helm ProxySQL ⎈ Charger les Requêtes SQL au Démarrage

Publié par à 5:00 sous Docker,Kubernetes,Mysql

ProxySQL est un outil puissant qui relaye le trafic à des backends Mysql multiples. La configuration est lue dans proxysql.cnf qui est chargé au démarrage du démon. Ce qui est parfait d’un point de vue Docker. Vous pouvez modifier le fichier et relancer avec les nouveaux paramètres. A présent, j’ai besoin d’un chart Hell ProxySQL pour déployer sur mon cluster Kubernetes.


Chart Helm ProxySQL Officiel

J’ai essayé d’utiliser le chart Helm de l’équipe ProxySQL mais ai vite rencontré quelques problèmes.
L’image sur docker hub n’a pas été mise à jour depuis quelques temps. Le chart Helm ne semble plus être maintenue non plus alors qu’ils avaient fait un travail fantastique.

La configuration est lue dans proxysql.cnf. Il serait intéressant de la charger depuis Values.yaml, pour la rendre dynamique à chaque déploiement.
J’utilise principalement les règles mysql_query_rules_fast_routing mais voici le souci: Elles ne peuvent pas être configurées dans proxysql.cnf et les développeurs de ProxySQL ont clairement dit que ce n’était pas au programme.


Image Docker avec le Client Mysql

Le docker ProxySQL ne contient pas le client Mysql probablement pour garder l’image plus petite. Vous en aurez besoin pour injecter les requêtes SQL localement quand le pod démarre. Le dockerfile est très simple mais vous oblige à maintenir votre propre image.

FROM proxysql/proxysql:2.2.0

RUN apt update && apt -y install mysql-client && apt clean all

ENTRYPOINT ["proxysql", "-f", "-D", "/var/lib/proxysql"]


J’ai fait une image accessible directement sur Dockerhub. Elle est référencée dans le chart helm mais vous pouvez builder la votre si vous souhaitez la stocker sur un dépôt privé.


Les Règles mysql_query_rules_fast_routing

J’ai décidé d’apporter quelques changements au template Helm pour qu’il puisse lire les règles SQL depuis le fichier Values, et les injecter dans ProxySQL dynamiquement une fois le pod démarré.

sqlqueries: |
   --
   SET mysql-have_ssl='true';
   LOAD MYSQL VARIABLES TO RUNTIME;
   SET admin-web_enabled='true';
   LOAD ADMIN VARIABLES TO RUNTIME;
   --
   INSERT INTO mysql_servers (hostgroup_id,hostname) VALUES (0,'db1.domain.lan');
   INSERT INTO mysql_servers (hostgroup_id,hostname) VALUES (1,'db2.domain.lan');
   --
   INSERT INTO mysql_users (username,password,use_ssl,default_hostgroup) VALUES ('proxy','*9EF51D21B4A3E7BC7A58925308F229CF4AEEC9E1',1,0);
   --
   INSERT INTO mysql_query_rules_fast_routing (username,schemaname,destination_hostgroup, comment) VALUES ('proxy','schema1',0,'');
   INSERT INTO mysql_query_rules_fast_routing (username,schemaname,destination_hostgroup, comment) VALUES ('proxy','schema2',1,'');
   --
   LOAD MYSQL USERS TO RUNTIME;
   LOAD MYSQL SERVERS TO RUNTIME;
   LOAD MYSQL QUERY RULES TO RUNTIME;


Les requêtes SQL sont ajoutées au fichier Values.yaml, chargées dans la configmap et montées en tant que fichier dans /docker-entrypoint-initdb.d/sqlqueries. Nous pouvons ensuite les injecter une fois que le démon est lancé. C’est possible grâce à la commande poststart qui est lancée juste après que la commande de l’entrypoint du docker a été exécutée.

lifecycle:
   postStart:
     exec:
       command: ["/bin/sh", "-c", "sleep 1 && mysql --show-warnings -uadmin -padmin -h127.0.0.1 -P{{ .Values.pod.adminPort }} < /docker-entrypoint-initdb.d/sqlqueries"]


Utiliser le Chart Helm

Le chart helm est disponible sur github. Clonez le repo, créez votre propre fichier Values en vous basant sur example.yaml et déployez le chart Helm.

helm install -n my-release -f myconf.yaml ./proxysql


Lisez cet article si vous souhaitez activer et accéder au serveur de stats ProxySQL.


Importer son Propre Cert Autosigné

Proxysql 2.3.0 est maintenant capable de recharger le certificat SSL/TLS certificate à la volée.
Avant ça, vous auriez dû builder le conteneur proxysql pour embraquer les certificats CA et Mysql, le rendant statique de fait.
Avec cette nouvelle fonctionnalité, vous avez juste à créer un secret TLS Kubernetes comprenant le ca.crt, tls.cert et key.crt qui seront montés par le chart Helm ProxySQL.

Décommentez la série de commandes correspondante qui remplaceront les certificats auto-générés ProxySQL grâce à l’instruction SYSTEM de Mysql.


No responses yet

Comments RSS

Leave a Reply