Comment activer le journal des requêtes lentes de MySQL
Agence web » Actualités du digital » Comment exécuter MySQL sur Kubernetes avec l’opérateur d’Oracle

Comment exécuter MySQL sur Kubernetes avec l’opérateur d’Oracle

La prise en charge de Kubernetes pour les applications avec état a considérablement évolué au cours des dernières années. Il est désormais viable de placer votre base de données dans votre cluster, ce qui lui permet de bénéficier de la même évolutivité que vos autres charges de travail.

MySQL est l’un des moteurs de bases de données relationnelles les plus populaires et il est maintenant complété par un opérateur Kubernetes officiel. Le projet open source dirigé par Oracle fournit un moyen simple de créer des clusters MySQL gérés au sein de Kubernetes.

Dans cet article, vous apprendrez à installer l’opérateur et à commencer à provisionner une base de données. L’opérateur crée automatiquement des services afin que les applications de vos autres conteneurs puissent se connecter à MySQL.

Qu’est-ce que l’opérateur MySQL ?

L’opérateur MySQL d’Oracle est un composant qui s’exécute à l’intérieur de votre cluster pour automatiser l’initialisation de la base de données. Vous n’avez pas besoin de l’opérateur pour utiliser MySQL dans Kubernetes. Vous pouvez déployer vous-même l’image de conteneur officielle à l’aide d’un StatefulSet. Cette approche est cependant fastidieuse, vous obligeant à créer et à gérer de longs fichiers manifestes pour créer un environnement fiable.

L’opérateur fournit un ensemble de ressources personnalisées que vous pouvez utiliser pour créer vos bases de données. Ajout d’un InnoDBCluster objet à votre cluster Kubernetes invite l’opérateur à configurer les StatefulSets, le stockage et la mise en réseau pour vous. Il automatise également les mises à niveau et les sauvegardes, réduisant considérablement la charge des administrateurs.

Installation de l’opérateur MySQL

La charte Helm incluse est le moyen le plus simple d’installer l’opérateur dans votre cluster. Les fichiers manifestes sont disponibles comme alternative si vous n’avez pas Helm dans votre environnement.

Ajoutez d’abord l’opérateur à votre liste de référentiel Helm :

$ helm repo add mysql-operator https://mysql.github.io/mysql-operator/

Ensuite, mettez à jour la base de données du référentiel de Helm afin qu’il découvre les graphiques disponibles :

$ helm repo update

Utilisez maintenant la commande suivante pour installer l’opérateur dans un nouvel espace de noms appelé mysql-operator:

$ helm install mysql-operator mysql-operator/mysql-operator 
    --namespace mysql-operator 
    --create-namespace
NAME: mysql-operator
LAST DEPLOYED: Sat Oct 29 15:00:26 2022
NAMESPACE: mysql-operator
STATUS: deployed
REVISION: 1
TEST SUITE: None

Cela peut prendre quelques secondes pour que le processus se termine.

Création d’un secret d’informations d’identification d’utilisateur racine

Chaque cluster de bases de données que vous créez doit être accompagné d’un secret Kubernetes qui contient les informations d’identification de l’utilisateur racine MySQL. L’opérateur créera le compte root privilégié avec le nom d’utilisateur et le mot de passe fournis dans le secret.

Copiez le manifeste YAML suivant et modifiez la valeur du rootPassword champ à quelque chose de sûr. Modifiez également le nom d’utilisateur et les paramètres d’hôte de l’utilisateur si cela s’applique à votre situation. N’oubliez pas que le compte nommé ici aura un contrôle total sur MySQL ; vous devrez configurer des utilisateurs distincts pour vos applications ultérieurement, en utilisant le shell MySQL standard.

apiVersion: v1
kind: Secret
metadata:
  name: mysql-root-user
stringData:
  rootHost: "%"
  rootUser: "root"
  rootPassword: "P@$$w0rd"

Enregistrez le fichier sous secret.yaml. Utilisez maintenant Kubectl pour ajouter le secret à votre cluster :

$ kubectl apply -f secret.yaml
secret/mysql-root-user created

Création d’un cluster de base

Créez ensuite un nouveau fichier YAML appelé mysql.yaml et copiez le contenu suivant :

apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
metadata:
  name: mysql-cluster
spec:
  secretName: mysql-root-user
  instances: 3
  tlsUseSelfSigned: true
  router:
    instances: 1

Ceci définit un objet en utilisant le InnoDBCluster ressource personnalisée offerte par l’opérateur MySQL. L’application du manifeste à votre cluster créera une nouvelle base de données MySQL avec la réplication automatiquement configurée. Vérifiez et modifiez les propriétés suivantes dans le manifeste avant de continuer :

  • spec.secretName – Cela doit correspondre au metadata.name du secret que vous avez créé précédemment. Le secret référencé sera lu pour configurer le compte utilisateur racine MySQL.
  • spec.instances – Cela définit le nombre de répliques MySQL (pods) à exécuter. Jusqu’à 10 répliques sont actuellement prises en charge.
  • spec.tlsUseSelfSigned – Le champ est réglé sur true dans cet exemple pour utiliser le certificat TLS auto-signé inclus. Vous pouvez éventuellement fournir votre propre certificat via un secret Kubernetes en définissant le spec.tlsSecretName/spec.tlsCASecretName des champs.
  • spec.router.instances – Le composant MySQL Router est chargé de diriger le trafic de service entre les répliques MySQL disponibles. Ce champ définit le nombre d’instances du routeur à exécuter. Plusieurs instances amélioreront les performances et la résilience dans les situations de trafic élevé.

