Aller au contenu

Keycloak - Backup / Restore#

Cette page décrit la procédure pour sauvegarder et restaurer les bases de données PostgreSQL liées à Keycloak. Il s'agit d'une procédure manuelle qui vient en complément des plans de sauvegarde automatique. Cette procédure est utile pour créer une sauvegarde avant une opération à risque sur le service ou pour restaurer des données à la suite d'un incident.

Cette base de données va permettre de stocker les éléments de configuration issus de Keycloak tel que les utilisateurs, groupes, rôles, sessions, etc.

Warning

Si le mot de passe de la base de données a changé, un redéploiement de la chart Keycloak est nécessaire.

Plan de sauvegarde#

Postgres-Operator#

La base de données est sauvegardée quotidiennement en HNO.

La planification est définie dans la chaine CI Concourse (Cf. caascad/pipelines/postgres-backup).

RDS#

L'instance RDS contenant la base de données est sauvegardée quotidiennement en HNO. Ces sauvegardes sont accessibles à travers la console Flexible Engine :

Homepage > Database > Relational Database Service > Backups

Prérequis#

RDS#

Il faut installer les outils PostgreSQL localement via nix-shell :

nix-env -iA nixpkgs.postgresql_12

Exporter les variables#

Variables communes#

Configurer votre environnement (zone, application) :

export ZONE="ocb-example"
export APP="keycloak"

# Export dump filename
export DUMP_FILE="$(date +%F)_${ZONE}_${APP}.sql"

Se positionner sur le cluster K8s cible :

kswitch "${ZONE}"

Postgres-Operator#

Récupérer les paramètres de la base PostgreSQL :

# Export RDS password
export PGPASSWORD="$(kubectl get secret -n "${APP}" "postgres.pocwatt-keycloak-cluster.credentials" --template={{.data.password}} | base64 -d)"

# Export PostgreSQL Master pod
export POSTGRES_MASTER="$(kubectl get pods -n "${APP}" -l spilo-role=master -o custom-columns=NAME:.metadata.name --no-headers)"

RDS#

Déclarer la zone d'infrastructure (infra-stg, infra-prd) :

export INFRA_ZONE="<INFRA_ZONE>"

Récupérer un token Vault :

export VAULT_ADDR="https://vault.${INFRA_ZONE}.caascad.com"
vault token lookup || vault login -method oidc

Récupérer les paramètres de la base PostgreSQL :

# Export RDS password
export PGPASSWORD="$(vault read -field=password secret/zones/fe/${ZONE}/rds/${APP}/db)"

# Export RDS IP
export ADDR_TARGET="$(vault read -field=private_ip secret/zones/fe/${ZONE}/rds/${APP}/db)"

Sauvegarde#

Warning

La sauvegarde nécessite un arrêt du service Keycloak pour garantir la cohérence des données dans le dump SQL.

Pré-opérations#

Arrêter l'application (Scale Down) :

kubectl scale statefulset --replicas=0 -n "${APP}" keycloak

Sauvegarder la base de données en fonction de son architecture :

Postgres-Operator#

Sauvegarder la base de données avec pg_dump :

kubectl exec -it -n "${APP}" "${POSTGRES_MASTER}" -- bash -c "PGPASSWORD='${PGPASSWORD}' pg_dump -c -O --if-exists -U ${APP} ${APP}" > "${DUMP_FILE}"

RDS#

Créer la connexion vers le RDS (On passe par le bastion via un tunnel SSH) :

ssh -f -N -L "65432:${ADDR_TARGET}:5432" "cloud@bst.${ZONE}.caascad.com"

Arrêter l'application (Scale Down) :

kubectl scale statefulset --replicas=0 -n "${APP}" keycloak

Sauvegarder la base de données avec pg_dump :

pg_dump -h 127.0.0.1 -p 65432 -c -O --if-exists -x -U "${APP}" "${APP}" > "${DUMP_FILE}"

Post-opérations#

Redémarrer l'application (Scale Up) :

kubectl scale statefulset --replicas=2 -n "${APP}" keycloak

Vérifier que la sauvegarde s'est déroulée avec succès :

head -n 2 "${DUMP_FILE}"; tail -n 3 "${DUMP_FILE}"


# Should return:
# --
# -- PostgreSQL database dump
# -- PostgreSQL database dump complete
# --
#

Restauration#

Pré-opérations#

Indiquer le nom du dump à restaurer :

export RESTORE_DUMP_FILE="<FILENAME_WITH_PATH>" # Ex : ~/2022-10-31_ocb-test06_keycloak.sql

Postgres-Operator#

Copier le dump SQL (sauvegarde) sur le pod Master du cluster (La copie du dump dans le pod peut prendre un peu de temps et ne génère pas de messages) :

kubectl cp "${RESTORE_DUMP_FILE}" -n "${APP}" "${POSTGRES_MASTER}":/home/postgres/pgdata/

Arrêter l'application (Scale Down) :

kubectl scale statefulset --replicas=0 -n "${APP}" keycloak

Restaurer le dump SQL sur la base de données :

kubectl exec -it -n "${APP}" "${POSTGRES_MASTER}" -- bash -c "psql -U ${APP} -f /home/postgres/pgdata/${RESTORE_DUMP_FILE}"

RDS#

Créer la connexion vers le RDS (On passe par le bastion via un tunnel SSH) :

ssh -f -N -L "65432:${ADDR_TARGET}:5432" "cloud@bst.${ZONE}.caascad.com"

Arrêter l'application (Scale Down) :

kubectl scale statefulset --replicas=0 -n "${APP}" keycloak

Restaurer le fichier dump SQL sur la base de données :

psql -h 127.0.0.1 -p 65432 -U "${APP}" "${APP}" -f "${RESTORE_DUMP_FILE}"

Post-opérations#

Redémarrer l'application (Scale Up) :

kubectl scale statefulset --replicas=2 -n "${APP}" keycloak