Pular para o conteúdo principal

Questão 25 - Backup e Restore do Etcd

Question 25 | Etcd Snapshot Save and Restore

Use context: kubectl config use-context k8s-c3-CCC

Make a backup of etcd running on cluster3-controlplane1 and save it on the controlplane node at /tmp/etcd-backup.db.

Then create any kind of Pod in the cluster.

Finally restore the backup, confirm the cluster is still working and that the created Pod is no longer with us.


Para fazer o backup do etcd vamos usar o comando etcdctl dentro do contro-plane. Precisamos fazer a conexão do etcdctl passando o certificado, endpoint e key.

kubectl config use-context k8s-c3-CCC
ssh cluster3-controlplane1

# Para pegar as informações do etcd, podemos conferir no manifesto do etcd ou no manifesto do api-server que se comunica com o etcd.

root@cluster3-controlplane1:~# cat /etc/kubernetes/manifests/etcd.yaml | grep -e "- --"
- --advertise-client-urls=https://192.168.100.31:2379
- --cert-file=/etc/kubernetes/pki/etcd/server.crt # use
- --client-cert-auth=true
- --data-dir=/var/lib/etcd
- --initial-advertise-peer-urls=https://192.168.100.31:2380
- --initial-cluster=cluster3-controlplane1=https://192.168.100.31:2380
- --key-file=/etc/kubernetes/pki/etcd/server.key # use
- --listen-client-urls=https://127.0.0.1:2379,https://192.168.100.31:2379 # use
- --listen-metrics-urls=http://127.0.0.1:2381
- --listen-peer-urls=https://192.168.100.31:2380
- --name=cluster3-controlplane1
- --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt
- --peer-client-cert-auth=true
- --peer-key-file=/etc/kubernetes/pki/etcd/peer.key
- --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt # use
- --snapshot-count=10000
- --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt

root@cluster3-controlplane1:~# cat /etc/kubernetes/manifests/kube-apiserver.yaml | grep etcd
- --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
- --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt
- --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key
- --etcd-servers=https://127.0.0.1:2379

# Agora fazemos o comando para salvar o snapshot no etcd. O etcdctl já deve estar instalado na máquina pois não podemos ter acesso fora para ir no github e instalar o etcd. Se não tiver eles precisam dar a instrução para instalação.

# --endpoints não é necessário passar pois o valor já é o default. Só seria necessário se o etcd estivesse externo, o que provavelmente não acontecerá na prova.

root@cluster3-controlplane1:~# ETCDCTL_API=3 etcdctl snapshot save /tmp/etcd-backup.db --endpoints 127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key

Snapshot saved at /tmp/etcd-backup.db

# Esse passo não é necessário mas caso algo de errado é bom fazer um backup maior para voltar o etcd se necessário

tar -zcvf etcd.tar.gz /etc/kubernetes/pki/etcd

Feito o backup do etcd podemos criar um pod qualquer e depois fazer o restore para analisar ser irá sumir.

kubectl run pod-test --image=nginx
kubectl get pods -l run=test
NAME READY STATUS RESTARTS AGE
test 1/1 Running 0 60s

# Agora só fazer o restore do backup. Antes de fazer o restore, vamos parar todos os componentes do cluster, mudar o diretório

# Antes de fazer o backup do etcd
# Se fizermos esse restore teremos essa saída
root@cluster3-controlplane1:~# ETCDCTL_API=3 etcdctl snapshot restore /tmp/etcd-backup.db \
--endpoints 127.0.0.1:2379 \
--cacert /etc/kubernetes/pki/etcd/ca.crt \
--cert /etc/kubernetes/pki/etcd/server.crt \
--key /etc/kubernetes/pki/etcd/server.key
#Error: data-dir "default.etcd" exists

#Vamos fazer apontando para outro lugar, mas precisamos mudar o ponto de montagem do /etc/kubernetes/manifests/etcd.yaml
root@cluster3-controlplane1:~# ETCDCTL_API=3 etcdctl snapshot restore /tmp/etcd-backup.db --data-dir /var/lib/etcd-backup --endpoints 127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key

root@kind-cluster-ia-control-plane:~# ls -lha /var/lib/etcd-backup/
total 12K
drwx------ 3 root root 4.0K Apr 13 11:49 .
drwxr-xr-x 17 root root 4.0K Apr 13 11:49 ..
drwx------ 4 root root 4.0K Apr 13 11:49 member

# Agora vamos editar o nosso etcd.yaml
vim /etc/kubernetes/manifests/etcd.yaml

Não vamos editar o etcd.yaml.

# /etc/kubernetes/manifests/etcd.yaml
apiVersion: v1
kind: Pod
metadata:
annotations:
kubeadm.kubernetes.io/etcd.advertise-client-urls: https://172.18.0.8:2379
creationTimestamp: null
labels:
component: etcd
tier: control-plane
name: etcd
namespace: kube-system
spec:
containers:
- command:
- etcd
- --advertise-client-urls=https://172.18.0.8:2379
- --cert-file=/etc/kubernetes/pki/etcd/server.crt
- --client-cert-auth=true
- --data-dir=/var/lib/etcd # ISSO ESTA VINDO DO PONTO DE MONTAGEM, NAO PRECISA ALTERAR
- --experimental-initial-corrupt-check=true
- --experimental-watch-progress-notify-interval=5s
- --initial-advertise-peer-urls=https://172.18.0.8:2380
- --initial-cluster=kind-cluster-ia-control-plane=https://172.18.0.8:2380
- --key-file=/etc/kubernetes/pki/etcd/server.key
- --listen-client-urls=https://127.0.0.1:2379,https://172.18.0.8:2379
- --listen-metrics-urls=http://127.0.0.1:2381
- --listen-peer-urls=https://172.18.0.8:2380
- --name=kind-cluster-ia-control-plane
- --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt
- --peer-client-cert-auth=true
- --peer-key-file=/etc/kubernetes/pki/etcd/peer.key
- --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
- --snapshot-count=10000
- --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
image: registry.k8s.io/etcd:3.5.10-0
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 8
httpGet:
host: 127.0.0.1
path: /health?exclude=NOSPACE&serializable=true
port: 2381
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 15
name: etcd
resources:
requests:
cpu: 100m
memory: 100Mi
startupProbe:
failureThreshold: 24
httpGet:
host: 127.0.0.1
path: /health?serializable=false
port: 2381
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 15
volumeMounts:
- mountPath: /var/lib/etcd
name: etcd-data
- mountPath: /etc/kubernetes/pki/etcd
name: etcd-certs
hostNetwork: true
priority: 2000001000
priorityClassName: system-node-critical
securityContext:
seccompProfile:
type: RuntimeDefault
volumes:
- hostPath:
path: /etc/kubernetes/pki/etcd
type: DirectoryOrCreate
name: etcd-certs
- hostPath:
#path: /var/lib/etcd # antigo
path: /var/lib/etcd-backup # ALTERE O PONTO DE MONTAGEM PAR AO NOVO
type: DirectoryOrCreate
name: etcd-data
status: {}

Feito isso é necessário que as coisas se ajustem no sistema automaticamente, mas se alguma coisa acontecer podemos reiniciar os pods estáticos retirando e colocando novamente no lugar

cd /etc/kubernetes/manifests
mv * ..

# confira se não tem nenhum container mais em execução. Se tiver pode matar.
crictl ps
crictl rm podid --force # Para remove o container se existir

mv ../*.yaml .

# para acompanhar a volta dos pods.
watch crictl ps

Se quiser conferir, veja que o pod test não deve mais existir.