Vamos velejar para um lugar mais seguro!
O que é Velero?
Velero é um projeto open source desenvolvido pela Heptio, antes chamado de Ark, para backup, restore e migrações de recursos e volumes do Kubernetes facilmente.
Velero consiste de:
Um servidor rodando em seu cluster
Uma CLI para rodar comandos no servidor Velero
O que ele faz?
Armazena recursos do Kubernetes em Object Storages altamente disponíves(S3, GCS, Blob Storage, etc)
Faz backup de PVs/PVCs usando mecanismos de snapshot de discos dos provedores cloud
Agendamento de backups com a sintaxe cron
Rotacionamento de backups automático com TTL(Time to Live)
Tem suporte a plugins desenvolvidos pela comunidade
Quer saber mais? Dê uma olhada no nosso Kubilab #01, onde fazemos uma demo destruindo os recursos de um cluster e recriando-os utilizando apenas o Velero.
Após o vídeo, temos o passo-a-passo de como conseguir instalar ele do zero aí no seu cluster, tanto AWS como GCP!
Antes de instalar o Velero, você precisará de:
Um cluster Kubernetes rodando com suporte a CRD
Kubectl configurado
Um aviso rápido!
Openshift possui suporte nativo como qualquer outro cluster de Kubernetes que suporte CRDs. Abaixo estão as versões suportadas para cada plataforma:
Kubernetes ≥ 1.7
Openshift ≥ 3.7
Instalação
A instalação é feita em três etapas:
Deploy de pré-requisitos do Velero
Configurando credenciais e recursos cloud
Configuração e deploy do Velero
1. Deploy de pré-requisitos do Velero
Baixe a última versão disponível do Velero na página Github Releases. Nós usaremos a versão v0.11.0 que é a última disponível no momento da escrita:
# Configuring Velero namespace, RBAC and CRDs by applying the Kubernetes prerequisites YAML
export VELERO_FOLDER=/opt/velero
export VELERO_VERSION=v0.11.0
wget https://github.com/heptio/velero/releases/download/$VELERO_VERSION/velero-$VELERO_VERSION-linux-amd64.tar.gz
mkdir -p $VELERO_FOLDER
tar -xzvf velero-$VELERO_VERSION-linux-amd64.tar.gz -C $VELERO_FOLDER
mv $VELERO_FOLDER/velero /usr/bin
chmod +x /usr/bin/velero
kubectl apply -f $VELERO_FOLDER/config/common/00-prereqs.yaml
Agora temos o namespace, RBAC e CRDs do Velero criados.
A próxima etapa é configurar o arquivo credentials-velero criando um Object Storage e credenciais de cloud provider (IAM).
2. Configurando credenciais e recursos cloud
É hora de configurar credenciais cloud para comunicação, e Object Storage para armazenamento de metadados/recursos. Ao rodar os comandos relacionados ao cloud provider, você deve ter o arquivo credentials-velero no diretório $VELERO_FOLDER/credentials-velero.
# Configuring Velero for a Kubernetes cluster hosted in AWS
# For in depth details, check https://heptio.github.io/velero/master/aws-config.html
export VELERO_FOLDER=/opt/velero
export BUCKET_NAME=k8s-cluster-velero # Use a different name
export CLOUD_REGION=us-east-1
# Create an S3 bucket to store Object backups
aws s3api create-bucket \
--bucket $BUCKET_NAME \
--region $CLOUD_REGION
# Create Velero IAM user
aws iam create-user --user-name velero
# Attach IAM policies
cat > $VELERO_FOLDER/velero-policy.json <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:DescribeVolumes",
"ec2:DescribeSnapshots",
"ec2:CreateTags",
"ec2:CreateVolume",
"ec2:CreateSnapshot",
"ec2:DeleteSnapshot"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:DeleteObject",
"s3:PutObject",
"s3:AbortMultipartUpload",
"s3:ListMultipartUploadParts"
],
"Resource": [
"arn:aws:s3:::${BUCKET_NAME}/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::${BUCKET_NAME}"
]
}
]
}
EOF
aws iam put-user-policy \
--user-name velero \
--policy-name velero \
--policy-document file://${VELERO_FOLDER}/velero-policy.json
# Create IAM credentials
export CREDENTIALS_OUTPUT=$(aws iam create-access-key --user-name velero)
export VELERO_AWS_ACCESS=$(echo -n "$CREDENTIALS_OUTPUT" | jq -r '.AccessKey.AccessKeyId')
export VELERO_AWS_SECRET=$(echo -n "$CREDENTIALS_OUTPUT" | jq -r '.AccessKey.SecretAccessKey')
# Create "credentials-velero" file
cat > $VELERO_FOLDER/credentials-velero <<EOF
[default]
aws_access_key_id=${VELERO_AWS_ACCESS}
aws_secret_access_key=${VELERO_AWS_SECRET}
EOF
# Configuring Velero for a Kubernetes cluster hosted in GCP
# For in depth details, check https://heptio.github.io/velero/master/gcp-config.html
export VELERO_FOLDER=/opt/velero
export BUCKET_NAME=k8s-cluster-velero # Use a different name
export PROJECT_ID=$(gcloud config get-value project)
# Create a GS bucket to store Object backups
gsutil mb gs://$BUCKET_NAME/
# Create GCP Service Account
gcloud iam service-accounts create velero \
--display-name "Velero service account"
SERVICE_ACCOUNT_EMAIL=$(gcloud iam service-accounts list \
--filter="displayName:Velero service account" \
--format 'value(email)')
# Create IAM Role
ROLE_PERMISSIONS=(
compute.disks.get
compute.disks.create
compute.disks.createSnapshot
compute.snapshots.get
compute.snapshots.create
compute.snapshots.useReadOnly
compute.snapshots.delete
compute.zones.get
)
gcloud iam roles create velero.server \
--project $PROJECT_ID \
--title "Velero Server" \
--permissions "$(IFS=","; echo "${ROLE_PERMISSIONS[*]}")"
# Bind IAM policy
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member serviceAccount:$SERVICE_ACCOUNT_EMAIL \
--role projects/$PROJECT_ID/roles/velero.server
# Change IAM permissions
gsutil iam ch serviceAccount:$SERVICE_ACCOUNT_EMAIL:objectAdmin gs://$BUCKET_NAME
# Create "credentials-velero" file
gcloud iam service-accounts keys create $VELERO_FOLDER/credentials-velero \
--iam-account $SERVICE_ACCOUNT_EMAIL
3. Deploy e configuração do Velero
Com o arquivo credentials-velero e Object Storage configurados, precisaremos apenas criar o Kubernetes Secret a partir do arquivo credentials-velero, e então fazer o deploy do Velero.
# Deploying Velero for a Kubernetes cluster hosted in AWS
# For in depth details, check https://heptio.github.io/velero/master/aws-config.html
export VELERO_FOLDER=/opt/velero
export BUCKET_NAME=k8s-cluster-velero # Use a different name
export CLOUD_REGION=us-east-1
kubectl create secret generic cloud-credentials \
--namespace velero \
--from-file cloud=$VELERO_FOLDER/credentials-velero
sed -e "s/<YOUR_BUCKET>/${BUCKET_NAME}/g" \
-e "s/<YOUR_REGION>/${CLOUD_REGION}/g" \
-i $VELERO_FOLDER/config/aws/05-backupstoragelocation.yaml
sed -e "s/<YOUR_REGION>/${CLOUD_REGION}/g" \
-i $VELERO_FOLDER/config/aws/06-volumesnapshotlocation.yaml
kubectl apply -f $VELERO_FOLDER/config/aws/05-backupstoragelocation.yaml
kubectl apply -f $VELERO_FOLDER/config/aws/06-volumesnapshotlocation.yaml
kubectl apply -f $VELERO_FOLDER/config/aws/10-deployment.yaml
# Deploying Velero for a Kubernetes cluster hosted in GCP
# For in depth details, check https://heptio.github.io/velero/master/gcp-config.html
export VELERO_FOLDER=/opt/velero
export BUCKET_NAME=k8s-cluster-velero # Use a different name
kubectl create secret generic cloud-credentials \
--namespace velero \
--from-file cloud=$VELERO_FOLDER/credentials-velero
sed -e "s/<YOUR_BUCKET>/${BUCKET_NAME}/g" \
-i $VELERO_FOLDER/config/gcp/05-backupstoragelocation.yaml
kubectl apply -f $VELERO_FOLDER/config/gcp/05-backupstoragelocation.yaml
kubectl apply -f $VELERO_FOLDER/config/gcp/06-volumesnapshotlocation.yaml
kubectl apply -f $VELERO_FOLDER/config/gcp/10-deployment.yaml
Parabéns! Seu Velero está instalado e rodando. Agora, vamos entender alguns conceitos antes de criar o primeiro backup.
Velero 101
É importante saber o que está acontecendo nos bastidores antes de rodar comandos aleatórios e acabar em apuros. Abaixo há alguns conceitos sobre o que você precisa saber sobre o Velero:
Backup: CRD que armazena informações como data de criação, quais namespaces devem ser incluídos, quais PVCs estão attachados, etc.
BackupLocation: CRD que armazena informações como qual região e object storage devem ser usados para armazenar backups.
SnapshotLocation: CRD que armazena informações como qual região deve ser utilizada para snapshots de PVCs.
Restore: CRD que armazena informações como qual conteúdo de um backup deve ser restaurado.
BackupController: Controlador dentro do servidor Velero que gerencia os CRDs (backups/restores/schedules) e processa chamadas da API do Kubernetes.
Para mais detalhes, veja a documentação oficial.
Criando seu primeiro backup
Velero não é uma ferramenta intrusiva se você utiliza apenas as funcionalidades de backup, já que ele irá ler os recursos sem modificá-los.
Velero usa os verbos mais famosos disponíveis do kubectl(get, create, describe, logs e delete), então você vai se sentir em casa utilizando a sua CLI.
É possivel criar backups únicos e isolados ao rodar “velero create backup”, mas eu fortemente recomendo o agendamento de backups, já que tudo acontece automaticamente embaixo do BackupController, o qual também organiza backups por timestamps.
Vamos criar um agendamento para backup do cluster inteiro, todo dia meia-noite, com tempo de expiração de 24 horas:
velero schedule create all-cluster \
--schedule="0 0 * * *" \
--include-resources '*' \
--include-namespaces '*' \
--include-cluster-resources=true \
--ttl 24h \
--labels entireCluster=true
Após criar o agendamento, o BackupController sempre criará um novo backup, indepentendemente do tempo de agendamento. A duração do backup depende do número de recursos e PVCs envolvidos no processo.
Para listar todos os backups:
velero backup get
Para descrever mais detalhes de um backup:
velero backup describe <YOUR-BACKUP-NAME>
Ver logs de um backup:
velero backup logs <YOUR-BACKUP-NAME>
Criando seu primeiro restore
Fique atento pois todo restore pode modificar estados dos objetos do cluster se o estado deles diferirem do estado de backup.
Para restaurar completamente seu backup:
velero restore create --from-backup <YOUR-BACKUP-NAME> \
--include-namespaces '*' \
--include-resources '*' \
--include-cluster-resources true \
--restore-volumes true
Uma ótima funcionaldiade do Velero é a habilidade de selecionar o que será restaurado a partir de um backup completo. Para restaurar apenas o namespace default a partir de um backup criado:
velero restore create --from-backup <YOUR-BACKUP-NAME> \
--include-namespaces default \
--include-resources '*' \
--restore-volumes true
Autor: Gabriel Tiossi