Backup e Recuperação com Etcd: Kubernetes, Velero e Minio - Guia Avançado

Anteriormente, discutimos backups em nível de snapshot do etcd, que são suficientes para o dia a dia. No entanto, os backups de snapshot do etcd são globais, não permitindo backup e recuperação de dados específicos ou selecionados. Para resolver essa limitação, apresentamos o Velero, que permite backup e recuperação de recursos específicos.

  1. Velero

1.1 Introdução ao Velero

Site oficial: https://velero.io/

  • O Velero é uma ferramenta de código aberto para recuperação de desastres e migração nativa da nuvem, desenvolvida pela VMware (originalmente pela Heptio, adquirida pela VMware). Escrito em Go, permite backup, recuperação e migração segura de dados de recursos de clusters Kubernetes.
  • Suporta clusters Kubernetes padrão, tento em plataformas de nuvem privada quanto pública. Além da recuperação de desastres, também pode transferir recursos de um cluster para outro.
  • O Velero funciona salvando dados do Kubernetes em armazenamento de objetos para alta disponibilidade e persistência. Por padrão, os backups são mantidos por 720 horas e podem ser baixados e recuperados quando necessário.

1.2 Diferenças entre Velero e backups de snapshot do etcd

  • Os snapshots do etcd são backups globais (semelhante a um backup completo do MySQL). Mesmo para recuperar um único objeto de recurso (como restaurar apenas um banco de dados no MySQL), é necessário restaurar o estado completo do backup (como um restore completo do banco de dados), o que afeta outros namespaces e pods em execução.
  • O Velero permite backups direcionados, como backup por namespace específico ou apenas de objetos de recurso individuais. Na recuperação, é possível restaurar apenas namespaces ou recursos específicos sem afetar outros namespaces. Além disso, o Velero realiza backups incrementais, apenas salvando dados alterados no etcd desde o último backup.
  • O Velero suporta sistemas de armazenamento de objetos como Ceph e OSS.
  • O Velero suporta agendamento de tarefas para backups periódicos, assim como os snapshots do etcd podem ser agendados via cronjob.
  • O Velero suporta a criação e restauração de snapshots de volumes EBS da AWS.

1.3 Arquitetura do Velero

1.4 Fluxo de Backup

Site oficial: https://velero.io/docs/v1.11/how-velero-works/

~# velero backup criar meu-servico-ns-backup-${DATA} --include-namespaces meu-servico --kubeconfig=./usuario-aws.kubeconfig --namespace sistema-velero
  1. O cliente Velero chama o Kubernetes API Server para criar um objeto Backup.
  2. O BackupController, usando mecanismo de watch, obtém a tarefa de backup via API Server e a valida.
  3. Após validação, o BackupController inicia o porcesso de backup, solicitando dados ao API Server.
  4. O BackupController envia os dados coletados para o servidor de armazenamento de objetos especificado.

Por padrão, o velero backup cria snapshots de discos para volumes persistentes. Pode ajustar isso com outros flags. Use velero backup criar --help para ver flags disponíveis. Pode desativar snapshots com --snpashot-volumes=false.

1.5 Fluxo de Recuperação

  1. O cliente Velero chama o k8s api-server para criar um objeto Restore.
  2. O RestoreController, usando mecanismo de watch, obtém o objeto de restauração via API Server e o valida.
  3. O RestoreController obtém informações de backup do serviço de armazenamento de objetos. Em seguida, executa pré-processamento nos recursos do backup para garantir que funcionarão no novo cluster.
  4. O RestoreController inicia o processo de recuperação, restaurando recursos que atendem aos critérios um por um.

Por padrão, o Velero executa recuperação não destrutiva, não removendo dados do cluster de destino. Se um recurso já existir, ele será ignorado. Pode configurar o Velero para usar uma política de atualização com o flag --existing-resource-policy. Quando definido como "update", o Velero tentará atualizar recursos existentes para corresponder aos do backup.

  1. Minio

Site oficial: https://www.minio.org.cn/index.shtml

