Pregunta 25 - Backup y Restore del 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 hacer el backup del etcd vamos a usar el comando etcdctl dentro del control-plane. Necesitamos hacer la conexión del etcdctl pasando el certificado, endpoint y key.
kubectl config use-context k8s-c3-CCC
ssh cluster3-controlplane1
# Para obtener las informaciones del etcd, podemos verificar en el manifesto del etcd o en el manifesto del api-server que se comunica con el 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 # usar
- --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 # usar
- --listen-client-urls=https://127.0.0.1:2379,https://192.168.100.31:2379 # usar
- --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 # usar
- --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
# Ahora hacemos el comando para guardar el snapshot en el etcd. El etcdctl ya debe estar instalado en la máquina pues no podemos tener acceso afuera para ir al github e instalar el etcd. Si no lo tiene ellos necesitan dar la instrucción para instalación.
# --endpoints no es necesario pasar pues el valor ya es el por defecto. Sólo sería necesario si el etcd estuviera externo, lo que probablemente no sucederá en la prueba.
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
# Este paso no es necesario pero caso algo salga mal es bueno hacer un backup mayor para volver el etcd si es necesario
tar -zcvf etcd.tar.gz /etc/kubernetes/pki/etcd
Hecho el backup del etcd podemos crear un pod cualquiera y después hacer el restore para analizar si va a desaparecer.
kubectl run pod-test --image=nginx
kubectl get pods -l run=test
NAME READY STATUS RESTARTS AGE
test 1/1 Running 0 60s
# Ahora sólo hacer el restore del backup. Antes de hacer el restore, vamos a parar todos los componentes del cluster, cambiar el directorio
# Antes de hacer el backup del etcd
# Si hacemos este restore tendremos esta salida
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 a hacer apuntando para otro lugar, pero necesitamos cambiar el punto de montaje del /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
# Ahora vamos a editar nuestro etcd.yaml
vim /etc/kubernetes/manifests/etcd.yaml
No vamos a editar el 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 # ESTO VIENE DEL PUNTO DE MONTAJE, NO NECESITA 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 # antiguo
path: /var/lib/etcd-backup # ALTERE EL PUNTO DE MONTAJE PARA EL NUEVO
type: DirectoryOrCreate
name: etcd-data
status: {}
Hecho esto es necesario que las cosas se ajusten en el sistema automáticamente, pero si algo sucede podemos reiniciar los pods estáticos retirando y colocando nuevamente en el lugar
cd /etc/kubernetes/manifests
mv * ..
# verifique si no tiene ningún container más en ejecución. Si tiene puede matarlo.
crictl ps
crictl rm podid --force # Para remover el container si existe
mv ../*.yaml .
# para acompañar la vuelta de los pods.
watch crictl ps
Si quiere verificar, vea que el pod test no debe existir más.