Aller au contenu principal

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é…

coolibra08 juil. 20261017 vues

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

  1. 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.
  2. 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.
  3. 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).
  4. Scalabilité Horizontale

    • Ajoutez simplement des nœuds pour augmenter les IOPS ou la capacité de stockage.
  5. 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.
  6. API Multiples

    • Supporte deux APIs SQL :
      • YSQL : API relationnelle complète basée sur PostgreSQL.
      • YCQL : API semi-relationnelle inspirée d'Apache Cassandra.
  7. 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

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

 

 

kubectl -n yb-cluster port-forward svc/yb-master-ui 7000:7000

 

 

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

 

 

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/

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

Connectez-vous pour rejoindre la discussion.

Aucun commentaire pour le moment.