Como Fazer Backup e Restaurar Dados de um Cluster DOKS Usando Velero

Introdução

Assim como em qualquer outro ambiente, os dados em um cluster Kubernetes podem estar em risco de serem perdidos. Para evitar problemas graves, é essencial ter um plano de recuperação de dados em mãos. Uma maneira simples e eficaz de fazer isso é fazendo backups, garantindo que seus dados estejam seguros em caso de eventos inesperados. Os backups podem ser executados pontualmente ou agendados. É uma boa ideia ter backups agendados para garantir que você tenha um backup recente para recorrer facilmente.

O Velero – uma ferramenta de código aberto projetada para ajudar nas operações de backup e restauração para clusters Kubernetes. É ideal para o caso de recuperação de desastres, bem como para criar snapshots do estado de sua aplicação antes de realizar operações no sistema de seu cluster, como atualizações. Para mais detalhes sobre este tópico, por favor, visite a página oficial Como Funciona o Velero.

Neste tutorial, você aprenderá como implantar o Velero em seu cluster Kubernetes, criar backups e recuperar um backup se algo der errado. Você pode fazer backup de todo o seu cluster ou opcionalmente escolher um namespace ou seletor de rótulo para fazer backup do seu cluster.

Tabela de Conteúdos

Pré-requisitos

Para completar este tutorial, você precisa do seguinte:

  • A DO Spaces Bucket and access keys. Save the access and secret keys in a safe place for later use.
  • A DigitalOcean API token for Velero to use.
  • A Git client, to clone the Starter Kit repository.
  • Helm para gerenciar releases e atualizações do Velero.
  • Doctl para interação com a API da DigitalOcean.
  • Kubectl para interação com o Kubernetes.
  • Cliente Velero para gerenciar backups do Velero.

Passo 1 – Instalando Velero usando Helm

Nesta etapa, você implantará o Velero e todos os componentes necessários, para que ele possa realizar backups dos recursos do seu cluster Kubernetes (incluindo PVs). Os dados de backup serão armazenados no bucket do DO Spaces criado anteriormente na seção Pré-requisitos.

Primeiro, clone o repositório Git do Starter Kit e altere o diretório para sua cópia local:

git clone https://github.com/digitalocean/Kubernetes-Starter-Kit-Developers.git

cd Kubernetes-Starter-Kit-Developers

Em seguida, adicione o repositório Helm e liste os charts disponíveis:

helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts

helm repo update vmware-tanzu

helm search repo vmware-tanzu

A saída se parecerá com o seguinte:

NAME                    CHART VERSION   APP VERSION     DESCRIPTION
vmware-tanzu/velero     2.29.7          1.8.1           A Helm chart for velero

O chart de interesse é vmware-tanzu/velero, que instalará o Velero no cluster. Por favor, visite a página do chart Velero para mais detalhes sobre este chart.

Em seguida, abra e inspecione o arquivo de valores do Helm do Velero fornecido no repositório do Starter Kit usando um editor de sua escolha (de preferência com suporte a lint YAML).

VELERO_CHART_VERSION="2.29.7"

code 05-setup-backup-restore/assets/manifests/velero-values-v${VELERO_CHART_VERSION}.yaml

Depois, substitua os espaços reservados <> de acordo com o seu bucket Velero do DO Spaces (como nome, região e segredos). Certifique-se de fornecer também seu token da API DigitalOcean (chave DIGITALOCEAN_TOKEN).

Por fim, instale o Velero usando helm:

VELERO_CHART_VERSION="2.29.7"

helm install velero vmware-tanzu/velero --version "${VELERO_CHART_VERSION}" \
  --namespace velero \
  --create-namespace \
  -f 05-setup-backup-restore/assets/manifests/velero-values-v${VELERO_CHART_VERSION}.yaml

A specific version of the Velero Helm chart is used. In this case 2.29.7 is picked, which maps to the 1.8.1 version of the application (see the output from Step 2.). It’s a good practice in general to lock on a specific version. This helps to have predictable results and allows versioning control via Git.