2.1 Introdução

  • MinIO oferece um sistema de armazenamento de objetos de alto desempenho, compatível com S3, permitindo construir seu próprio serviço de armazenamento na nuvem.
  • MinIO tem suporte nativo ao Kubernetes e pode ser usado em qualquer nuvem pública, distribuição Kubernetes, nuvem privada e borda.
  • MinIO é definido por software, sem necessidade de hardware adicional, e é 100% open source sob a licença GNU AGPL v3.

2.2 Criando o Dockerfile do Minio

[root@containerd-build-image minio]# cat Dockerfile 
FROM baseimages.centos:7.9

ADD minio /usr/local/bin/
ADD iniciar_minio.sh /root

RUN chmod u+x /usr/local/bin/minio && \
    mkdir -p /dados/ && \
    chmod u+x /root/iniciar_minio.sh

CMD ["/root/iniciar_minio.sh"]

2.3 Script de inicialização do serviço

[root@containerd-build-image minio]# cat iniciar_minio.sh 
#!/bin/bash
/usr/local/bin/minio server /dados --console-address :9090

2.4 Script de build da imagem

[root@containerd-build-image minio]# cat construir-imagem.sh
#!/bin/bash
nerdctl build -t registro.k8s/imagens/minio:v1 . && \
nerdctl push registro.k8s/imagens/minio:v1 && \
nerdctl rmi registro.k8s/imagens/minio:v1

2.5 Download do binário do Minio

[root@containerd-build-image minio]# wget https://dl.min.io/server/minio/release/linux-amd64/minio

2.6 Construindo a imagem

[root@containerd-build-image minio]# sh construir-imagem.sh

  1. Implantando o Minio no cluster Kubernetes

3.1 Criando o deployment yaml

[root@k8s-harbor01 minio]# pwd
/root/yaml/deployment/minio

[root@k8s-harbor01 minio]# cat deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: minio
  name: minio
  namespace: meu-servico
spec:
  replicas: 1
  selector:
    matchLabels:
      app: minio
  template:
    metadata:
      labels:
        app: minio
    spec:
      containers:
      - name: minio
        image: registro.k8s/imagens/minio:v1
        volumeMounts:
        - name: nfs-minio
          mountPath: /dados
      volumes:
      - name: nfs-minio
        nfs:
          server: 10.31.200.104
          path: /dados/k8s/minio-dados
      imagePullSecrets:
        - name: segredos-registro-imagens

3.2 Criando diretório de persistência NFS e criando o Minio

[root@k8s-harbor01 minio]# mkdir -p /dados/k8s/minio-dados

[root@k8s-harbor01 minio]# kubectl apply -f deployment.yaml
[root@k8s-harbor01 minio]# kubectl get po -n meu-servico |grep minio
minio-5cc5fc9498-lmzwh   1/1     Running   0          41s

3.3 Criando o serviço (Service)

3.3.1 Criando serviço do tipo NodePort

[root@k8s-harbor01 minio]# cat nodeport.yaml
apiVersion: v1
kind: Service
metadata:
  name: minio-nodeport
  namespace: meu-servico
spec:
  ports:
  - name: web
    port: 80
    targetPort: 9090
  - name: tcp
    port: 8080
    targetPort: 9000
  type: NodePort
  selector:
    app: minio

[root@k8s-harbor01 minio]# kubectl apply -f nodeport.yaml
service/minio-nodeport created

[root@k8s-harbor01 minio]# kubectl get svc -n meu-servico
NAME             TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                       AGE
minio-nodeport   NodePort   10.100.61.157   <none>        80:32369/TCP,8080:30000/TCP   7m56s
</none>

3.3.2 Criando serviço do tipo ClusterIP

[root@k8s-harbor01 minio]# cat svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: minio
  namespace: meu-servico
spec:
  ports:
  - name: tcp
    port: 9000
    targetPort: 9000
  selector:
    app: minio

[root@k8s-harbor01 minio]# kubectl apply -f svc.yaml
service/minio created

[root@k8s-harbor01 minio]# kubectl get svc -n meu-servico
NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                       AGE
minio            ClusterIP   10.100.39.202   <none>        9000/TCP                      6s
minio-nodeport   NodePort    10.100.61.157   <none>        80:32369/TCP,8080:30000/TCP   10m
</none></none>

