From 6cc0bf603b59f999d75c14ab72225019760d4719 Mon Sep 17 00:00:00 2001 From: ramagp Date: Thu, 12 Nov 2020 08:06:29 +0000 Subject: [PATCH] [DOC] changes to backup and restore ONAP component specific data bases Change-Id: I5e40c8b7a4a310414022224df82998b469fe556a Issue-ID: DOC-682 Signed-off-by: ramagp --- docs/guides/onap-operator/Backup-And-Restore.png | Bin 0 -> 46143 bytes docs/guides/onap-operator/onap_backup_restore.rst | 868 ++++++++++++++++++++++ docs/guides/onap-operator/platformoperations.rst | 11 +- 3 files changed, 877 insertions(+), 2 deletions(-) create mode 100644 docs/guides/onap-operator/Backup-And-Restore.png create mode 100644 docs/guides/onap-operator/onap_backup_restore.rst diff --git a/docs/guides/onap-operator/Backup-And-Restore.png b/docs/guides/onap-operator/Backup-And-Restore.png new file mode 100644 index 0000000000000000000000000000000000000000..bd66e4853a697e26709eb56a9590e1674922efab GIT binary patch literal 46143 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 literal 0 HcmV?d00001 diff --git a/docs/guides/onap-operator/onap_backup_restore.rst b/docs/guides/onap-operator/onap_backup_restore.rst new file mode 100644 index 000000000..9de914cf1 --- /dev/null +++ b/docs/guides/onap-operator/onap_backup_restore.rst @@ -0,0 +1,868 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 +.. International License. http://creativecommons.org/licenses/by/4.0 +.. Copyright © 2017-2020 Aarna Networks, Inc. + +.. Links +.. Github web page to download the latest version of velero open source tool +.. _Velero official website: https://velero.io +.. Reference link with more details on Instructions for setting up Velero server +.. _Setup Velero Server: https://velero.io/docs/v1.5/contributions/minio/#set-up-server + +Backup and Restore Solution +########################### + +Problem Statement and Requirement (User Story) +============================================== + +As an ONAP Operator- We require the ability to backup and restore ONAP state data, We want to have Disaster recovery solution for ONAP deployment done over K8. + +Basic Use case would be + +1) Add/Update/Modify the POD Data or DB Data. +2) Simulate a Disaster +3) Restore using Backup. +4) POD Data/DB entries should be recovered. + +Solution Description +==================== + +Narrowed down upon a tool which can be used for K8 Backup and Restoration for ONAP deployments named as Velero (formerly Heptio-ARK) + +Velero is an Opensource tool to back up and restore your Kubernetes cluster resources and persistent volumes. Velero lets you: + +* Take backups of your cluster and restore in case of loss. +* Copy cluster resources across cloud providers. NOTE: Cloud volume migrations are not yet supported. +* Replicate your production environment for development and testing environments. + +Velero consists of + +* A server that runs on your cluster +* A command-line client that runs locally + +Working Flow diagram + +.. figure:: Backup-And-Restore.png + :align: center + +Installation +============ +Prerequisites +------------- + +- Access to a Kubernetes cluster, version 1.7 or later. +- A DNS server on the cluster +- kubectl installed +- Labels should be defined there. + +Install Velero Tool +~~~~~~~~~~~~~~~~~~~ +Velero is an open source tool to safely backup and restore, perform disaster recovery, and migrate Kubernetes cluster resources and persistent volumes. + +Go to `Velero official website`_ and Click on DOWNLOAD VELERO BUTTON. It will take you to the github page to download the latest version of velero. Scroll down to the +bottom of the page and choose the binary corresponding to the OS where you want to run the Velero on. + +Install and configure Velero Server and Client +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To configure the latest version (1.5.2) of velero on Linux machine, please follow the below steps. + +Run the below command. It will download the velero to your machine + +.. code-block:: bash + + wget https://github.com/vmware-tanzu/velero/releases/download/v1.5.2/velero-v1.5.2-linux-amd64.tar.gz + +Extract it using below command + +.. code-block:: bash + + tar -zxvf velero-v1.5.2-linux-amd64.tar.gz + +Once extracted, goto the directory "velero-v1.5.2-linux-amd64" + +.. code-block:: bash + + cd velero-v1.5.2-linux-amd64 + +Inside this you will find a directory called examples and then minio, just go inside it + +.. code-block:: bash + + cd examples/minio + +Inside this you will find a file called 00-minio-deployment.yaml. Open this file using any editor and look for Velero service yaml portion, there you need to change +the type from ClusterIP to NodePort + +Once made the changes then run the below command to deploy velero server + +.. code-block:: bash + + kubectl apply -f 00-minio-deployment.yaml + +This will configure the Velero with Minio. Minio is nothing but local storage with aws s3 capabilities. Velero support many cloud providers as well like Azure,AWS,GCP +etc. You can configure any of those. + +Once the Velero deployment is done, then we need to install and configure the velero server component using velero cli. + +Create a Velero-specific credentials file (credentials-velero) in your local directory + +.. code-block:: bash + + [default] + aws_access_key_id=minio + aws_secret_access_key=minio123 + +Start the server and the local storage service. In the Velero directory, run + +.. code-block:: bash + + ./velero install \ + --provider aws \ + --plugins velero/velero-plugin-for-aws:v1.0.0 \ + --bucket velero \ + --secret-file ./credentials-velero \ + --use-volume-snapshots=false \ + --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio.velero.svc:9000 + --use-restic + +Refer this for more details: `Setup Velero Server`_ + +.. note:: + + As Labels need to be defined, because that is a unique identity which we need to have for any backup of our k8 containers, + + So in OOM code, Where -ever we don't have labels, We need to define that whether its configmap or secret, for eg below:- + + labels: + + app: {{ include "common.name" . }} + chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} + +Running Velero Example (Backup and Restoration with Logs) +--------------------------------------------------------- + +1) Install SO component +~~~~~~~~~~~~~~~~~~~~~~~ + +.. note:: + + This is an optional step, if you have already installed SO or all other components of ONAP then you can skip this step. + +Below is the example of installing SO component using helm + +.. code-block:: bash + + helm install so -n bkup --namespace test3 + + NAME: bkup + + LAST DEPLOYED: Fri Jul 20 06:59:09 2018 + + NAMESPACE: test3 + + STATUS: DEPLOYED + + RESOURCES: + + ==> v1/Pod(related) + + NAME READY STATUS RESTARTS AGE + + bkup-so-db-744fccd888-w67zk 0/1 Init:0/1 0 0s + + bkup-so-7668c746c-vngk8 0/2 Init:0/1 0 0s + + ==> v1/Secret + + NAME TYPE DATA AGE + + bkup-so-db Opaque 1 0s + + ==> v1/ConfigMap + + NAME DATA AGE + + confd-configmap 1 0s + + so-configmap 5 0s + + so-docker-file-configmap 1 0s + + so-filebeat-configmap 1 0s + + so-log-configmap 11 0s + + + ==> v1/PersistentVolume + + NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE + + bkup-so-db 2Gi RWX Retain Bound test3/bkup-so-db 0s + + + ==> v1/PersistentVolumeClaim + + NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE + + bkup-so-db Bound bkup-so-db 2Gi RWX 0s + + + ==> v1/Service + + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + + so-db NodePort 10.43.63.96 3306:30252/TCP 0s + + so NodePort 10.43.59.93 8080:30223/TCP,3904:30225/TCP,3905:30224/TCP,9990:30222/TCP,8787:30250/TCP 0s + + + ==> v1beta1/Deployment + + NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE + + bkup-so-db 1 1 1 0 0s + + bkup-so 1 1 1 0 0s + + +.. note:: + + Get the application URL by running these commands + + .. code-block:: bash + + export NODE_PORT=$(kubectl get --namespace test3 -o jsonpath="{.spec.ports[0].nodePort}" services so) + + export NODE_IP=$(kubectl get nodes --namespace test3 -o jsonpath="{.items[0].status.addresses[0].address}") + + echo http://$NODE_IP:$NODE_PORT + +2) Checking status of pod +~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: bash + + kubectl get pods --all-namespaces | grep -i so + + NAMESPACE NAME READY STATUS RESTARTS AGE + + test3 bkup-so-7668c746c-vngk8 2/2 Running 0 8m + + test3 bkup-so-db-744fccd888-w67zk 1/1 Running 0 8m + + +3) Creating backup of deployment +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Here I am using selector label as release name + +.. code-block:: bash + + ./velero backup create so-backup --selector release=bkup + + Backup request "so-backup" submitted successfully. + + Run `velero backup describe so-backup` for more details. + + +4) Checking backup logs +~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: bash + + ./velero backup describe so-backup + + Name: so-backup + + Namespace: velero + + Labels: + + Annotations: + + Phase: Completed + + + Namespaces: + + Included: * + + Excluded: + + + Resources: + + Included: * + + Excluded: + + Cluster-scoped: auto + + + Label selector: release=bkup + + + Snapshot PVs: auto + + + TTL: 720h0m0s + + + Hooks: + + + Backup Format Version: 1 + + Started: 2018-07-20 07:09:51 +0000 UTC + + Completed: 2018-07-20 07:09:53 +0000 UTC + + Expiration: 2018-08-19 07:09:51 +0000 UTC + + Validation errors: + + Persistent Volumes: + +5) Simulating a disaster +~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: bash + + helm delete --purge bkup + + release "bkup" deleted + +6)Restoring the kubernetes resources using velero +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: bash + + ./velero restore create --from-backup so-backup + + Restore request "so-backup-20180720071236" submitted successfully. + + Run `velero restore describe so-backup-20180720071236` for more details. + + +7) Checking restoration logs +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: bash + + ./velero restore describe so-backup-20180720071236 + + Name: so-backup-20180720071236 + + Namespace: velero + + Labels: + + Annotations: + + + Backup: so-backup + + Namespaces: + + Included: * + + Excluded: + + + Resources: + + Included: * + + Excluded: nodes, events, events.events.k8s.io, backups.ark.heptio.com, restores.ark.heptio.com + + Cluster-scoped: auto + + + Namespace mappings: + + Label selector: + + + Restore PVs: auto + + Phase: Completed + + Validation errors: + + Warnings: + + Errors: + + +8)Check backup files +~~~~~~~~~~~~~~~~~~~~ + +As we are using Minio which is local storage with aws s3 capabilities. Thus our all the backup files are being stored in locally in Minio Pod. Let's see where the backup files are being genreted. + +.. code-block:: bash + + kubectl get pod -n velero + NAME READY STATUS RESTARTS AGE + minio-d9c56ff5-cg8zp 1/1 Running 0 4d5h + minio-setup-ph8pk 0/1 Completed 0 4d5h + velero-74cdf64d76-t8wfs 1/1 Running 0 4d5h + +.. code-block:: bash + + kubectl exec -it -n velero minio-d9c56ff5-cg8zp ls storage/velero/backups/ + so-backup + aarna@anod-master:~$ + + kubectl exec -it -n velero minio-d9c56ff5-cg8zp ls storage/velero/backups/so-backup + so-backup-csi-volumesnapshotcontents.json.gz + so-backup-csi-volumesnapshots.json.gz + so-backup-logs.gz + so-backup-podvolumebackups.json.gz + so-backup-resource-list.json.gz + so-backup-volumesnapshots.json.gz + so-backup.tar.gz + velero-backup.json + + +9) Restore run +~~~~~~~~~~~~~~ + +.. code-block:: bash + + ./velero restore get + + NAME BACKUP STATUS WARNINGS ERRORS CREATED SELECTOR + + so-backup-20180720071236 so-backup Completed 0 0 2018-07-20 07:12:36 +0000 UTC + + +10) Check the pod status +~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: bash + + kubectl get pods --all-namespaces | grep -i so + + NAMESPACE NAME READY STATUS RESTARTS AGE + + test3 bkup-so-7668c746c-vngk8 2/2 Running 0 8m + + test3 bkup-so-db-744fccd888-w67zk 1/1 Running 0 8m + + + +Another Example with DB and PV Backup +------------------------------------- + +APPC component backup and restoration +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: bash + + kubectl get pods --all-namespaces | grep -i appc + onap bk-appc-0 1/2 Running 0 1m + onap bk-appc-cdt-7cd6f6d674-5thwj 1/1 Running 0 1m + onap bk-appc-db-0 2/2 Running 0 1m + onap bk-appc-dgbuilder-59895d4d69-7rp9q 1/1 Running 0 1m + + +Creating dummy entry in db +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: bash + + kubectl exec -it -n default bk-appc-db-0 bash + Defaulting container name to appc-db. + Use 'kubectl describe pod/bk-appc-db-0 -n onap' to see all of the containers in this pod. + root@bk-appc-db-0:/# + root@bk-appc-db-0:/# + root@bk-appc-db-0:/# + root@bk-appc-db-0:/# mysql -u root -p + Enter password: + Welcome to the MySQL monitor. Commands end with ; or \g. + Your MySQL connection id is 42 + Server version: 5.7.23-log MySQL Community Server (GPL) + + Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. + + Oracle is a registered trademark of Oracle Corporation and/or its + affiliates. Other names may be trademarks of their respective + owners. + + Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + + mysql> + mysql> + mysql> + mysql> connect mysql + Reading table information for completion of table and column names + You can turn off this feature to get a quicker startup with -A + + Connection id: 44 + Current database: mysql + + mysql> + mysql> + mysql> select * from servers; + Empty set (0.00 sec) + + mysql> desc servers; + +-------------+----------+------+-----+---------+-------+ + | Field | Type | Null | Key | Default | Extra | + +-------------+----------+------+-----+---------+-------+ + | Server_name | char(64) | NO | PRI | | | + | Host | char(64) | NO | | | | + | Db | char(64) | NO | | | | + | Username | char(64) | NO | | | | + | Password | char(64) | NO | | | | + | Port | int(4) | NO | | 0 | | + | Socket | char(64) | NO | | | | + | Wrapper | char(64) | NO | | | | + | Owner | char(64) | NO | | | | + +-------------+----------+------+-----+---------+-------+ + 9 rows in set (0.00 sec) + + mysql> insert into servers values ("test","ab","sql","user","pwd",1234,"test","wrp","vaib"); + Query OK, 1 row affected (0.03 sec) + + mysql> + mysql> + mysql> + mysql> select * from servers; + +-------------+------+-----+----------+----------+------+--------+---------+-------+ + | Server_name | Host | Db | Username | Password | Port | Socket | Wrapper | Owner | + +-------------+------+-----+----------+----------+------+--------+---------+-------+ + | abc | ab | sql | user | pwd | 1234 | test | wrp | vaib | + +-------------+------+-----+----------+----------+------+--------+---------+-------+ + 1 row in set (0.00 sec) + + mysql> + mysql> + mysql> exit + Bye + root@bk-appc-db-0:/# + root@bk-appc-db-0:/# + root@bk-appc-db-0:/# exit + command terminated with exit code 127 + kubectl get pods --all-namespaces | grep -i appc + onap bk-appc-0 1/2 Running 0 5m + onap bk-appc-cdt-7cd6f6d674-5thwj 1/1 Running 0 5m + onap bk-appc-db-0 2/2 Running 0 5m + onap bk-appc-dgbuilder-59895d4d69-7rp9q 1/1 Running 0 5m + + +Creating dummy file in APPC PV +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. code-block:: bash + + kubectl exec -it -n onap bk-appc-0 bash + Defaulting container name to appc. + Use 'kubectl describe pod/bk-appc-0 -n onap' to see all of the containers in this pod. + root@bk-appc-0:/# + root@bk-appc-0:/# + root@bk-appc-0:/# + root@bk-appc-0:/# cd /opt/opendaylight/current/daexim/ + root@bk-appc-0:/opt/opendaylight/current/daexim# ls + root@bk-appc-0:/opt/opendaylight/current/daexim# ls + root@bk-appc-0:/opt/opendaylight/current/daexim# + root@bk-appc-0:/opt/opendaylight/current/daexim# + root@bk-appc-0:/opt/opendaylight/current/daexim# touch abc.txt + root@bk-appc-0:/opt/opendaylight/current/daexim# ls + abc.txt + root@bk-appc-0:/opt/opendaylight/current/daexim# exit + exit + root@rancher:~/oom/kubernetes# kubectl get pods --all-namespaces | grep -i appc + onap bk-appc-0 1/2 Running 0 6m + onap bk-appc-cdt-7cd6f6d674-5thwj 1/1 Running 0 6m + onap bk-appc-db-0 2/2 Running 0 6m + onap bk-appc-dgbuilder-59895d4d69-7rp9q 1/1 Running 0 6m + + +Creating backup using velero +~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: bash + + ./velero backup create appc-bkup1 --selector release=bk + Backup request "appc-bkup1" submitted successfully. + Run `velero backup describe appc-bkup1` for more details. + + ./velero backup describe appc-bkup1 + Name: appc-bkup1 + Namespace: velero + Labels: + Annotations: + + Phase: Completed + + Namespaces: + Included: * + Excluded: + + Resources: + Included: * + Excluded: + Cluster-scoped: auto + + Label selector: release=bk + + Snapshot PVs: auto + + TTL: 720h0m0s + + Hooks: + + Backup Format Version: 1 + + Started: 2018-08-27 05:07:45 +0000 UTC + Completed: 2018-08-27 05:07:47 +0000 UTC + + Expiration: 2018-09-26 05:07:44 +0000 UTC + + Validation errors: + + Persistent Volumes: + + +Simulating disaster by deleting APPC +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: bash + + helm delete --purge bk + release "bk" deleted + + +Restoration using velero +~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: bash + + ./velero restore create --from-backup appc-bkup1 + Restore request "appc-bkup1-20180827052651" submitted successfully. + Run `velero restore describe appc-bkup1-20180827052651` for more details. + +Restoration details +~~~~~~~~~~~~~~~~~~~ + +Check the Restoration details immediately after restoration. Restoration process is in InProgress Phase. Please check the Phase. + +.. code-block:: bash + + ./velero restore describe appc-bkup1-20180827052651 + Name: appc-bkup1-20180827052651 + Namespace: velero + Labels: + Annotations: + + Backup: appc-bkup1 + + Namespaces: + Included: * + Excluded: + + Resources: + Included: * + Excluded: nodes, events, events.events.k8s.io, backups.ark.heptio.com, restores.ark.heptio.com + Cluster-scoped: auto + + Namespace mappings: + + Label selector: + + Restore PVs: auto + + Phase: InProgress + + Validation errors: + + Warnings: + Errors: + ./velero restore describe appc-bkup1-20180827052651 + Name: appc-bkup1-20180827052651 + Namespace: velero + Labels: + Annotations: + + Backup: appc-bkup1 + + Namespaces: + Included: * + Excluded: + + Resources: + Included: * + Excluded: nodes, events, events.events.k8s.io, backups.ark.heptio.com, restores.ark.heptio.com + Cluster-scoped: auto + + Namespace mappings: + + Label selector: + + Restore PVs: auto + + Phase: Completed + + Validation errors: + + + Warnings: + + Errors: + +This process might take some time to complete. When you check the Restoration details again after some time then the phase will show as Completed as shown below. + +.. code-block:: bash + + ./velero restore describe appc-bkup1-20180827052651 + Name: appc-bkup1-20180827052651 + Namespace: velero + Labels: + Annotations: + + Backup: appc-bkup1 + + Namespaces: + Included: * + Excluded: + + Resources: + Included: * + Excluded: nodes, events, events.events.k8s.io, backups.ark.heptio.com, restores.ark.heptio.com + Cluster-scoped: auto + + Namespace mappings: + + Label selector: + + Restore PVs: auto + + Phase: Completed + + Validation errors: + + Warnings: + + Errors: + + +List of restores +~~~~~~~~~~~~~~~~ + +.. code-block:: bash + + ark restore get + NAME BACKUP STATUS WARNINGS ERRORS CREATED SELECTOR + appc-bkup-20180827045955 appc-bkup Completed 2 0 2018-08-27 04:59:52 +0000 UTC + appc-bkup1-20180827052651 appc-bkup1 Completed 5 0 2018-08-27 05:26:48 +0000 UTC + vid-bkp-20180824053001 vid-bkp Completed 149 2 2018-08-24 05:29:59 +0000 UTC + +Completed status means the Restoration is done successfully. + +Restoration successful +~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: bash + + kubectl get pods --all-namespaces | grep -i appc + onap bk-appc-0 1/2 Running 0 26m + onap bk-appc-cdt-7cd6f6d674-5thwj 1/1 Running 0 26m + onap bk-appc-db-0 2/2 Running 0 26m + onap bk-appc-dgbuilder-59895d4d69-7rp9q 1/1 Running 0 26m + kubectl exec -it -n onap bk-appc-db-0 bash + Defaulting container name to appc-db. + Use 'kubectl describe pod/bk-appc-db-0 -n onap' to see all of the containers in this pod. + root@bk-appc-db-0:/# + root@bk-appc-db-0:/# + root@bk-appc-db-0:/# + + +Restoration of db successful +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: bash + + root@bk-appc-db-0:/# mysql -u root + ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) + root@bk-appc-db-0:/# mysql -u root -p + Enter password: + Welcome to the MySQL monitor. Commands end with ; or \g. + Your MySQL connection id is 335 + Server version: 5.7.23-log MySQL Community Server (GPL) + + Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. + + Oracle is a registered trademark of Oracle Corporation and/or its + affiliates. Other names may be trademarks of their respective + owners. + + Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + + mysql> connect mysql + Reading table information for completion of table and column names + You can turn off this feature to get a quicker startup with -A + + Connection id: 337 + Current database: mysql + + mysql> select * from servers; + +-------------+------+-----+----------+----------+------+--------+---------+-------+ + | Server_name | Host | Db | Username | Password | Port | Socket | Wrapper | Owner | + +-------------+------+-----+----------+----------+------+--------+---------+-------+ + | abc | ab | sql | user | pwd | 1234 | test | wrp | vaib | + +-------------+------+-----+----------+----------+------+--------+---------+-------+ + 1 row in set (0.00 sec) + + mysql> quit + Bye + root@bk-appc-db-0:/# exit + exit + + +Restoration of PV successful +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: bash + + kubectl get pods --all-namespaces | grep -i appc + onap bk-appc-0 1/2 Running 0 27m + onap bk-appc-cdt-7cd6f6d674-5thwj 1/1 Running 0 27m + onap bk-appc-db-0 2/2 Running 0 27m + onap bk-appc-dgbuilder-59895d4d69-7rp9q 1/1 Running 0 27m + kubectl exec -it -n onap bk-appc-0 bash + Defaulting container name to appc. + Use 'kubectl describe pod/bk-appc-0 -n onap' to see all of the containers in this pod. + root@bk-appc-0:/# + root@bk-appc-0:/# + root@bk-appc-0:/# + root@bk-appc-0:/# + root@bk-appc-0:/# cd /opt/opendaylight/current/daexim/ + root@bk-appc-0:/opt/opendaylight/current/daexim# ls + abc.txt + root@bk-appc-0:/opt/opendaylight/current/daexim# + root@bk-appc-0:/opt/opendaylight/current/daexim# + root@bk-appc-0:/opt/opendaylight/current/daexim# exit + exit + + +Use Cases +--------- + +Disaster recovery +~~~~~~~~~~~~~~~~~ + +Using Schedules and Restore-Only Mode + +If you periodically back up your cluster’s resources, you are able to return to a previous state in case of some unexpected mishap, such as a service outage. + +Cluster migration +~~~~~~~~~~~~~~~~~ + +Using Backups and Restores + +Velero can help you port your resources from one cluster to another, as long as you point each Velero Config to the same cloud object storage. + +References: +https://github.com/vmware-tanzu/velero diff --git a/docs/guides/onap-operator/platformoperations.rst b/docs/guides/onap-operator/platformoperations.rst index 520586e84..3d4f8a614 100644 --- a/docs/guides/onap-operator/platformoperations.rst +++ b/docs/guides/onap-operator/platformoperations.rst @@ -76,9 +76,16 @@ functions ONAP Backup and Restore ----------------------- -To Backup ONAP a solution is described in Wiki (Migration to RTD->TBD): +To backup and restore ONAP component specific databases you can follow the below link: -`Backup and Restore Solution `_ +.. toctree:: + :maxdepth: 1 + + onap_backup_restore.rst + +.. note:: + Refer to the wiki page for further details: + `Legacy Backup and Restore Solution `_ ONAP Multisite Deployment ------------------------- -- 2.16.6