–create-namespace \

helm ls -n velero

Agora, verifique sua implantação do Velero executando:

NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
velero  velero          1               2022-06-09 08:38:24.868664 +0300 EEST   deployed        velero-2.29.7   1.8.1

A saída será semelhante ao seguinte (a coluna STATUS deve exibir deployed):

kubectl get deployment velero -n velero

Em seguida, verifique se o Velero está funcionando:

NAME     READY   UP-TO-DATE   AVAILABLE   AGE
velero   1/1     1            1           67s

A saída se parece com o seguinte (os pods de implantação devem estar no estado Ready):

kubectl -n velero get all

Se você estiver interessado em explorar mais, pode visualizar os componentes do servidor do Velero:

  • Explore as páginas de ajuda do CLI do Velero para ver quais comandos e subcomandos estão disponíveis. Você pode obter ajuda para cada um usando a flag --help:
  • Liste todos os comandos disponíveis para o Velero:

Liste as opções de comando backup para o Velero:

O Velero usa várias CRDs (Definições de Recursos Personalizados) para representar seus recursos como backups, agendamentos de backups, etc. Você descobrirá cada um nos próximos passos do tutorial, juntamente com alguns exemplos básicos.

Passo 2 – Exemplo de Backup e Restauração de Namespace

Nesta etapa, você aprenderá como realizar um backup único de um namespace inteiro do seu cluster DOKS e restaurá-lo posteriormente, garantindo que todos os recursos sejam recriados. O namespace em questão é ambassador.

Criando o Backup do Namespace Ambassador

velero backup create ambassador-backup --include-namespaces ambassador

Primeiro, inicie o backup:

velero backup get

Em seguida, verifique se o backup foi criado:

NAME                                       STATUS      ERRORS   WARNINGS   CREATED                          EXPIRES   STORAGE LOCATION   SELECTOR
ambassador-backup                          Completed   0        0          2021-08-25 19:33:03 +0300 EEST   29d       default            <none>

A saída se parece com:

velero backup describe ambassador-backup --details

Depois, após alguns momentos, você pode inspecioná-lo:

Name:         ambassador-backup
Namespace:    velero
Labels:       velero.io/storage-location=default
Annotations:  velero.io/source-cluster-k8s-gitversion=v1.21.2
              velero.io/source-cluster-k8s-major-version=1
              velero.io/source-cluster-k8s-minor-version=21

Phase:  Completed

Errors:    0
Warnings:  0

Namespaces:
  Included:  ambassador
  Excluded:  <none>
  ...
  • A saída se parece com:
  • Procure pela linha Fase. Deve dizer Concluído.
  • Verifique se nenhum erro é relatado também.

Um novo objeto de backup do Kubernetes é criado:

~ kubectl get backup/ambassador-backup -n velero -o yaml

apiVersion: velero.io/v1
kind: Backup
metadata:
annotations:
velero.io/source-cluster-k8s-gitversion: v1.21.2
velero.io/source-cluster-k8s-major-version: "1"
velero.io/source-cluster-k8s-minor-version: "21"
...

Finalmente, dê uma olhada no bucket do DO Spaces e verifique se há uma nova pasta chamada backups que contenha os ativos criados para o seu ambassador-backup:

Excluindo o Namespace e Recursos do Ambassador

kubectl delete namespace ambassador

Primeiro, simule um desastre deletando intencionalmente o namespace ambassador:

kubectl get namespaces

Em seguida, verifique se o namespace foi excluído (a listagem de namespaces não deve imprimir ambassador):

curl -Li http://quote.starter-kit.online/quote/

curl -Li http://echo.starter-kit.online/echo/

Por fim, verifique se o endpoint dos serviços de backend echo e quote está DOWN. Consulte Criando os Serviços de Backend do Ambassador Edge Stack sobre as aplicações de backend usadas no tutorial do Starter Kit. Você pode usar o curl para testar (ou pode usar o seu navegador da web):