3.3.3 Acessando e criando um bucket

  1. Implantando o Velero

Atenção à compatibilidade entre versões do Velero e Kubernetes. Site oficial: https://github.com/vmware-tanzu/velero. Instalação: https://velero.io/docs/v1.11/contributions/minio/

4.1 Download do Velero 1.11

Coloque em uma máquina capaz de executar comandos kubectl

[root@k8s-harbor01 minio]# cd /usr/local/src/
[root@k8s-harbor01 src]# wget https://github.com/vmware-tanzu/velero/releases/download/v1.11.0/velero-v1.11.0-linux-amd64.tar.gz
[root@k8s-harbor01 src]# ll -rth
-rw-r--r-- 1 root root 35M 7月  12 11:30 velero-v1.11.0-linux-amd64.tar.gz

[root@k8s-harbor01 src]# tar xf velero-v1.11.0-linux-amd64.tar.gz
[root@k8s-harbor01 src]# ls
velero-v1.11.0-linux-amd64  velero-v1.11.0-linux-amd64.tar.gz
[root@k8s-harbor01 src]# cd velero-v1.11.0-linux-amd64/
[root@k8s-harbor01 velero-v1.11.0-linux-amd64]# ls
examples  LICENSE  velero

[root@k8s-harbor01 velero-v1.11.0-linux-amd64]# mv velero /usr/local/bin/
[root@k8s-harbor01 velero-v1.11.0-linux-amd64]# velero -h|head
Velero é uma ferramenta para gerenciar recuperação de desastres, especificamente para recursos de cluster Kubernetes. Ele fornece uma forma simples, configurável e operacionalmente robusta de fazer backup do estado do seu aplicativo e dados associados.

4.2 Configurando o ambiente de autenticação do cliente Velero

Se usar diretamente o .kube/config com nível de admin, este passo pode ser pulado

4.2.1 Criando diretório de dados

[root@k8s-harbor01 velero-v1.11.0-linux-amd64]# mkdir -p /dados/velero
[root@k8s-harbor01 velero-v1.11.0-linux-amd64]# cd /dados/velero

4.2.2 Configurando arquivo de autenticação para acesso ao Minio

[root@k8s-harbor01 velero]# cat velero-autenticacao.txt
[default]
aws_access_key_id = minioadmin
aws_secret_access_key = minioadmin

4.3 Criando usuário dedicado para backup e recuperação

Se usar diretamente o .kube/config com nível de admin, este passo pode ser pulado

4.3.1 Preparando arquivo CSR para emissão de certificado

[root@k8s-harbor01 velero]# cat usuario-aws-csr.json
{
  "CN": "usuario-aws",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "BR",
      "ST": "Sao Paulo",
      "L": "Sao Paulo",
      "O": "k8s",
      "OU": "System"
    }
  ]
}

4.3.2 Preparando ambiente de emissão de certificado

[root@k8s-harbor01 velero]# wget https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssl_1.6.1_linux_amd64 
[root@k8s-harbor01 velero]# wget https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssljson_1.6.1_linux_amd64 
[root@k8s-harbor01 velero]# wget https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssl-certinfo_1.6.1_linux_amd64

[root@k8s-harbor01 velero]# mv cfssl-certinfo_1.6.1_linux_amd64 cfssl-certinfo
[root@k8s-harbor01 velero]# mv cfssl_1.6.1_linux_amd64 cfssl
[root@k8s-harbor01 velero]# mv cfssljson_1.6.1_linux_amd64 cfssljson
[root@k8s-harbor01 velero]# cp cfssl-certinfo cfssl cfssljson /usr/local/bin/
[root@k8s-harbor01 velero]# chmod  a+x /usr/local/bin/cfssl*

4.3.3 Executando emissão de certificado

Para k8s versão: >= 1.24.x

