Наличие надлежащей резервной копии плана восстановления имеет жизненно важное значение для какой-либо операции организации. Однако, когда вы начинаете распределять рабочие нагрузки через центры и регионы датчиков, этот процесс начинает становиться все более и сложнее. Платформам оркестовых контейнеров, таких как Kubernetes, начали ослабить эту нагрузку и позволило управлять распределенными рабочими нагрузками в районах, которые ранее были очень сложными.
В этом посте мы собираемся познакомить вас с Kubernetes-Native Tool для приема резервных копий ваших дисков, помогая с важнейшим планом восстановления. Stash — это оператор Restic, который ускоряет задачу резервного копирования и восстановления вашей инфраструктуры Kubernetes . Вы можете узнать больше о операторов Framework через Этот блог пост Отказ
Используя Stash, вы можете сделать резервные копии объемов Kubernetes, установленные в следующих типах рабочих нагрузок:
- Развертывание
- Daemonset.
- Реплизет
- РепликацияController
- Состояние государства
В самом сердце Stask это кубернаны контроллер который использует Пользовательское определение ресурсов (CRD) Чтобы указать цели и поведение резервной копии и восстановления процесса восстановления в родном порядке Kubernetes. Упрощенная архитектура Stash показана ниже:
Использование Helm 3.
Stash может быть установлен через Хелм используя Диаграмма от Appscode Charts Repository Отказ Чтобы установить диаграмму с именем выпуска Stash-оператор
:
$ helm repo add appscode https://charts.appscode.com/stable/ $ helm repo update $ helm search repo appscode/stash --version v0.9.0-rc.6 NAME CHART VERSION APP VERSION DESCRIPTION appscode/stash v0.9.0-rc.6 v0.9.0-rc.6 Stash by AppsCode - Backup your Kubernetes Volumes $ helm install stash-operator appscode/stash \ --version v0.9.0-rc.6 \ --namespace kube-system
Если вы предпочитаете не использовать HELM, вы можете генерировать YAML с таблицы Stash и развернуть использование kubectl
:
$ helm repo add appscode https://charts.appscode.com/stable/ $ helm repo update $ helm search repo appscode/stash --version v0.9.0-rc.6 NAME CHART VERSION APP VERSION DESCRIPTION appscode/stash v0.9.0-rc.6 v0.9.0-rc.6 Stash by AppsCode - Backup your Kubernetes Volumes $ helm template stash-operator appscode/stash \ --version v0.9.0-rc.6 \ --namespace kube-system \ --no-hooks | kubectl apply -f -
Установка на гке кластере
Если вы устанавливаете Stash в кластере GKE, вам понадобится разрешения администратора кластера для установки оператора Stash. Запустите следующую команду, чтобы предоставить разрешение администратора в кластер.
$ kubectl create clusterrolebinding "cluster-admin-$(whoami)" \ --clusterrole=cluster-admin \ --user="$(gcloud config get-value core/account)"
Кроме того, если ваш кластер GKE является Частный кластер , вам нужно будет либо добавить дополнительное правило брандмауэра, которое позволяет Master Ussies Access Port 8443/TCP
на рабочих узлах или измените существующее правило, которое позволяет доступом к портам 443/TCP.
и 10250/TCP
Также разрешить доступ к порту 8443/TCP.
. Процедура добавления или изменения правил брандмауэра описана в официальной документации GKE для частных кластеров, упомянутых выше.
Проверьте установку
Чтобы проверить, запустите ли Pods оператора Stash, запустите следующую команду:
$ kubectl get pods --all-namespaces -l app=stash --watch NAMESPACE NAME READY STATUS RESTARTS AGE kube-system stash-operator-859d6bdb56-m9br5 2/2 Running 2 5s
После того, как работа оператора работает, вы можете отменить вышеуказанную команду, набрав Ctrl + C
Отказ
Теперь для подтверждения групп CRD были зарегистрированы оператором, выполните следующую команду:
$ kubectl get crd -l app=stash NAME AGE recoveries.stash.appscode.com 5s repositories.stash.appscode.com 5s restics.stash.appscode.com 5s
С этим вы готовы принять первое резервное копирование с помощью Stash.
Чтобы сохранить все изолированные, мы собираемся использовать отдельное пространство имен под названием Демо
На протяжении всего этого учебника.
$ kubectl create ns demo namespace/demo created
Подготовьте резервную плату
Мы собираемся использовать GCS Backend хранить резервные копии данных. Вы можете использовать любую поддержанную Backend, которую вы предпочитаете. Вам просто нужно настроить секрет хранения и Спецификация Раздел
Backuppblueprint соответствовать вашей бэкэнде. Посетить
здесь Чтобы узнать, какие бэкэнды поддерживаются Stash и как их настроить.
Для GCS Backend, если ведро не существует, stash потребностей Объект хранения Admin
Разрешения ролей для создания ведра. Для получения более подробной информации, пожалуйста, проверьте следующее Руководство Отказ
Создать секрет хранения :
Сначала давайте создадим секрет хранения для Backend GCS,
$ echo -n 'changeit' > RESTIC_PASSWORD $ echo -n '' > GOOGLE_PROJECT_ID $ mv downloaded-sa-json.key > GOOGLE_SERVICE_ACCOUNT_JSON_KEY $ kubectl create secret generic -n demo gcs-secret \ --from-file=./RESTIC_PASSWORD \ --from-file=./GOOGLE_PROJECT_ID \ --from-file=./GOOGLE_SERVICE_ACCOUNT_JSON_KEY secret/gcs-secret created
Создать backuppbblueprint:
Далее мы должны создать Backuppblueprint
CRD с планом для Репозиторий
и Backuppigonfiguration
объект.
Ниже ямл Backuppblueprint
Объект, который мы собираемся создавать:
apiVersion: stash.appscode.com/v1beta1 kind: BackupBlueprint metadata: name: postgres-backup-blueprint spec: # ============== Blueprint for Repository ========================== backend: gcs: bucket: appscode-qa prefix: stash-backup/${TARGET_NAMESPACE}/${TARGET_APP_RESOURCE}/${TARGET_NAME} storageSecretName: gcs-secret # ============== Blueprint for BackupConfiguration ================= task: name: postgres-backup-${TARGET_APP_VERSION} schedule: "*/5 * * * *" retentionPolicy: name: 'keep-last-5' keepLast: 5 prune: true
Обратите внимание, что мы использовали несколько переменных (формат: $ {<имя переменной>}
) в spec.backend.gcs.prefix
поле. Stash заменит эти переменные значениями из соответствующей цели. Чтобы узнать, какие переменные вы можете использовать в префикс
Поле, пожалуйста, посетите здесь Отказ
Давайте создадим Backuppblueprint
что мы показали выше.
$ kubectl apply -f https://github.com/stashed/docs/raw/v0.9.0-rc.6/docs/examples/guides/latest/auto-backup/database/backupblueprint.yaml backupblueprint.stash.appscode.com/postgres-backup-blueprint created
С помощью этого автоматическая резервная копия настроен для базы данных PostgreSQL. Мы просто должны добавить аннотацию к AppBinding
целевой базы данных.
Требуемая аннотация для автоматической резервной базы данных:
Вы должны добавить следующую аннотацию к AppBinding
CRD целевой базы данных для обеспечения резервного копирования для него:
stash.appscode.com/backup-blueprint:
Эта аннотация определяет имя Backuppblueprint
объект, где плакат для Репозиторий
и Backuppigonfiguration
был определен.
Подготовьте базы данных
Далее мы собираемся развернуть два образца PostgreSQL баз данных двух разных версий с использованием Kubedb. Мы собираемся резервное копирование этих двух баз данных с помощью автоматического резервного копирования.
Развернуть первый PostgreSQL образец:
Ниже ямл первого Postgres
CRD:
apiVersion: kubedb.com/v1alpha1 kind: Postgres metadata: name: sample-postgres-1 namespace: demo spec: version: "11.2" storageType: Durable storage: storageClassName: "standard" accessModes: - ReadWriteOnce resources: requests: storage: 1Gi terminationPolicy: Delete
Давайте создадим Postgres
Мы показали выше:
$ kubectl apply -f https://github.com/stashed/docs/raw/v0.9.0-rc.6/docs/examples/guides/latest/auto-backup/database/sample-postgres-1.yaml postgres.kubedb.com/sample-postgres-1 created
KubedB будет развернуть базу данных PostgreSQL в соответствии с вышеуказанным спецификацией, и она создаст необходимые секреты и услуги для доступа к базе данных. Это также создаст AppBinding
CRD, который содержит необходимую информацию для подключения к базе данных.
Убедитесь, что AppBinding
Был создан для этого образца PostgreSQL:
$ kubectl get appbinding -n demo NAME AGE sample-postgres-1 47s
Если вы просматриваете YAML этого AppBinding
Вы увидите, что он проводит услугу и секретную информацию. Stash использует эту информацию для подключения к базе данных.
$ kubectl get appbinding -n demo sample-postgres-1 -o yaml
apiVersion: appcatalog.appscode.com/v1alpha1 kind: AppBinding metadata: name: sample-postgres-1 namespace: demo ... spec: clientConfig: service: name: sample-postgres-1 path: / port: 5432 query: sslmode=disable scheme: postgresql secret: name: sample-postgres-1-auth secretTransforms: - renameKey: from: POSTGRES_USER to: username - renameKey: from: POSTGRES_PASSWORD to: password type: kubedb.com/postgres version: "11.2"
Развертывание второго PostgreSQL образец:
Ниже ямл второго Postgres
объект:
apiVersion: kubedb.com/v1alpha1 kind: Postgres metadata: name: sample-postgres-2 namespace: demo spec: version: "10.6-v2" storageType: Durable storage: storageClassName: "standard" accessModes: - ReadWriteOnce resources: requests: storage: 1Gi terminationPolicy: Delete
Давайте создадим Postgres
Мы показали выше.
$ kubectl apply -f https://github.com/stashed/docs/raw/v0.9.0-rc.6/docs/examples/guides/latest/auto-backup/database/sample-postgres-2.yaml postgres.kubedb.com/sample-postgres-2 created
Убедитесь, что AppBinding
Был создан для этой базы данных PostgreSQL:
$ kubectl get appbinding -n demo NAME AGE sample-postgres-1 2m49s sample-postgres-2 10s
Здесь мы можем видеть AppBinding
Образец-postgrees-2
был создан для нашего второго образец PostgreSQL.
Далее мы собираемся добавить автоматическое резервное копирование специфической аннотации к AppBinding
нашей желаемой базы данных. Шташ часы для AppBinding
CRD. Как только он найдет AppBinding
С Auto-Backup Annotation это создаст Репозиторий
и а Backuppigonfiguration
CRD согласно соответствующей Backuppblueprint
Отказ Затем остальная часть процесса резервного копирования будет продолжаться как обычная резервная копия базы данных, как описано здесь.
Backup First PostgreSQL образец
Давайте резервируемся наш первый образец PostgreSQL с использованием автоматической резервной копии.
Добавить аннотации :
Сначала добавьте специфическую аннотацию Auto-Backup в AppBinding Образец-postgrees-1
:
$ kubectl annotate appbinding sample-postgres-1 -n demo --overwrite \ stash.appscode.com/backup-blueprint=postgres-backup-blueprint
Убедитесь, что аннотация была успешно добавлена:
$ kubectl get appbinding -n demo sample-postgres-1 -o yaml
apiVersion: appcatalog.appscode.com/v1alpha1 kind: AppBinding metadata: annotations: stash.appscode.com/backup-blueprint: postgres-backup-blueprint name: sample-postgres-1 namespace: demo ... spec: clientConfig: service: name: sample-postgres-1 path: / port: 5432 query: sslmode=disable scheme: postgresql secret: name: sample-postgres-1-auth secretTransforms: - renameKey: from: POSTGRES_USER to: username - renameKey: from: POSTGRES_PASSWORD to: password type: kubedb.com/postgres version: "11.2"
После этого Stash создаст Репозиторий
и а Backuppigonfiguration
CRD согласно черту.
Убедитесь, что репозиторий:
Убедитесь, что Репозиторий
Был успешно создан следующей командой:
$ kubectl get repository -n demo NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE postgres-sample-postgres-1 2m23s
Если мы просматриваем YAML этого Репозиторий
мы собираемся увидеть, что переменные $ {Target_namespace}
, $ {Target_app_resource}
и $ {Target_name}
был заменен демонстрация
, Postgres
и Образец-postgrees-1
соответственно.
$ kubectl get repository -n demo postgres-sample-postgres-1 -o yaml
apiVersion: stash.appscode.com/v1beta1 kind: Repository metadata: creationTimestamp: "2019-08-01T13:54:48Z" finalizers: - stash generation: 1 name: postgres-sample-postgres-1 namespace: demo resourceVersion: "50171" selfLink: /apis/stash.appscode.com/v1beta1/namespaces/demo/repositories/postgres-sample-postgres-1 uid: ed49dde4-b463-11e9-a6a0-080027aded7e spec: backend: gcs: bucket: appscode-qa prefix: stash-backup/demo/postgres/sample-postgres-1 storageSecretName: gcs-secret
Проверьте backupconfiguration:
Убедитесь, что * Backuppigonfiguration
CRD был создан следующей командой:
$ kubectl get backupconfiguration -n demo NAME TASK SCHEDULE PAUSED AGE postgres-sample-postgres-1 postgres-backup-11.2 */5 * * * * 3m39s
Обратите внимание на Задача
поле. Это обозначает, что эта резервная копия будет выполняться с использованием Postgres-Backup-11.2
задача. Мы указали Postgres-Backup - $ {target_app_version}
Как название задачи в Backuppblueprint
Отказ Здесь переменная $ {Target_app_version}
был заменен версией базы данных.
Давайте проверим YAML этого Backuppigonfiguration
Отказ
$ kubectl get backupconfiguration -n demo postgres-sample-postgres-1 -o yaml
apiVersion: stash.appscode.com/v1beta1 kind: BackupConfiguration metadata: creationTimestamp: "2019-08-01T13:54:48Z" finalizers: - stash.appscode.com generation: 1 name: postgres-sample-postgres-1 namespace: demo ownerReferences: - apiVersion: v1 blockOwnerDeletion: false kind: AppBinding name: sample-postgres-1 uid: a799156e-b463-11e9-a6a0-080027aded7e resourceVersion: "50170" selfLink: /apis/stash.appscode.com/v1beta1/namespaces/demo/backupconfigurations/postgres-sample-postgres-1 uid: ed4bd257-b463-11e9-a6a0-080027aded7e spec: repository: name: postgres-sample-postgres-1 retentionPolicy: keepLast: 5 name: keep-last-5 prune: true runtimeSettings: {} schedule: '*/5 * * * *' target: ref: apiVersion: v1 kind: AppBinding name: sample-postgres-1 task: name: postgres-backup-11.2 tempDir: {}
Обратите внимание, что spec.target.ref
указывает на AppBinding Образец-postgrees-1
Что мы только что аннотировали с аннотацией автоматической резервной копии.
Ждать backupsession:
Теперь дождитесь следующего расписания резервного копирования. Запустите следующую команду, чтобы посмотреть Backupsession
CRD:
$ watch -n 1 kubectl get backupsession -n demo -l=stash.appscode.com/backup-configuration=postgres-sample-postgres-1 Every 1.0s: kubectl get backupsession -n demo -l=stash.appscode.com/backup-configuration=postgres-sample-postgres-1 workstation: Thu Aug 1 20:35:43 2019 NAME INVOKER-TYPE INVOKER-NAME PHASE AGE postgres-sample-postgres-1-1564670101 BackupConfiguration postgres-sample-postgres-1 Succeeded 42s
Примечание: Backup Cronjob создает Backupsession
CRD со следующей этикеткой stash.capsscode.com/backup-configuration=
Отказ Мы можем использовать этот ярлык, чтобы посмотреть только Backupsession
нашего желаемого Backuppigonfiguration
Отказ
Проверьте резервное копирование :
Когда завершена резервная копия, Stash обновит соответствующую Репозиторий
Чтобы отразить новейшее состояние резервных данных.
Запустите следующую команду, чтобы проверить, был ли снимок отправлен на бэкэнду:
$ kubectl get repository -n demo postgres-sample-postgres-1 NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE postgres-sample-postgres-1 true 1.324 KiB 1 73s 6m7s
Если мы перейдем к Stash-Backup/Demo/Postgres/Sample-Postgres-1
Справочник нашего ведра GCS, мы увидим, что снимка хранится там.
Резервное копирование второго образца PostgreSQL
Теперь давайте резервировать наш второй образец PostgreSQL, используя то же самое Backuppblueprint
Мы использовали для резервного копирования первого образца PostgreSQL.
Добавить аннотации:
Добавьте автоматическое резервное копирование специфической аннотации для AppBinding Образец-postgrees-2
Отказ
$ kubectl annotate appbinding sample-postgres-2 -n demo --overwrite \ stash.appscode.com/backup-blueprint=postgres-backup-blueprint
Убедитесь, что репозиторий:
Убедитесь, что Репозиторий
Был успешно создан следующей командой:
$ kubectl get repository -n demo NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE postgres-sample-postgres-1 true 1.324 KiB 1 2m3s 6m57s postgres-sample-postgres-2 15s
Здесь, репозиторий Postgres-образцы-postgres-2
был создан для второго образец PostgreSQL.
Если мы просматриваем YAML этого Репозиторий
мы увидим, что переменные $ {Target_namespace}
, $ {Target_app_resource}
и $ {Target_name}
были заменены демонстрация
, Postgres
и Образец-postgrees-2
соответственно.
$ kubectl get repository -n demo postgres-sample-postgres-2 -o yaml
apiVersion: stash.appscode.com/v1beta1 kind: Repository metadata: creationTimestamp: "2019-08-01T14:37:22Z" finalizers: - stash generation: 1 name: postgres-sample-postgres-2 namespace: demo resourceVersion: "56103" selfLink: /apis/stash.appscode.com/v1beta1/namespaces/demo/repositories/postgres-sample-postgres-2 uid: df58523c-b469-11e9-a6a0-080027aded7e spec: backend: gcs: bucket: appscode-qa prefix: stash-backup/demo/postgres/sample-postgres-2 storageSecretName: gcs-secret
Проверьте backupconfiguration:
Убедитесь, что Backuppigonfiguration
CRD был создан следующей командой:
$ kubectl get backupconfiguration -n demo NAME TASK SCHEDULE PAUSED AGE postgres-sample-postgres-1 postgres-backup-11.2 */5 * * * * 7m52s postgres-sample-postgres-2 postgres-backup-10.6 */5 * * * * 70s
Опять обратите внимание на Задача
поле. На этот раз $ {Target_app_version}
был заменен на 10,6
Какой вариант базы данных нашего второго образца.
Ждать backupsession:
Теперь дождитесь следующего расписания резервного копирования. Запустите следующую команду, чтобы посмотреть Backupsession
CRD:
$ watch -n 1 kubectl get backupsession -n demo -l=stash.appscode.com/backup-configuration=postgres-sample-postgres-2 Every 1.0s: kubectl get backupsession -n demo -l=stash.appscode.com/backup-configuration=postgres-sample-postgres-2 workstation: Thu Aug 1 20:55:40 2019 NAME INVOKER-TYPE INVOKER-NAME PHASE AGE postgres-sample-postgres-2-1564671303 BackupConfiguration postgres-sample-postgres-2 Succeeded 37s
Проверьте резервное копирование:
Запустите следующую команду, чтобы проверить, был ли снимок отправлен на бэкэнду:
$ kubectl get repository -n demo postgres-sample-postgres-2 NAME INTEGRITY SIZE SNAPSHOT-COUNT LAST-SUCCESSFUL-BACKUP AGE postgres-sample-postgres-2 true 1.324 KiB 1 52s 19m
Если мы перейдем к Stash-Backup/Demo/Postgres/Sample-Postgres-2
Справочник нашего ведра GCS, мы увидим, что снимка хранится там.
Чтобы очистить ресурсы Kubernetes, созданные этим руководством, запустите:
kubectl delete -n demo pg/sample-postgres-1 kubectl delete -n demo pg/sample-postgres-2 kubectl delete -n demo repository/postgres-sample-postgres-1 kubectl delete -n demo repository/postgres-sample-postgres-2 kubectl delete -n demo backupblueprint/postgres-backup-blueprint
Теперь вы получили глубокое погружение в создание рекуперации и резервного рекуперации Kubernetes-actactor и резервного копирования. Вы можете найти много действительно полезной информации на их документации здесь Отказ Больше содержимого можно найти в appfleet.
Оригинал: «https://dev.to/appfleet/tutorial-kubernetes-native-backup-and-recovery-with-stash-3dbd»