Vous avez probablement dû reconstruire le cluster Kubernetes après un échec. Avez-vous eu une stratégie de sauvegarde intelligente qui ne nécessite pas de labour pendant plusieurs jours? Oui, vous pouvez sauvegarder sur un cluster etcd, mais que faire si seulement une partie du cluster tombe ou si vous utilisez des volumes persistants comme AWS EBS?
Dans de tels cas, le moyen le plus simple consiste à utiliser l'utilitaire Heptio Ark .
Avec Heptio, vous pouvez effectuer des sauvegardes de l'ensemble du cluster, des espaces de noms individuels ou des types de ressources et effectuer des sauvegardes dans les délais. Pour moi, le principal avantage de Heptio Ark est son intégration avec divers fournisseurs de services cloud, par exemple AWS, Azure, Google Cloud, etc. Donc, quand il est sauvegardé, il prend des instantanés des volumes persistants utilisés.
Voyons comment installer cet utilitaire et comment il effectue des sauvegardes simples et planifiées, puis les restaure.
Il y aura un article séparé sur la sauvegarde des volumes permanents.
L'installation
Vous trouverez les instructions d'installation ici: examples / README.md. Ce processus créera plusieurs définitions de ressources personnalisées, des règles RBAC (contrôle d'accès basé sur les rôles) qui permettent à Heptio de sauvegarder et de se déployer. Par défaut, ils se trouvent dans l'espace de noms heptio-ark.
Important! Après une installation réussie, vous devez configurer heptio-ark pour indiquer au serveur quel fournisseur de services cloud utiliser et où stocker les sauvegardes. Voici à quoi ressemble cette configuration:
apiVersion: ark.heptio.com/v1 kind: Config metadata: namespace: heptio-ark name: default backupStorageProvider: name: aws bucket: heptio-backup-bucket config: region: eu-central-1 backupSyncPeriod: 30m gcSyncPeriod: 30m scheduleSyncPeriod: 1m restoreOnlyMode: false
Vous pouvez l'appliquer à l'aide de la commande
kubectl apply -f heptio.yaml
Heptio sait maintenant dans quel seau sauvegarder. L'emplacement de stockage de sauvegarde doit être accessible à partir des foyers d'heptio-serveur, vous pouvez donc utiliser le profil d'instance avec accès à ce compartiment ou Kube2IAM pour les profils d'instance dynamiques basés sur le foyer.
Enfin, pour les sauvegardes, les planifications et la récupération, vous devez télécharger la CLI Heptio Ark depuis le GitHub .
Presque toutes les commandes peuvent être exécutées en tant que définitions de ressources personnalisées via YAML ou JSON.
Sauvegarde
Dans ce petit exemple, j'ai créé un simple déploiement NGINX, et avant lui un service dans l'espace de noms du serveur web :
$ kubectl get all NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE deploy/nginx 1 1 1 1 28s NAME DESIRED CURRENT READY AGE rs/nginx-66f5756f9b 1 1 1 28s NAME READY STATUS RESTARTS AGE po/nginx-66f5756f9b-c88ck 1/1 Running 0 28s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc/nginx ClusterIP 10.32.0.183 <none> 80/TCP 28s
Faisons une sauvegarde à partir de l'interface CLI Heptio Ark:
$ ark backup create nginx-simple --include-namespaces webserver
Cette commande sauvegarde uniquement l'espace de noms du serveur Web . Sans ce paramètre, Heptio Ark créera une sauvegarde complète de toutes les ressources du cluster Kubernetes. La sauvegarde prendra un certain temps. Une copie sera enregistrée dans le compartiment spécifié dans S3 ( heptio-backup-bucket ). Pour afficher l'état et la liste de toutes les sauvegardes, entrez la commande suivante dans la CLI:
$ ark backup get NAME STATUS CREATED EXPIRES SELECTOR nginx-simple Completed 2018-07-08 17:35:09 +0200 CEST 29d <none>
Comme vous pouvez le voir, la sauvegarde est terminée.
Récupération de sauvegarde
Supprimons l'espace de noms du serveur Web (en ligne):
$ kubectl delete ns heptio-test
Maintenant, restaurez l'espace de noms après une suppression «aléatoire», et à nouveau à partir de l'interface CLI Heptio Ark:
$ ark restore create --from-backup nginx-simple Restore request "nginx-simple-20180708173924" submitted successfully. Run `ark restore describe nginx-simple-20180708173924` for more details.
Vous devez voir que l'espace de noms et toutes les ressources (déploiement, jeu de réplicas, sous-service et service) sont restaurés:
$ kubectl get all NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE deploy/nginx 1 1 1 1 20s NAME DESIRED CURRENT READY AGE rs/nginx-66f5756f9b 1 1 1 20s NAME READY STATUS RESTARTS AGE po/nginx-66f5756f9b-9mjvg 1/1 Running 0 20s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc/nginx ClusterIP 10.32.0.77 <none> 80/TCP 20s
Structure de sauvegarde
Pour afficher la structure de sauvegarde, chargez-la simplement du compartiment dans S3 ou entrez la commande Heptio Ark:
$ ark backup download nginx-simple Backup nginx-simple has been successfully downloaded to $PWD/nginx-simple-data.tar.gz