[root@k8s-harbor01 velero]# cp /etc/kubeasz/clusters/k8s-cluster1/ssl/ca-config.json ./
[root@k8s-harbor01 velero]# cfssl gencert -ca=/etc/kubeasz/clusters/k8s-cluster1/ssl/ca.pem -ca-key=/etc/kubeasz/clusters/k8s-cluster1/ssl/ca-key.pem -config=./ca-config.json -profile=kubernetes ./usuario-aws-csr.json | cfssljson -bare usuario-aws

Para k8s versão: 1.23 <=

/usr/local/bin/cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem -ca-key=/etc/kubernetes/ssl/ca-key.pem -config=/etc/kubeasz/clusters/k8s-cluster1/ssl/ca-config.json -profile=kubernetes ./usuario-aws-csr.json | cfssljson -bare usuario-aws

4.3.4 Distribuindo certificados para caminho de certificados do api-server

[root@k8s-harbor01 velero]# mkdir -p /etc/kubernetes/ssl/
[root@k8s-harbor01 velero]# cp usuario-aws-key.pem /etc/kubernetes/ssl/
[root@k8s-harbor01 velero]# cp usuario-aws.pem /etc/kubernetes/ssl/

4.3.5 Gerando arquivo de configuração de autenticação do cluster

[root@k8s-harbor01 velero]# export KUBE_APISERVER="https://10.31.200.100:6443"
[root@k8s-harbor01 velero]# kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubeasz/clusters/k8s-cluster1/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=./usuario-aws.kubeconfig

4.3.6 Configurando autenticação com certificado do cliente

[root@k8s-harbor01 velero]# kubectl config set-credentials usuario-aws \
--client-certificate=/etc/kubernetes/ssl/usuario-aws.pem \
--client-key=/etc/kubernetes/ssl/usuario-aws-key.pem \
--embed-certs=true \
--kubeconfig=./usuario-aws.kubeconfig

4.3.7 Configurando parâmetros de contexto, declarando cluster atual

[root@k8s-harbor01 velero]# kubectl config set-context kubernetes \
--cluster=kubernetes \
--user=usuario-aws \
--namespace=sistema-velero \
--kubeconfig=./usuario-aws.kubeconfig

4.3.8 Configurando contexto padrão, declarando cluster padrão

[root@k8s-harbor01 velero]# kubectl config use-context kubernetes --kubeconfig=usuario-aws.kubeconfig

4.3.9 Criando conta de usuário awsuser

[root@k8s-harbor01 velero]# kubectl create ns sistema-velero

[root@k8s-harbor01 velero]# kubectl create clusterrolebinding usuario-aws --clusterrole=cluster-admin --user=usuario-aws
clusterrolebinding.rbac.authorization.k8s.io/usuario-aws created

# Parâmetros:
clusterrolebinding: vinculação de papel
usuario-aws: nome do papel
cluster-admin: permissões
--user=usuario-aws: autorização para usuario-aws

# Verificação
[root@k8s-harbor01 velero]# kubectl --kubeconfig=./usuario-aws.kubeconfig get no
NAME           STATUS                     ROLES    AGE   VERSION
k8s-master01   Ready,SchedulingDisabled   master   78d   v1.26.1
k8s-master02   Ready,SchedulingDisabled   master   78d   v1.26.1
k8s-master03   Ready,SchedulingDisabled   master   78d   v1.26.1
k8s-node01     Ready                      node     78d   v1.26.1
k8s-node02     Ready                      node     78d   v1.26.1
k8s-node03     Ready                      node     78d   v1.26.1

4.4 Instalando o servidor Velero

4.4.1 Executando instalação

[root@k8s-harbor01 velero]# velero --kubeconfig ./usuario-aws.kubeconfig \
	install \
    --provider aws \
    --plugins velero/velero-plugin-for-aws:v1.5.5 \
    --bucket dados-velero  \
    --secret-file ./velero-autenticacao.txt \
    --use-volume-snapshots=false \
	--namespace sistema-velero \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio.meu-servico:9000

# Nota: s3Url=http://minio.meu-servico:9000, aqui usamos endereço de nome de domínio interno do k8s

# As imagens do Velero são grandes, pode levar tempo para baixar. Pode puxar manualmente nos nodes
[root@k8s-harbor01 velero]# kubectl get po -n sistema-velero
NAME                     READY   STATUS    RESTARTS   AGE
velero-98bc8c975-4pnjs   1/1     Running   0          31m