Utilisez Kubectl pour appliquer le fichier manifeste et créer votre cluster de bases de données :

$ kubectl apply -f mysql.yaml
innodbcluster.mysql.oracle.com/mysql-cluster created

Le processus d’initialisation de MySQL peut prendre quelques minutes. L’opérateur utilise plusieurs conteneurs d’initialisation pour configurer les comptes d’utilisateurs et configurer le répertoire de données de MySQL. Attendez quelques instants avant de courir kubectl get pods pour vérifier ce qui tourne :

$ kubectl get pods
NAME                                    READY   STATUS    RESTARTS   AGE
mysql-cluster-0                         2/2     Running   0          2m
mysql-cluster-1                         2/2     Running   0          2m
mysql-cluster-2                         2/2     Running   0          2m
mysql-cluster-router-6b68f9b5cb-wbqm5   1/1     Running   0          2m

Les trois répliques MySQL et l’instance de routeur unique se trouvent toutes dans le Running Etat. La base de données est maintenant prête à être utilisée.

Connexion à votre cluster

L’opérateur MySQL crée un service Kubernetes qui achemine le trafic de vos pods d’application vers votre base de données. Le service reçoit un nom d’hôte au format suivant :

<cluster-name>.<namespace-name>.svc.cluster.local

Le nom d’hôte correct pour l’exemple de cluster ci-dessus est mysql-cluster.default.svc.cluster.local. Configurez vos applications pour qu’elles se connectent à MySQL à cette adresse en utilisant le port 3306 et les informations d’identification de l’utilisateur que vous avez définies dans votre secret.

Accéder à votre base de données en externe

Vous pouvez accéder à MySQL depuis l’extérieur de votre cluster à l’aide des fonctionnalités de transfert de port de Kubectl. Exécutez la commande suivante pour ouvrir une nouvelle session de transfert de port :

$ kubectl port-forward service/mysql-cluster 3306

Remplacer mysql-cluster avec le nom du InnoDBCluster vous souhaitez vous connecter. Vous pouvez désormais utiliser vos outils locaux pour interagir avec votre base de données :

$ mysql -h127.0.0.1 -u root -p

En appuyant sur Ctrl + C dans la fenêtre du terminal exécutant le kubectl port-forward commande fermera la connexion.

Personnalisation des paramètres du serveur MySQL

Vous pouvez fournir toutes les options de fichier de configuration MySQL requises par votre application en définissant le paramètre spec.mycnf champ dans votre InnoDBCluster manifeste de l’objet :

apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
spec:
  # ...
  mycnf: |
    [mysqld]
    max_connections=500
    innodb_ft_min_token_size=5

L’opérateur utilisera la valeur de ce champ pour écrire le my.cnf fichier dans le système de fichiers de vos pods de base de données.

Définition de la capacité de stockage

L’opérateur crée automatiquement un Persistent Volume (PV) et un Persistent Volume Claim (PVC) pour stocker les données de votre base de données. Il fournit par défaut 2Gi de stockage.

Ceci peut être changé en utilisant le datadirVolumeClaimTemplate champ manifeste qui vous permet de remplacer les propriétés de la ressource PVC produite par l’opérateur. Met le resources.requests.storage propriété à la capacité dont vous avez besoin.

apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
spec:
  # ...
  datadirVolumeClaimTemplate:
    resources:
      requests:
        storage: 10Gi

Vous devez le définir suffisamment haut pour qu’il y ait suffisamment de place pour que vos données se développent à l’avenir. L’opérateur ne prend pas en charge les redimensionnements de volume sur place, vous verrez donc une erreur si vous essayez d’augmenter la capacité à l’avenir. Passer à un volume plus important nécessiterait des étapes de migration manuelle.

Épingler la version MySQL

Vous pouvez épingler une version spécifique de MySQL avec le spec.version et spec.router.version des champs. Cela empêchera les mises à niveau automatiques involontaires. Sélectionnez la même version pour vos pods MySQL et vos instances de routeur afin de garantir la compatibilité.

apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
spec:
  # ...
  version: 8.0.31
  router:
    instances: 1
    version: 8.0.31

Sommaire

L’opérateur MySQL d’Oracle fournit un mécanisme pratique pour exécuter des bases de données MySQL dans un cluster Kubernetes. Vous pouvez provisionner de nouvelles bases de données répliquées en créant InnoDBCluster objets. C’est beaucoup plus simple que de créer manuellement des StatefulSets et des services qui exposent des conteneurs MySQL classiques.

L’utilisation de l’opérateur n’empêche pas votre capacité à contrôler MySQL ou votre environnement Kubernetes. Vous pouvez personnaliser vos pods en fournissant vos propres propriétés de manifeste dans le spec.podSpec champ et utilisez votre propre fichier de configuration MySQL avec les étapes indiquées ci-dessus. L’opérateur offre également un support de sauvegarde intégré, vous permettant de copier votre base de données sur un stockage externe selon un calendrier récurrent.

★★★★★