Restaurando o Backup do Namespace do Ambassador

velero restore create --from-backup ambassador-backup

Restaure o ambassador-backup:

Importante: Ao excluir o namespace ambassador, o recurso balanceador de carga associado ao serviço do embaixador também será excluído. Portanto, ao restaurar o serviço ambassador, o balanceador de carga será recriado pela DigitalOcean. O problema aqui é que você obterá um endereço IP NOVO para o seu balanceador de carga, então você precisará ajustar os registros A para direcionar o tráfego para seus domínios hospedados no cluster.

Verificando a Restauração do Namespace do Embaixador

velero restore describe ambassador-backup

Para verificar a restauração do namespace ambassador, verifique a linha Fase da saída do comando ambassador-backup restore. Deverá dizer Concluído (também, por favor, observe a seção de Avisos – ela informa se algo deu errado):

kubectl get all --namespace ambassador

Em seguida, verifique se todos os recursos foram restaurados para o namespace ambassador. Procure pelos pods ambassador, serviços e implantações.

NAME                                    READY   STATUS    RESTARTS   AGE
pod/ambassador-5bdc64f9f6-9qnz6         1/1     Running   0          18h
pod/ambassador-5bdc64f9f6-twgxb         1/1     Running   0          18h
pod/ambassador-agent-bcdd8ccc8-8pcwg    1/1     Running   0          18h
pod/ambassador-redis-64b7c668b9-jzxb5   1/1     Running   0          18h

NAME                       TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)                      AGE
service/ambassador         LoadBalancer   10.245.74.214    159.89.215.200   80:32091/TCP,443:31423/TCP   18h
service/ambassador-admin   ClusterIP      10.245.204.189   <none>           8877/TCP,8005/TCP            18h
service/ambassador-redis   ClusterIP      10.245.180.25    <none>           6379/TCP                     18h

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/ambassador         2/2     2            2           18h
deployment.apps/ambassador-agent   1/1     1            1           18h
deployment.apps/ambassador-redis   1/1     1            1           18h

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/ambassador-5bdc64f9f6         2         2         2       18h
replicaset.apps/ambassador-agent-bcdd8ccc8    1         1         1       18h
replicaset.apps/ambassador-redis-64b7c668b9   1         1         1       18h

A saída se parece com:

kubectl get hosts -n ambassador

Obtenha hosts do embaixador:

NAME         HOSTNAME                   STATE   PHASE COMPLETED   PHASE PENDING   AGE
echo-host    echo.starter-kit.online    Ready                                     11m
quote-host   quote.starter-kit.online   Ready                                     11m

A saída se parece com:

ESTADO deve ser Pronto e a coluna NOME DO HOST deve apontar para o nome do host totalmente qualificado.

kubectl get mappings -n ambassador

Obtenha mapeamentos do embaixador:

NAME                          SOURCE HOST                SOURCE PREFIX                               DEST SERVICE     STATE   REASON
ambassador-devportal                                     /documentation/                             127.0.0.1:8500
ambassador-devportal-api                                 /openapi/                                   127.0.0.1:8500
ambassador-devportal-assets                              /documentation/(assets|styles)/(.*)(.css)   127.0.0.1:8500
ambassador-devportal-demo                                /docs/                                      127.0.0.1:8500
echo-backend                  echo.starter-kit.online    /echo/                                      echo.backend
quote-backend                 quote.starter-kit.online   /quote/                                     quote.backend

A saída se parece com (observe o echo-backend que está mapeado para o host echo.starter-kit.online e o prefixo de origem /echo/, o mesmo para quote-backend):

curl -Li https://quote.starter-kit.online/quote/

curl -Li https://echo.starter-kit.online/echo/