4.4.2 Verificação

[root@k8s-harbor01 velero]# velero backup -h

  1. Demonstrações de Backup e Recuperação

5.1 Backup do namespace default

[root@k8s-harbor01 velero]# DATA=`date +%Y%m%d%H%M%S`
[root@k8s-harbor01 velero]# echo $DATA
20230712181436

[root@k8s-harbor01 velero]# velero backup criar backup-default-${DATA} \
--include-cluster-resources=true \
--include-namespaces default \
--kubeconfig=./usuario-aws.kubeconfig \
--namespace sistema-velero
Backup "backup-default-20230712181436" enviado com sucesso.
Execute `velero backup describe backup-default-20230712181436` ou `velero backup logs backup-default-20230712181436` para mais detalhes.

5.2 Verificando backup

5.3 Backup de um namespace, exclusão de um recurso, e recuperação

5.3.1 Criando pod de teste

[root@k8s-harbor01 yaml]# cat temp-debian.yaml
apiVersion: v1
kind: Pod
metadata:
  name: temp-debian
  namespace: meu-servico
spec:
  containers:
  - name: temp-debian
    image: registro.k8s/imagens/debian-shell:v1
  imagePullSecrets:
    - name: segredos-registro-imagens

[root@k8s-harbor01 yaml]# kubectl apply -f temp-debian.yaml
pod/temp-debian created

[root@k8s-harbor01 yaml]# kubectl get po -n meu-servico
NAME                     READY   STATUS    RESTARTS   AGE
minio-5cc5fc9498-lmzwh   1/1     Running   0          26h
temp-debian              1/1     Running   0          44s

5.3.2 Backup dos dados

[root@k8s-harbor01 ~]# velero backup criar backup-meuservico-`date +%F` --include-cluster-resources=true --include-namespaces meu-servico --kubeconfig=/dados/velero/usuario-aws.kubeconfig --namespace sistema-velero

5.3.3 Verificando backup

5.3.4 Excluindo pod

[root@k8s-harbor01 ~]# kubectl get po -n meu-servico
NAME                     READY   STATUS    RESTARTS   AGE
minio-5cc5fc9498-lmzwh   1/1     Running   0          42h
temp-debian              1/1     Running   0          16h
[root@k8s-harbor01 ~]# kubectl delete po -n meu-servico temp-debian
pod "temp-debian" deleted
[root@k8s-harbor01 ~]# kubectl get po -n meu-servico
NAME                     READY   STATUS    RESTARTS   AGE
minio-5cc5fc9498-lmzwh   1/1     Running   0          42h

5.3.5 Recuperando dados

[root@k8s-harbor01 ~]# velero restore criar --from-backup backup-meuservico-2023-07-12 --wait --kubeconfig=/dados/velero/usuario-aws.kubeconfig --namespace sistema-velero
Solicitação de recuperação "backup-meuservico-2023-07-12-20230713115829" enviada com sucesso.
Aguardando recuperação ser concluída. Pode pressionar ctrl-c com segurança para parar de aguardar - sua recuperação continuará em segundo plano.
....................
Recuperação concluída com status: Completed. Pode verificar mais informações usando os comandos `velero restore describe backup-meuservico-2023-07-12-20230713115829` e `velero restore logs backup-meuservico-2023-07-12-20230713115829`.

# Parâmetros
--from-backup backup-meuservico-2023-07-12: recuperar dados deste backup
--wait: o processo atual aguarda recuperação bem-sucedida antes de sair
--namespace sistema-velero: namespace onde o servidor está

5.3.6 Verificando recuperação de dados

[root@k8s-harbor01 ~]# kubectl get po -n meu-servico
NAME                     READY   STATUS    RESTARTS   AGE
minio-5cc5fc9498-lmzwh   1/1     Running   0          44h
temp-debian              1/1     Running   0          22s

5.4 Backup de um namespace, exclusão do namespace, e recuperação

5.4.1 Criando dados de teste

[root@k8s-harbor01 ~]# kubectl create ns teste
namespace/teste created

