Je suis toujours en train de comprendre Kubernetes et son fonctionnement. Actuellement, j'ai du mal à comprendre comment modéliser un cluster PostgreSQL avec réplication en continu, mise à l'échelle et reprise automatique (pgpool-II
, repmgr
, choisissez votre poison).
Mon principal problème avec cette approche est la double nature d’une instance PostgreSQL, d’un point de vue configuration, c’est un maître ou un serveur en veille froide/chaude/chaude. Si j'augmente le nombre de répliques, je m'attendrais à ce qu'elles se présentent toutes en standby. J'imagine donc que l'on crée un contrôleur de réplication postgresql-standby
séparément d'un pod postgresql-master
. Cependant, je m'attendrais également à ce que l'un de ces statuts devienne un maître si le maître actuel est en panne, c'est donc un contrôleur de réplication postgresql
commun.
La seule idée que j'ai eu jusqu'à présent est de placer la configuration de réplication sur un volume externe et de gérer l'état et les changements d'état en dehors des conteneurs.
(dans le cas de PostgreSQL, la configuration serait probablement déjà sur un volume à l'intérieur de son répertoire data
, ce qui en soi est évidemment ce que je souhaiterais sur un volume, mais ce n'est pas grave)
Est-ce la bonne approche ou existe-t-il un moyen plus propre?
Il y a un exemple dans OpenShift: https://github.com/openshift/postgresql/tree/master/examples/replica Le principe est le même dans Kube pur (il n’utilise rien d’authentiquement spécifique à OpenShift, et vous pouvez utiliser les images en docker simple)
Vous pouvez essayer PostDock a essayer, avec docker-compose ou Kubernetes. Actuellement, je l'ai essayé dans notre projet avec docker-compose, avec le schéma ci-dessous:
pgmaster (primary node1) --|
|- pgslave1 (node2) --|
| |- pgslave2 (node3) --|----pgpool (master_slave_mode stream)----client
|- pgslave3 (node4) --|
|- pgslave4 (node5) --|
J'ai testé les scénarios suivants et ils fonctionnent tous très bien:
En ce qui concerne l'application cliente, ces modifications sont toutes transparentes. Le client pointe simplement sur le nœud pgpool et continue de bien fonctionner dans tous les scénarios susmentionnés.
Note: Si vous rencontrez des problèmes pour faire fonctionner PostDock, vous pouvez essayer ma version forkée de PostDock .
Un problème avec l'architecture susmentionnée est que pgpool est le point de défaillance unique. J'ai donc également essayé d'activer Watchdog pour pgpool-II avec une adresse IP virtuelle déléguée, afin d'éviter le point de défaillance unique.
master (primary node1) --\
|- slave1 (node2) ---\ / pgpool1 (active) \
| |- slave2 (node3) ----|---| |----client
|- slave3 (node4) ---/ \ pgpool2 (standby) /
|- slave4 (node5) --/
J'ai testé les scénarios suivants et ils fonctionnent tous très bien:
En ce qui concerne l'application cliente, ces modifications sont toutes transparentes. Le client pointe simplement sur l'adresse IP virtuelle et continue de bien fonctionner dans tous les scénarios susmentionnés.
Vous pouvez trouver ce projet sur mon dépôt GitHub sur la branche watchdog .
Statefulset de Kubernetes est une bonne base pour configurer le service stateful. Vous aurez encore besoin de travail pour configurer l’adhésion correcte entre les réplicas PostgreSQL.
Kubernetes a un exemple pour cela. http://blog.kubernetes.io/2017/02/postgresql-clusters-kubernetes-statefulsets.html