Finalmente, após reconfigurar seu balanceador de carga e as configurações de domínio do DigitalOcean, verifique se o endpoint dos serviços de backend echo e quote está UP. Consulte Como Criar os Serviços de Backend da Pilha de Borda do Ambassador.

Na próxima etapa, você simulará um desastre deletando intencionalmente seu cluster DOKS.

Etapa 3 – Exemplo de Backup e Restauração do Cluster Inteiro

Nesta etapa, você simulará um cenário de recuperação de desastre. O cluster DOKS inteiro será deletado e então restaurado a partir de um backup anterior.

Criando o Backup do Cluster DOKS

velero backup create all-cluster-backup

Primeiro, crie um backup para o cluster DOKS inteiro:

velero backup get

Em seguida, verifique se o backup foi criado e não está relatando nenhum erro. O seguinte comando lista todos os backups disponíveis:

NAME                                       STATUS      ERRORS   WARNINGS   CREATED                          EXPIRES   STORAGE LOCATION   SELECTOR
all-cluster-backup                         Completed   0        0          2021-08-25 19:43:03 +0300 EEST   29d       default            <none>

A saída se parece com:

velero backup describe all-cluster-backup

velero backup logs all-cluster-backup

Finalmente, inspecione o estado e os logs do backup (verifique se não há erros relatados):

Importante: Sempre que você destruir um cluster DOKS sem especificar a flag --dangerous para o comando doctl e em seguida restaurá-lo, o mesmo balanceador de carga com o mesmo IP é recriado. Isso significa que você não precisa atualizar seus registros A do DNS da DigitalOcean.
Mas quando a flag --dangerous é aplicada ao comando doctl, o balanceador de carga existente será destruído e um novo balanceador de carga com um novo IP externo será criado quando o Velero restaurar o seu controlador de ingresso. Portanto, certifique-se de atualizar seus registros A do DNS da DigitalOcean conforme necessário.

Primeiro, exclua todo o cluster DOKS (certifique-se de substituir os espaços reservados <> conforme necessário).

doctl kubernetes cluster delete <DOKS_CLUSTER_NAME>

Para excluir o cluster Kubernetes sem destruir o balanceador de carga associado, execute:

doctl kubernetes cluster delete <DOKS_CLUSTER_NAME> --dangerous

Ou para excluir o cluster Kubernetes junto com o balanceador de carga associado:

Em seguida, recrie o cluster, conforme descrito em Configurar o Kubernetes da DigitalOcean. É importante garantir que a contagem de nós do novo cluster DOKS seja igual ou maior à original.

Em seguida, instale o CLI e o servidor do Velero, conforme descrito na seção de Pré-requisitos e no Passo 1 – Instalando o Velero usando o Helm respectivamente. É importante usar a mesma versão do Helm Chart.

velero restore create --from-backup all-cluster-backup

Por fim, restaure tudo executando o seguinte comando:

Verificando o Estado das Aplicações do Cluster DOKS

velero restore describe all-cluster-backup-<timestamp>

Primeiro, verifique a linha Fase do comando de descrição de restauração do all-cluster-backup. (Substitua os marcadores <> conforme necessário). Deve dizer Concluído.

kubectl get all --all-namespaces

Agora, verifique todos os recursos do cluster executando:

curl -Li http://quote.starter-kit.online/quote/

curl -Li http://echo.starter-kit.online/echo/

Agora, as aplicações de backend devem responder às solicitações HTTP também. Consulte Criando os Serviços de Backend da Pilha de Borda do Embaixador em relação às aplicações de backend usadas no tutorial do Starter Kit.

Na próxima etapa, você aprenderá como realizar backups programados (ou automáticos) para as aplicações do seu cluster DOKS.

Passo 4 – Backups Programados

Fazer backups automaticamente com base em um cronograma é uma característica realmente útil. Isso permite que você retroceda no tempo e restaure o sistema para um estado de funcionamento anterior se algo der errado.

A criação de um backup programado é um processo muito simples. Um exemplo é fornecido abaixo para um intervalo de 1 minuto (o namespace kube-system foi escolhido).

