Déployer un Cluster YugabyteDB sur Kubernetes avec Helm : Une solution PostgreSQL distribuée avec une résilience intégrée et une très haute scalabilité
Introduction YugabyteDB est une base de données distribuée haute performance conçue pour répondre aux besoins des applications modernes. Elle offre des fonctionnalités comme la scalabilité…

Introduction
YugabyteDB est une base de données distribuée haute performance conçue pour répondre aux besoins des applications modernes. Elle offre des fonctionnalités comme la scalabilité horizontale, la résilience, et le support multi-modèle (YSQL et YCQL). Dans cet article, nous allons déployer un cluster avec helm.
Les Principales Fonctionnalités de YugabyteDB Résumées
-
Puissant RDBMS basé sur PostgreSQL
- Yugabyte SQL (YSQL) réutilise la couche de requêtes PostgreSQL, prenant en charge la majorité de ses fonctionnalités : types de données, requêtes complexes, opérateurs, fonctions, procédures stockées, déclencheurs et extensions.
-
Transactions Distribuées
- Inspiré par l'architecture Google Spanner.
- Transactions ACID distribuées avec consensus Raft et horloges logiques hybrides.
- Prise en charge des niveaux d'isolation comme snapshot, serializable, et read committed.
- Lecture forte par défaut avec option de lecture des répliques.
-
Disponibilité Continue
- Résilience native aux pannes de disque, rack, nœud, zone, région, ou cloud.
- RPO de 0 (pas de perte de données) et RTO de 3 secondes (reprise rapide).
-
Scalabilité Horizontale
- Ajoutez simplement des nœuds pour augmenter les IOPS ou la capacité de stockage.
-
Déploiement Multi-Géo et Multi-Cloud
- Compatible avec Kubernetes et les clouds publics.
- Déploiements multi-zones, multi-régions et multi-clouds.
- Réplication asynchrone xCluster (unidirectionnelle ou bidirectionnelle).
- Réplicas en lecture pour des accès à faible latence.
-
API Multiples
- Supporte deux APIs SQL :
- YSQL : API relationnelle complète basée sur PostgreSQL.
- YCQL : API semi-relationnelle inspirée d'Apache Cassandra.
- Supporte deux APIs SQL :
-
Open Source à 100 %
- Sous licence Apache 2.0.
- Projet github
- Fonctionnalités avancées : sauvegardes distribuées, chiffrement des données (au repos et en transit), capture de données, réplicas en lecture, et plus encore.
Architecture

Prérequis
- Un cluster kubernetes 3 vCPU et 4 Go de RAM par node (répartis sur au moins 3 nœuds): un exmple ici
- Helm 3.4+
- Configuration correcte de helm et kubectl pour acceder au cluster
1. Ajouter le dépôt Helm de YugabyteDB
-
- Ajouter le repo helm de ygabyte
helm repo add yugabytedb https://charts.yugabyte.com
helm repo update
helm search repo yugabytedb/yugabyte

2. Créer un Cluster YugabyteDB
- Créer un namespace dedié:
kubectl create ns yb-cluster
- Créer le fichier helm-values.yaml et adapter les values selon les besoins: template ici
Component: "yugabytedb"
storage:
ephemeral: false # will not allocate PVs when true
master:
count: 2
size: 1Gi
storageClass: "local-path"
tserver:
count: 2
size: 1Gi
storageClass: "local-path"
resource:
master:
requests:
cpu: "0.5"
memory: 1Gi
limits:
cpu: "0.5"
memory: 1Gi
tserver:
requests:
cpu: "0.5"
memory: 1Gi
limits:
cpu: "0.5"
memory: 1Gi
replicas:
master: 3
tserver: 3
totalMasters: 3
partition:
master: 0
tserver: 0
updateStrategy:
type: RollingUpdate
# Disable the YSQL
disableYsql: false
yugabytedUi:
enabled: true
recoverWithoutFailure: true
recoveryInterval: 30s
metricsSnapshotter:
enabled: true
interval: 11000
whitelist:
- handler_latency_yb_tserver_TabletServerService_Read_count
- handler_latency_yb_tserver_TabletServerService_Write_count
- handler_latency_yb_tserver_TabletServerService_Read_sum
- handler_latency_yb_tserver_TabletServerService_Write_sum
- disk_usage
- cpu_usage
- node_up
PodManagementPolicy: Parallel
enableLoadBalancer: true
serviceMonitor:
enabled: false
nodeSelector: {}
affinity: {}
statefulSetAnnotations: {}
networkAnnotation: {}
commonLabels: {}
# For more https://docs.yugabyte.com/latest/reference/configuration/yugabyted/#environment-variables
authCredentials:
ysql: # pour sql
user: "techlader-user"
password: "techlader-hide-me1"
database: "techlader-db"
ycql: # pour semi sql
user: "techlader-user"
password: "techlader-hide-me2"
keyspace: "techlader-db"
- Installer YugabyteDB
helm upgrade --install yb-cluster yugabytedb/yugabyte -f helm-values.yaml --version 2024.1.3 --namespace yb-cluster --create-namespace
Note : Les services LoadBalancer resteront en état pending. Pour les désactiver, il faut mettre enableLoadBalancer=False dans le ficher vaules.yaml ci-dessus.
3. Vérifier le Déploiement
helm status yb-cluster -n yb-cluster
kubectl get po,svc,sts -o wide -n yb-cluster