# Criando um secret de teste para pull de imagem
[root@k8s-harbor01 ~]# kubectl get secret -n teste
NAME                       TYPE                             DATA   AGE
segredos-registro-imagens   kubernetes.io/dockerconfigjson   1      11s

# Criando um deployment de teste
[root@k8s-harbor01 deployment]# cat deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-teste
  namespace: teste
spec:
  replicas: 3
  selector:
    matchLabels:
      app: deployment-teste
  template:
    metadata:
      labels:
        app: deployment-teste
    spec:
      containers:
      - name: deployment-teste
        image: registro.k8s/imagens/debian:7
        imagePullPolicy: Always
        args: ["tail", "-f", "/etc/hosts"]
      imagePullSecrets:
        - name: segredos-registro-imagens

[root@k8s-harbor01 deployment]# kubectl apply -f deploy.yaml
deployment.apps/deployment-teste created

[root@k8s-harbor01 deployment]# kubectl get po -n teste
NAME                              READY   STATUS    RESTARTS   AGE
deployment-teste-ddc496886-5sws8   1/1     Running   0          6s
deployment-teste-ddc496886-px9nk   1/1     Running   0          6s
deployment-teste-ddc496886-s6zbk   1/1     Running   0          6s

5.4.2 Backup do namespace

[root@k8s-harbor01 deployment]# velero backup criar backup-ns-teste-`date +%F` \
--include-cluster-resources=true \
--include-namespaces teste \
--kubeconfig=/root/.kube/config \
--namespace sistema-velero
Backup "backup-ns-teste-2023-07-13" enviado com sucesso.
Execute `velero backup describe backup-ns-teste-2023-07-13` ou `velero backup logs backup-ns-teste-2023-07-13` para mais detalhes.

5.4.3 Excluindo todo o namespace

[root@k8s-harbor01 deployment]# kubectl delete ns teste
namespace "teste" deleted
[root@k8s-harbor01 deployment]# kubectl get ns |grep teste

5.4.4 Recuperando dados

[root@k8s-harbor01 deployment]# velero restore criar --from-backup backup-ns-teste-2023-07-13 --wait \
--kubeconfig=/root/.kube/config \
--namespace sistema-velero
Solicitação de recuperação "backup-ns-teste-2023-07-13-20230713143510" enviada com sucesso.
Aguardando recuperação ser concluída. Pode pressionar ctrl-c com segurança para parar de aguardar - sua recuperação continuará em segundo plano.
..........
Recuperação concluída com status: Completed. Pode verificar mais informações usando os comandos `velero restore describe backup-ns-teste-2023-07-13-20230713143510` e `velero restore logs backup-ns-teste-2023-07-13-20230713143510`.

5.4.5 Verificação

5.5 Backup e recuperação de objetos de recurso específicos

Esta abordagem é menos comum, geralmente usamos backup de recursos em nível de cluster

5.5.1 Criando recursos de teste

[root@k8s-harbor01 pod]# cat temp-debian.yaml
apiVersion: v1
kind: Pod
metadata:
  name: temp-debian
  namespace: teste
spec:
  containers:
  - name: temp-debian
    image: registro.k8s/imagens/debian-shell:v1
    command: ['tail', '-f', '/etc/hosts']
  imagePullSecrets:
    - name: segredos-registro-imagens
[root@k8s-harbor01 pod]# kubectl apply -f temp-debian.yaml
pod/temp-debian created
[root@k8s-harbor01 pod]# kubectl get po -n teste
NAME                              READY   STATUS    RESTARTS   AGE
temp-debian                       1/1     Running   0          4s
deployment-teste-ddc496886-5sws8   1/1     Running   0          16m
deployment-teste-ddc496886-px9nk   1/1     Running   0          16m
deployment-teste-ddc496886-s6zbk   1/1     Running   0          16m

5.5.2 Backup do pod e secret recém-criados