velero schedule create kube-system-minute-backup --schedule="@every 1m" --include-namespaces kube-system

Primeiro, crie o cronograma:

schedule="*/1 * * * *"

O formato do cronjob do Linux também é suportado:

velero schedule get

Em seguida, verifique se o cronograma foi criado:

NAME                        STATUS    CREATED                          SCHEDULE    BACKUP TTL   LAST BACKUP   SELECTOR
kube-system-minute-backup   Enabled   2021-08-26 12:37:44 +0300 EEST   @every 1m   720h0m0s     32s ago       <none>

A saída se parece com:

velero backup get

Então, inspecione todos os backups após um minuto mais ou menos:

NAME                                       STATUS      ERRORS   WARNINGS   CREATED                          EXPIRES   STORAGE LOCATION   SELECTOR
kube-system-minute-backup-20210826093916   Completed   0        0          2021-08-26 12:39:20 +0300 EEST   29d       default            <none>
kube-system-minute-backup-20210826093744   Completed   0        0          2021-08-26 12:37:44 +0300 EEST   29d       default            <none>

A saída se parece com:

Verificando o estado do Backup Programado

velero backup describe kube-system-minute-backup-<timestamp>

Primeiro, verifique a linha Fase de um dos backups (substitua os espaços reservados <> conforme necessário). Deve dizer Concluído.

Por fim, tome nota de possíveis erros e avisos da saída acima também para verificar se algo deu errado.

Restaurando o Backup Agendado

Para restaurar backups de um minuto atrás, siga os mesmos passos que você aprendeu nas etapas anteriores deste tutorial. Esta é uma boa maneira de exercitar e testar sua experiência acumulada até agora.

Na próxima etapa, você aprenderá como excluir manualmente ou automaticamente backups específicos que você criou ao longo do tempo.

Passo 5 – Excluindo Backups

Se você não precisa mais dos backups antigos, pode liberar alguns recursos tanto no cluster Kubernetes quanto no bucket do Velero DO Spaces.

Excluindo um Backup Manualmente

velero backup delete kube-system-minute-backup-<timestamp>

Primeiro, escolha um backup de um minuto, por exemplo, e emita o seguinte comando (substitua os espaços reservados <> de acordo):

Agora, verifique se foi removido da saída do comando velero backup get. Deve ser excluído também do bucket DO Spaces.

Em seguida, você irá excluir vários backups de uma vez usando um selector. O subcomando velero backup delete fornece uma flag chamada --selector. Isso permite que você exclua vários backups de uma vez com base em rótulos do Kubernetes. As mesmas regras se aplicam aos Seletores de Rótulos do Kubernetes.

velero backup get

Primeiro, liste os backups disponíveis:

NAME                                       STATUS      ERRORS   WARNINGS   CREATED                          EXPIRES   STORAGE LOCATION   SELECTOR
ambassador-backup                          Completed   0        0          2021-08-25 19:33:03 +0300 EEST   23d       default            <none>
backend-minute-backup-20210826094116       Completed   0        0          2021-08-26 12:41:16 +0300 EEST   24d       default            <none>
backend-minute-backup-20210826094016       Completed   0        0          2021-08-26 12:40:16 +0300 EEST   24d       default            <none>
backend-minute-backup-20210826093916       Completed   0        0          2021-08-26 12:39:16 +0300 EEST   24d       default            <none>
backend-minute-backup-20210826093816       Completed   0        0          2021-08-26 12:38:16 +0300 EEST   24d       default            <none>
backend-minute-backup-20210826093716       Completed   0        0          2021-08-26 12:37:16 +0300 EEST   24d       default            <none>
backend-minute-backup-20210826093616       Completed   0        0          2021-08-26 12:36:16 +0300 EEST   24d       default            <none>
backend-minute-backup-20210826093509       Completed   0        0          2021-08-26 12:35:09 +0300 EEST   24d       default            <none>

