08 November 2019 ~ 1 Comment

Backup OpenShift okruženja

Backup OpenShift okruženja sastoji se od nekoliko komponenata koje je potrebno backupirati:

  • sistemske datoteke
  • konfiguracija OpenShifta (u sklopu sistemskih datoteka)
  • konfiguracija projekata (deployment config, service, tj. OpenShift/Kubernetes objekti)
  • podaci sadržani u Persistent Volume
  • podaci u pod-ovima (iako nikada ne bi trebalo biti podataka u pod-ovima za backup jer se direktno kosi sa konceptom kontejnerizacije)

Ovaj članak se ne fokusira na podatke u PV-ovima i podatke u pod-ovima već na backup OpenShift sistemskih datoteka i OpenShift objekata u projektima. U primjerima je prikazan backup master nodea ali vrlo lako se,  uz manje prilagodbe, može primijeniti i na infra node i compute node. Detaljnije o backupu OpenShifta može se pročitati u službenoj dokumentaciji a na kojoj se temelji i ovaj članak.

Preduvjeti

Za pohranu datoteka potrebno je kreirati odgovarajuće foldere. Za ovaj primjer kreirana su dva foldera u koji će se pohranjivati backup:

  • /opt/backup/system/
  • /etc/backup/applications/

Folderima je potrebno dodijeliti odgovarajuća prava (ovisi o korisničkom računu koji će pokretati skriptu za backup). Prema nazivu nije problematično zaključiti gdje će se pohranjivati što :)

Sistemske datoteke

Sistemske datoteke koje je potrebno pohraniti su:

  • /etc/origin/*
  • /etc/cni/*
  • /etc/dnsmasq*
  • /etc/sysconfig/*
  • /etc/pki/ca-trust/* 
  • /etc/docker/certs.d/* (opcionalno, ako se koriste Docker registry sa self-signed ili internal PKI certifikatima)
  • /etc/etcd/* (ovo ovisi o načinu na koji je deployan etcd)

Dodatno, i opcionalno, je napraviti popis instaliranih paketa te taj popis backupirati. U svakom slučaju može dobro doći kod oporavka nodea tako da paketi budu usklađeni sa ostatkom klastera te je i ova aktivnost uključena u skriptu.

OpenShift projekti

Nadam se da OpenShift deploymente čuvate već na izdvojenoj lokaciji u backupu (poželjno u nekom version control sustavu), bilo da su to heml chartovi ili OpenShift template. To bi trebalo biti dovoljno za oporavak projekata ali za svaku slučaj nije loše napraviti dodatan backup koji će obuhvaćati zadnje promjene (svim smo svjesni da se ponekad rade direktne interventne izmjene pa se zaboravi te izmjene odraditi u helmovima ili templateima). Moguće je backupirati svaki resurs za sebe ali OpenShift omogućava da se kreira jedna yaml datoteka koja će sadržavati podatke svih resursa projekta. Naredba niže će kreirati yaml datoteku sa svim resursima projekta ali će ukloniti podatke specifične za klaster na kojemu je napravljen backup što teoretski omogućava da se na sasvim drugom klasteru napravi import tj. restore cijelog projekta :)

oc get -o yaml --export all

Skripta

Za potrebe backupa navedenog izrađena je skripta koja će napraviti backup svih sistemskih datoteka, instaliranih paketa te će kreirati yaml datoteke za sve projekte OpenShifta. Sve se pohranjuje na lokaciji /opt/backup/ u odgovarajućim folderima (applications za OpenShift objekte, system za datoteke operativnog sustava) u podfolder sa nazivom prema aktualnom datumu (YYYY_mm_dd). Da se podaci ne gomilaju, na kraju izvršavanja backupa brišu se podaci stariji od 7 dana. 

OpenShift login (oc login -u system:admin) nije sretno rješenje (zahtijeva da se skripta izvršava pod root) i postoji bolji način ali to je tema za neki drugi članak.

Skriptu je moguće preuzeti sa GitHub-a.

#!/bin/bash

# Log start of backup
echo -e "[$(date +%x-%X)] Backup starting"

# Set folders
BACKUP_DIR="/opt/backup"
SYS_BACKUP_DIR="$BACKUP_DIR/system/$(date +%Y_%m_%d)"
APP_BACKUP_DIR="$BACKUP_DIR/applications/$(date +%Y_%m_%d)"

# Create folders
mkdir -p "${SYS_BACKUP_DIR}/etc/origin/"
mkdir -p "${SYS_BACKUP_DIR}/etc/sysconfig/"
mkdir -p "${SYS_BACKUP_DIR}/etc/pki/ca-trust/"
mkdir -p "${SYS_BACKUP_DIR}/etc/docker/certs.d/"
mkdir -p "${SYS_BACKUP_DIR}/etc/etcd/"

echo -e "[$(date +%x-%X)] Filesystem backup"

# Backup OpenShift
cp -aR /etc/origin/* ${SYS_BACKUP_DIR}/etc/origin/

# Backup Container Network Interface
cp -aR /etc/cni/* ${SYS_BACKUP_DIR}/etc/cni/

# Backup othe relevant system files
cp -aR /etc/dnsmasq* ${SYS_BACKUP_DIR}/etc/
cp -aR /etc/sysconfig/* ${SYS_BACKUP_DIR}/etc/sysconfig/

# Backup PKI trusts
cp -aR /etc/pki/ca-trust/* ${SYS_BACKUP_DIR}/etc/pki/ca-trust/

# Backup Docker trusted registries
cp -aR /etc/docker/certs.d/* ${SYS_BACKUP_DIR}/etc/docker/certs.d/

# Backup etcd
cp -aR /etc/etcd/* ${SYS_BACKUP_DIR}/etc/etcd/

# Backup list of installed packages
rpm -qa | sort | tee ${SYS_BACKUP_DIR}/packages.log > /dev/null 2>&1

echo -e "[$(date +%x-%X)] OpenShift projects backup"

# Login to OpenShift
oc login -u system:admin > /dev/null 2>&1

# Get all projects
PROJECTS=$(oc get projects -o name | cut -d'/' -f2)

# Backup all projects into designated folder
for P in $PROJECTS
do
    echo -e "[$(date +%x-%X)] Starting backup of ${P} project"
    mkdir -p "${APP_BACKUP_DIR}/${P}/"
    oc project $P > /dev/null 2>&1
    oc get -o yaml --export all > ${APP_BACKUP_DIR}/${P}/${P}.yaml
done

echo -e "[$(date +%x-%X)] Delete old backups"

# Delete backups older than 7 days
find /opt/backup/applications/* -ctime +6 -exec rm -rf {} \;
find /opt/backup/system/* -ctime +6 -exec rm -rf {} \;

# Log end of backup
echo -e "[$(date +%x-%X)] Backup finished"

Ako imate prijedloge poboljšanja slobodno stavite u komentare :)

Tags: ,

One Response to “Backup OpenShift okruženja”


Leave a Reply