Dans le fichier webserver.json de notre espace de noms, nous voyons une ressource d'espace de noms régulière.
{ "apiVersion":"v1", "kind":"Namespace", "metadata": { "annotations": { "kubectl.kubernetes.io/last-applied-configuration":"{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"webserver\",\"namespace\":\"\"}}\n" }, "creationTimestamp":"2018-07-08T15:26:44Z", "name":"webserver", "resourceVersion":"3364", "selfLink":"/api/v1/namespaces/webserver", "uid":"52698ae7-82c3-11e8-8529-0645eb60c3f4" }, "spec": { "finalizers":["kubernetes"] }, "status": { "phase":"Active" } }
Si nous n'avons pas besoin d'une récupération complète, nous pouvons restaurer uniquement une partie à l'aide de la commande Heptio Ark ou aller directement à la sauvegarde et restaurer cette partie via kubectl.
$ ark schedule create nginx-schedule --schedule="* 10 * * *" --include-namespaces webserver Schedule "nginx-schedule" created successfully.
Sauvegarde planifiée
Heptio Ark peut effectuer des tâches planifiées. Nous indiquons quelles ressources et espaces de noms doivent être inclus dans la sauvegarde ou exclus de celle-ci et quand effectuer la sauvegarde:
$ ark schedule create nginx-schedule --schedule="* 10 * * *" --include-namespaces webserver Schedule "nginx-schedule" created successfully.
Dans ce cas, une sauvegarde sera créée chaque jour à 10 heures et n'inclura que l'espace de noms du serveur Web. Dans l'interface CLI Heptio Ark, nous voyons qu'un planning est apparu et Heptio Ark a déjà créé la première sauvegarde:
$ ark schedule get NAME STATUS CREATED SCHEDULE BACKUP TTL LAST BACKUP SELECTOR nginx-schedule Enabled 2018-07-08 17:49:00 +0200 CEST * 10 * * * 720h0m0s 25s ago <none> $ ~/Downloads/ark backup get NAME STATUS CREATED EXPIRES SELECTOR nginx-schedule-20180708154900 Completed 2018-07-08 17:49:00 +0200 CEST 29d <none> nginx-simple Completed 2018-07-08 17:35:09 +0200 CEST 29d <none>
Ici, il est indiqué que les sauvegardes planifiées sont supprimées après 720 heures, c'est-à-dire après 30 jours. Lorsque vous créez une sauvegarde ou une planification, vous pouvez spécifier la durée de vie de la copie - TTL. Après cette période, la sauvegarde sera supprimée du référentiel, dans notre cas AWS.