A saída se parece com:

velero describe backup backend-minute-backup-20210826094116

Em seguida, diga que deseja excluir todos os ativos backend-minute-backup-*. Escolha um backup da lista e inspecione os Rótulos:

Name:         backend-minute-backup-20210826094116
Namespace:    velero
Labels:       velero.io/schedule-name=backend-minute-backup
              velero.io/storage-location=default
Annotations:  velero.io/source-cluster-k8s-gitversion=v1.21.2
              velero.io/source-cluster-k8s-major-version=1
              velero.io/source-cluster-k8s-minor-version=21

Phase:  Completed

Errors:    0
Warnings:  0

Namespaces:
Included:  backend
Excluded:  <none>
...

A saída se parece com (observe o valor do rótulo velero.io/schedule-name):

velero backup delete --selector velero.io/schedule-name=backend-minute-backup

Em seguida, você pode excluir todos os backups que correspondem ao valor backend-minute-backup do rótulo velero.io/schedule-name:

Por fim, verifique se todos os ativos backend-minute-backup-* desapareceram da saída do comando velero backup get, bem como do bucket DO Spaces.

Exclusão Automática de Backup via TTL

  • Quando você cria um backup, pode especificar um TTL (Tempo de Vida), usando a flag --ttl. Se o Velero perceber que um recurso de backup existente expirou, ele remove:
  • O recurso Backup
  • O arquivo de backup do armazenamento de objeto na nuvemstorage
  • Todas as capturas de PersistentVolume

Todos os Restores associados

A flag TTL permite que o usuário especifique o período de retenção do backup com o valor especificado em horas, minutos e segundos no formato --ttl 24h0m0s. Se não especificado, um valor TTL padrão de 30 dias será aplicado.

velero backup create ambassador-backup-3min-ttl --ttl 0h3m0s --include-namespaces ambassador

Primeiro, crie o backup do ambassador, usando um valor TTL de 3 minutos:

velero backup describe ambassador-backup-3min-ttl

Em seguida, inspecione o backup do ambassador:

Name:         ambassador-backup-3min-ttl
Namespace:    velero
Labels:       velero.io/storage-location=default
Annotations:  velero.io/source-cluster-k8s-gitversion=v1.21.2
              velero.io/source-cluster-k8s-major-version=1
              velero.io/source-cluster-k8s-minor-version=21

Phase:  Completed

Errors:    0
Warnings:  0

Namespaces:
Included:  ambassador
Excluded:  <none>

Resources:
Included:        *
Excluded:        <none>
Cluster-scoped:  auto

Label selector:  <none>

Storage Location:  default

Velero-Native Snapshot PVs:  auto

TTL:  3m0s
...

A new folder should be created in the DO Spaces Velero bucket as well, named ambassador-backup-3min-ttl.

A saída parece semelhante a isto (observe a seção Namespaces -> Included – ela deve exibir ambassador, e o campo TTL está definido para 3ms0):

Finalmente, após cerca de três minutos, o backup e os recursos associados devem ser excluídos automaticamente. Você pode verificar que o objeto de backup foi destruído usando: velero backup describe ambassador-backup-3min-ttl. Deverá falhar com um erro indicando que o backup não existe mais. A pasta correspondente ambassador-backup-3min-ttl do bucket Velero do DO Spaces também será excluída.

velero backup delete --help

Indo além, você pode explorar todas as opções disponíveis de velero backup delete, via:

Conclusão

Neste tutorial, você aprendeu como realizar backups únicos e agendados, e restaurar tudo. Ter backups agendados é muito importante, pois permite reverter para um snapshot anterior no tempo se algo der errado ao longo do caminho. Você também passou por um cenário de recuperação de desastres.

Restaurar Volumes de Snapshots em Clusters Kubernetes

Source:
https://www.digitalocean.com/community/developer-center/how-to-backup-and-restore-data-of-a-doks-cluster-using-velero