- Pour acceder à yb master UI (available at http://localhost:7000)
kubectl -n yb-cluster port-forward svc/yb-master-ui 7000:7000

- Pour acceder à webserver UI (available at http://localhost:15433)
kubectl -n yb-cluster port-forward svc/yugabyted-ui-service 15433:15433


- Créer un super admin user
- Ouvrir un shell dans l'un des replicas: password: yugabyte
- User par defaut: yubabyte/yugabyte
kubectl exec --namespace yb-cluster -it yb-tserver-0 -- /home/yugabyte/bin/ysqlsh -h yb-tserver-0.yb-tservers.yb-cluster

- Configuration des accès
- Changer le mot de passe par defaut du user yugabyte
- User par defaut: yubabyte/yugabyte
- Créer un nouveau user avec les admin
# changer le default pwd du user yugabyte
ALTER ROLE yugabyte PASSWORD 'TechNewPassword';
# créer un nouveau superadmin user
CREATE ROLE admin_usr WITH LOGIN SUPERUSER PASSWORD 'PasswdForAdmin';
# afficher les roles
SELECT rolname, rolsuper, rolcanlogin FROM pg_roles;

# Lister tous les users
\du
# Créer une base de données
CREATE DATABASE "techledger-db";

4. Intégrations: Test d'orm Pyhton avec sqlalchemy
YugabyteDB est compatible avec PostgreSQL, la plupart des pilotes clients PostgreSQL, des frameworks ORM et d'autres types d'outils de base de données tiers conçus pour PostgreSQL sont compatibles.
Dans cet exemple, on va utiliser un script python avec l'orm sqlalchemy dans un conteneur docker.
- Code python pour le model, definition des tables et relations: model.py
from sqlalchemy import Table, Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship
from base import Base
class Department(Base):
__tablename__ = 'departments'
id = Column(Integer, primary_key=True)
name = Column(String(255), nullable=False, unique=True)
employees = relationship("Employee", back_populates="department")
class Employee(Base):
__tablename__ = 'employees'
id = Column(Integer, primary_key=True)
name = Column(String(255), nullable=False, unique=True)
age = Column(Integer)
department_id = Column(Integer, ForeignKey('departments.id'))
department = relationship("Department", back_populates="employees")
projects = relationship("Project", back_populates="employee")
class Project(Base):
__tablename__ = 'projects'
id = Column(Integer, primary_key=True)
title = Column(String(255), nullable=False)
employee_id = Column(Integer, ForeignKey('employees.id'))
employee = relationship("Employee", back_populates="projects")
- Définition de la base déclarative: base.py
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
- Initialisation et ajout des données: main.py
import config as cfg
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from model import Base, Department, Employee, Project
# Création de la connexion
engine = create_engine(f'postgresql://{cfg.db_user}:{cfg.db_password}@{cfg.db_host}:{cfg.db_port}/{cfg.database}')
# Création des tables
Base.metadata.create_all(engine)
# Création de la session
Session = sessionmaker(bind=engine)
session = Session()
# Ajout de données
dep1 = Department(name='Engineering')
dep2 = Department(name='HR')
emp1 = Employee(name='Alice', age=28, department=dep1)
emp2 = Employee(name='Bob', age=35, department=dep1)
emp3 = Employee(name='Eve', age=29, department=dep2)
proj1 = Project(title='Project Alpha', employee=emp1)
proj2 = Project(title='Project Beta', employee=emp2)
proj3 = Project(title='Project Gamma', employee=emp3)
session.add_all([dep1, dep2, emp1, emp2, emp3, proj1, proj2, proj3])
session.commit()
# Lecture des données
for employee in session.query(Employee).all():
print(f"Employee: {employee.name}, Department: {employee.department.name}")
for project in session.query(Project).all():
print(f"Project: {project.title}, Assigned to: {project.employee.name}")
- Configuration de la connexion: config.py
- Pour le db_host et db_port, executer: kubectl get svc,no -n yb-cluster -o wide
- Chosir une ip de l'un des nodes
- Prendre le port qui est à droit du port 5433

db_user = 'admin_usr'
db_password = 'PasswdForAdmin'
database = 'techledger-db'
db_host = '10.10.10.208'
db_port = 31308
- Le fichier requirement: requirements.txt
sqlalchemy
psycopg2-binary
- Création d’un Dockerfile: Dockerfile
# Utiliser une image de base Python
FROM python:3.10-slim
# Installer les dépendances système nécessaires
RUN apt-get update && apt-get install -y \
libpq-dev \
gcc \
--no-install-recommends && \
rm -rf /var/lib/apt/lists/*
# Définir le répertoire de travail
WORKDIR /app
# Copier les fichiers nécessaires dans le conteneur
COPY . /app
# Installer les dépendances Python
RUN pip install --no-cache-dir -r requirements.txt
# Définir le point d'entrée par défaut
CMD ["python", "main.py"]
- On obtient cette arborescence

- Build de l’Image Docker
docker build -t sqlalchemy-yugabytedb:1.0 .
- Execution de l'image docker
docker run --rm sqlalchemy-yugabytedb:1.0

- Ouvrir un shell dans l'un des replicas
kubectl exec --namespace yb-cluster -it yb-tserver-0 -- /home/yugabyte/bin/ysqlsh -h yb-tserver-0.yb-tservers.yb-cluster

- Voir la base de données sur l'ui http://localhost:15433
kubectl -n yb-cluster port-forward svc/yugabyted-ui-service 15433:15433


Conclusion
Avec Helm, le déploiement de YugabyteDB sur Kubernetes est rapide et simple. Que ce soit pour un environnement de développement local ou une infrastructure de production multi-nœuds, cette base de données distribuée vous offre robustesse, flexibilité et performance. N’hésitez pas à adapter les paramètres pour répondre à vos besoins spécifiques.
Liens de la documentation:
https://docs.yugabyte.com/preview/secure/enable-authentication/authentication-ysql/
https://docs.yugabyte.com/preview/drivers-orms/python/sqlalchemy/
N'hésitez pas à laisser des commentaires si vous avez des questions ou des suggestions !
Commentaires
Aucun commentaire pour le moment.