[root@k8s-harbor01 pod]# velero backup criar backup-pod-ns-teste-`date +%F` --include-cluster-resources=true --ordered-resources 'pods=teste/temp-debian;secret=teste/segredos-registro-imagens' --namespace sistema-velero --include-namespaces=teste
Backup "backup-pod-ns-teste-2023-07-13" enviado com sucesso.
Execute `velero backup describe backup-pod-ns-teste-2023-07-13` ou `velero backup logs backup-pod-ns-teste-2023-07-13` para mais detalhes.

# Backup de múltiplos tipos de recursos ou recursos de múltiplos namespaces
velero backup criar backup-pod-ns-teste-`date +%F` --include-cluster-resources=true --ordered-resources 'pods=$ns/pod_name,$ns/pod_name;service=$ns/$svc_name;sts=...' --namespace sistema-velero --include-namespaces=$ns1,$ns2,.....

5.5.3 Excluindo pod e secret

[root@k8s-harbor01 pod]# kubectl delete secret -n teste segredos-registro-imagens
secret "segredos-registro-imagens" deleted
[root@k8s-harbor01 pod]# kubectl delete po -n teste temp-debian
pod "temp-debian" deleted

5.5.4 Recuperando dados

[root@k8s-harbor01 pod]# velero restore criar --from-backup backup-pod-ns-teste-2023-07-13 --wait \
--kubeconfig=/root/.kube/config \
--namespace sistema-velero

5.5.5 Verificando dados

[root@k8s-harbor01 pod]# kubectl get po,secret -n teste
NAME                                  READY   STATUS    RESTARTS   AGE
pod/temp-debian                       1/1     Running   0          29s
pod/deployment-teste-ddc496886-5sws8   1/1     Running   0          30m
pod/deployment-teste-ddc496886-px9nk   1/1     Running   0          30m
pod/deployment-teste-ddc496886-s6zbk   1/1     Running   0          30m

NAME                              TYPE                             DATA   AGE
secret/segredos-registro-imagens   kubernetes.io/dockerconfigjson   1      29s

5.6 Backup em lote de diferentes namespaces

5.6.1 Editando script

[root@k8s-harbor01 scripts]# cat script-velero-backup.sh
#!/bin/bash
NS_LISTA=`kubectl get ns | awk '{if (NR>2){print}}' | awk '{print $1}'`
DATA=`date +%F`
cd /dados/velero/

for i in $NS_LISTA;do
  velero backup criar ${i}-backup-${DATA} \
  --include-cluster-resources=true \
  --include-namespaces ${i} \
  --kubeconfig=/root/.kube/config \
  --namespace sistema-velero
done

[root@k8s-harbor01 scripts]# sh script-velero-backup.sh
Backup "lease-nodos-kube-ns-backup-2023-07-13" enviado com sucesso.
Execute `velero backup describe lease-nodos-kube-ns-backup-2023-07-13` ou `velero backup logs lease-nodos-kube-ns-backup-2023-07-13` para mais detalhes.
Backup "publico-kube-ns-backup-2023-07-13" enviado com sucesso.
Execute `velero backup describe publico-kube-ns-backup-2023-07-13` ou `velero backup logs publico-kube-ns-backup-2023-07-13` para mais detalhes.
Backup "sistema-kube-ns-backup-2023-07-13" enviado com sucesso.
Execute `velero backup describe sistema-kube-ns-backup-2023-07-13` ou `velero backup logs sistema-kube-ns-backup-2023-07-13` para mais detalhes.
Backup "meuservico-ns-backup-2023-07-13" enviado com sucesso.
Execute `velero backup describe meuservico-ns-backup-2023-07-13` ou `velero backup logs meuservico-ns-backup-2023-07-13` para mais detalhes.
Backup "teste-ns-backup-2023-07-13" enviado com sucesso.
Execute `velero backup describe teste-ns-backup-2023-07-13` ou `velero backup logs teste-ns-backup-2023-07-13` para mais detalhes.
Backup "sistema-velero-ns-backup-2023-07-13" enviado com sucesso.
Execute `velero backup describe sistema-velero-ns-backup-2023-07-13` ou `velero backup logs sistema-velero-ns-backup-2023-07-13` para mais detalhes.

5.6.2 Verificando backups

Tags: kubernetes velero MinIO etcd backup

Publicado em 6-15 23:12 por Thomas