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



  • Uma CLI de um cloud provider (awsgcloud)



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:



  1. Deploy de pré-requisitos do Velero



  2. Configurando credenciais e recursos cloud



  3. 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.



AWS



# 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



GCP



# 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.



AWS



# 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



GCP



# 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(getcreatedescribe, logs 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


Social

Contact us

Almeda Campinas 802, CJ 12, Jardim Paulista,

São Paulo - SP, 01404-001

Opportunities

Our content

Social

Contact us

Almeda Campinas 802, CJ 12, Jardim Paulista,

São Paulo - SP, 01404-001

Opportunities

Our content

Social

Contact us

Almeda Campinas 802, CJ 12, Jardim Paulista,

São Paulo - SP, 01404-001

Opportunities

Our content