Faça backup dos dados do Etcd no OpenShift 4.x para AWS S3 Bucket
Você tem um cluster OpenShift em execução alimentando seus microsserviços de produção e está preocupado com o backup de dados do etcd? Neste guia, mostramos como fazer backup facilmente do etcd e enviar os dados de backup para o armazenamento de objetos AWS S3. Um etcd é um armazenamento de chave-valor para OpenShift Container Platform, que persiste o estado de todos os objetos de recursos.
Em qualquer administração do OpenShift Cluster, é uma prática boa e recomendada fazer backup dos dados etcd do seu cluster regularmente e armazená-los em um local seguro. O local ideal para armazenamento de dados é fora do ambiente do OpenShift Container Platform. Pode ser um compartilhamento de servidor NFS, um servidor secundário em sua infraestrutura ou em um ambiente de nuvem.
A outra recomendação é fazer backups do etcd fora dos horários de pico de uso, pois a ação é de natureza bloqueadora. Certifique-se de que a operação de backup do etcd seja executada após qualquer atualização do OpenShift Cluster. A importância disso é que durante a restauração do cluster, um backup etcd obtido da mesma versão z-stream deve ser usado. Por exemplo, um cluster do OpenShift Container Platform 4.6.3 deve usar um backup etcd que foi obtido da versão 4.6.3.
Etapa 1: Faça login em um nó mestre no cluster
O backup do cluster etcd deve ser executado em uma única invocação do script de backup em um host mestre. Não faça backup para cada host mestre.
Faça login em um nó mestre por meio de SSH ou sessão de depuração:
# SSH Access
ssh core@<master_node_ip_or_dns_name>
# Debug session
oc debug node/<node_name>
Para uma sessão de depuração, você precisa alterar seu diretório raiz para o host:
sh-4.6# chroot /host
Se o proxy para todo o cluster estiver ativado, certifique-se de ter exportado as variáveis de ambiente NO_PROXY
, HTTP_PROXY
e HTTPS_PROXY
.
Etapa 2: Execute o backup do etcd no OpenShift 4.x
É necessário ter acesso ao cluster OpenShift como usuário com a função cluster-admin
para executar esta operação.
Antes de prosseguir, verifique se o proxy está ativado:
oc get proxy cluster -o yaml
Se você tiver o proxy ativado, os campos httpProxy, httpsProxy e noProxy terão os valores definidos.
Execute o script cluster-backup.sh para iniciar o processo de backup do etcd. Você deve passar um caminho onde o backup é salvo.
mkdir /home/core/etcd_backups
sudo /usr/local/bin/cluster-backup.sh /home/core/etcd_backups
Aqui está minha saída de execução de comando:
Certificate /etc/kubernetes/static-pod-certs/configmaps/etcd-serving-ca/ca-bundle.crt is missing. Checking in different directory
Certificate /etc/kubernetes/static-pod-resources/etcd-certs/configmaps/etcd-serving-ca/ca-bundle.crt found!
found latest kube-apiserver: /etc/kubernetes/static-pod-resources/kube-apiserver-pod-13
found latest kube-controller-manager: /etc/kubernetes/static-pod-resources/kube-controller-manager-pod-6
found latest kube-scheduler: /etc/kubernetes/static-pod-resources/kube-scheduler-pod-6
found latest etcd: /etc/kubernetes/static-pod-resources/etcd-pod-7
b056e4cb492c8f855be6b57fc22c202eb2ccf6538b91c06ceb3923a7c6b898b1
etcdctl version: 3.5.9
API version: 3.5
{"level":"info","ts":"2023-08-30T00:27:13.272889Z","caller":"snapshot/v3_snapshot.go:65","msg":"created temporary db file","path":"/home/core/etcd_backups/snapshot_2023-08-30_002712.db.part"}
{"level":"info","ts":"2023-08-30T00:27:13.280339Z","logger":"client","caller":"[email /maintenance.go:212","msg":"opened snapshot stream; downloading"}
{"level":"info","ts":"2023-08-30T00:27:13.280487Z","caller":"snapshot/v3_snapshot.go:73","msg":"fetching snapshot","endpoint":"https://192.168.56.11:2379"}
{"level":"info","ts":"2023-08-30T00:27:14.044229Z","logger":"client","caller":"[email /maintenance.go:220","msg":"completed snapshot read; closing"}
{"level":"info","ts":"2023-08-30T00:27:14.167032Z","caller":"snapshot/v3_snapshot.go:88","msg":"fetched snapshot","endpoint":"https://192.168.56.11:2379","size":"104 MB","took":"now"}
{"level":"info","ts":"2023-08-30T00:27:14.167168Z","caller":"snapshot/v3_snapshot.go:97","msg":"saved","path":"/home/core/etcd_backups/snapshot_2023-08-30_002712.db"}
Snapshot saved at /home/core/etcd_backups/snapshot_2023-08-30_002712.db
Deprecated: Use `etcdutl snapshot status` instead.
{"hash":1265701168,"revision":442134,"totalKey":9006,"totalSize":103821312}
snapshot db and kube resources are successfully saved to /home/core/etcd_backups
Liste os arquivos no diretório de backup:
$ ls -1 /home/core/etcd_backups/
snapshot_2023-08-30_002712.db
static_kuberesources_2023-08-30_002712.tar.gz
$ du -sh /home/core/etcd_backups/*
100M /home/core/etcd_backups/snapshot_2023-08-30_002712.db
72K /home/core/etcd_backups/static_kuberesources_2023-08-30_002712.tar.gz
Haverá dois arquivos no backup:
snapshot_
: Este arquivo é o instantâneo do etcd..db static_kuberesources_
: este arquivo contém os recursos para os pods estáticos. Se a criptografia do etcd estiver habilitada, ela também conterá as chaves de criptografia para o instantâneo do etcd..tar.gz
Etapa 3: enviar backup para AWS S3 (do servidor Bastion)
Faça login no Bastion Server e copie os arquivos de backup.
scp -r core@serverip:/home/core/etcd_backups ~/
Instale a ferramenta AWS CLI:
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
Instale a ferramenta de descompactação:
sudo yum -y install unzip
Extraia o arquivo baixado:
unzip awscli-exe-linux-x86_64.zip
Instale AWS CLI:
$ sudo ./aws/install
You can now run: /usr/local/bin/aws --version
Confirme a instalação verificando a versão:
$ aws --version
aws-cli/2.8.12 Python/3.10.8 Darwin/22.5.0 source/x86_64 prompt/off
Crie um intervalo de backups do OpenShift:
$ aws s3 mb s3://openshiftbackups
make_bucket: openshiftbackups
Crie um usuário IAM:
aws iam create-user --user-name backupsonly
Criar usuário da AWS Policy for Backups – usuário capaz de gravar apenas no S3:
cat >aws-s3-uploads-policy.json<<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:Get*",
"s3:List*",
"s3:Put*"
],
"Resource": "*"
}
]
}
EOF
Aplique a política:
aws iam create-policy --policy-name upload-only-policy --policy-document file://aws-s3-uploads-policy.json
Atribuir política AWS ao usuário IAM:
aws iam attach-user-policy --policy-arn arn:aws:iam::<accountid>:policy/upload-only-policy --user-name backupsonly
Agora você pode criar uma chave de acesso para um usuário do IAM testar:
$ aws iam create-access-key --user-name backupsonly
{
"AccessKey": {
"UserName": "backupsonly",
"AccessKeyId": "AKIATWFKCYAHF74SCFEP",
"Status": "Active",
"SecretAccessKey": "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",
"CreateDate": "2023-03-16T12:14:39+00:00"
}
}
Anote os IDs de acesso e chave secreta e use-os na configuração:
aws configure # On OCP Bastion server
Fornecer :
- ID da chave de acesso AWS
- Chave de acesso secreta da AWS
- Região padrão
Tente fazer upload dos arquivos para o bucket S3:
$ aws s3 cp etcd_backups/ s3://openshiftbackups/etcd --recursive
upload: etcd_backups/static_kuberesources_2023-03-16_134036.tar.gz to s3://openshiftbackups/etcd/static_kuberesources_2023-03-16_134036.tar.gz
upload: etcd_backups/snapshot_2023-03-16_134036.db to s3://openshiftbackups/etcd/snapshot_2023-03-16_134036.db
Confirme :
$ aws s3 ls s3://openshiftbackups/etcd/
2023-03-16 16:00:59 1549340704 snapshot_2023-03-16_134036.db
2023-03-16 16:00:59 77300 static_kuberesources_2023-03-16_134036.tar.gz
Etapa 4: backups automatizados para AWS S3 (do servidor Bastion)
Podemos fazer um script que fará o seguinte:
- Login do bastião para o nó mestre
- Iniciar backup do etcd
- Copie os dados de backup do nó mestre para o servidor bastião
- Excluir dados de backup no nó mestre
- Copie os dados de backup para o bucket S3
- Exclua os dados locais após o upload bem-sucedido para o S3
Crie um arquivo de script no servidor Bastion:
vim backup_etcd_s3.sh
Aqui está o script que pode ser modificado ainda mais para casos de uso mais avançados.
#!/bin/bash
MASTER_NAME="master01.example.net"
USERNAME="core"
BACKUPS_DIR=~/etcd_backups
S3_BUCKET="openshiftbackups/etcd"
RESULT="$?"
# Create backups directory if doesn't exist
[ -d ${BACKUPS_DIR} ] && echo "Directory Exists" || mkdir ${BACKUPS_DIR}
# Login and run backup
ssh ${USERNAME}@${MASTER_NAME} 'mkdir /home/core/etcd_backups' 2>/dev/null
ssh ${USERNAME}@${MASTER_NAME} 'sudo /usr/local/bin/cluster-backup.sh /home/core/etcd_backups'
scp -r ${USERNAME}@${MASTER_NAME}:/home/core/etcd_backups/* ${BACKUPS_DIR}/
# clean etcd backups directory on the master node
if [ $RESULT -eq 0 ]; then
ssh ${USERNAME}@${MASTER_NAME} 'rm -rf /home/core/etcd_backups/*'
fi
# Backup to aws s3
aws s3 cp ${BACKUPS_DIR}/ s3://${S3_BUCKET} --recursive
# List bucket contents
aws s3 ls s3://${S3_BUCKET}/
# Clean backups older than 1 day
#find ${BACKUPS_DIR}/ -mtime +1 -exec rm {} \;
find ${BACKUPS_DIR}/ -type f -mtime +1 -delete
Usando o Cron Job que é executado às 3h:
$ crontab -e
0 3 * * * /path/to/backup_etcd_s3.sh
Conclusão
Neste artigo, vimos como você pode fazer backup do OpenShift etcd e enviar os dados para um bucket S3. Em nosso próximo guia, poderíamos discutir como você pode realizar uma restauração a partir do backup.
Mais guias sobre cluster OpenShift:
- Instale o Red Hat Advanced Cluster Management no OpenShift 4.x
- Como alterar o valor pids_limit no OpenShift 4.x
- Como implantar o Ubuntu Pod no Kubernetes | OpenShift