В статье описан процесс восстановления кластера etcd, запущенного в Kubernetes-кластере, из имеющегося снапшота. В кластере etcd хранится конфигурация сервисов Мессенджера во время работы. Кластер состоит из трех нод: etcd-0, etcd-1, etcd-2.
# kubectl -n im-etcd get poNAME READY STATUS RESTARTS AGEetcd-0 1/1 Running 0 15hetcd-1 1/1 Running 0 14hetcd-2 1/1 Running 0 15h
-
Создайте снапшот с любой из нод кластера:
kubectl -n im-etcd exec -it etcd-0 -c etcd -- etcdctl snapshot save /bitnami/etcd/data/etcd.db -
Скопируйте снапшот на хост:
kubectl cp im-etcd/etcd-0:/bitnami/etcd/data/etcd.db -c etcd /mnt/data/etcd-backups/etcd.db
-
Определите, на каких нодах Kubernetes-кластера запущены поды кластера etcd:
# kubectl -n im-etcd get po -owide | awk '{print $1,"-",$7}'NAME - NODEetcd-0 - mk-cluster-02etcd-1 - mk-cluster-01etcd-2 - mk-cluster-03 -
Определите ноды Kubernetes-кластера и пути на нодах, по которым смонтированы PVC подов etcd:
pvs=$(kubectl get pv | grep etcd | awk '{print $1}') && for pv in $pvs; do kubectl get -oyaml pv $pv | grep -E "k3s/pvc|mk-cluster" ; donepath: /data/k3s/pvc-2b4aa987-25ff-487e-939c-527e9f64ef30_im-etcd_data-etcd-0- mk-cluster-02path: /data/k3s/pvc-a3c4b3bd-06db-4770-b0f6-ec13c7d9bab4_im-etcd_data-etcd-2- mk-cluster-03path: /data/k3s/pvc-f9e72b81-d654-483a-943e-9306e41ec2db_im-etcd_data-etcd-1- mk-cluster-01 -
На все ноды Kubernetes-кластера из полученного списка скопируйте снапшот.
-
Восстановите поочередно ноды кластера etcd — команда выполняется на каждой ноде Kubernetes-кластера из списка выше:
etcdctl snapshot restore <PATH_TO_SNAPSHOT> --name <NAME_OF_ETCD_NODE> --initial-cluster etcd-0=http://etcd-0.etcd-headless.im-etcd.svc.cluster.local:2380,etcd-1=http://etcd-1.etcd-headless.im-etcd.svc.cluster.local:2380,etcd-2=http://etcd-2.etcd-headless.im-etcd.svc.cluster.local:2380 --initial-cluster-token etcd-cluster-k8s --initial-advertise-peer-urls http://<NAME_OF_ETCD_NODE>.etcd-headless.im-etcd.svc.cluster.local:2380 --data-dir=/data/k3s/pvc-2b4aa987-25ff-487e-939c-527e9f64ef30_im-etcd_data-etcd-0/data_restoreЗдесь:
PATH_TO_SNAPSHOT— путь к снапшоту на ноде Kubernetes-кластера;NAME_OF_ETCD_NODE— имя etcd-ноды, с которым она добавляется в кластер etcd. Значение должно совпадать с именем ноды, для которой проводится процесс восстановления.
-
Уменьшите число реплик кластера etcd до нуля:
kubectl -n im-etcd scale sts etcd --replicas=0 -
Перейдите в каталог, в который смонтирован PVC (на каждой ноде Kubernetes свой), и выполните переименование каталогов с данными и смену владельца для нового каталога:
cd /data/k3s/pvc-2b4aa987-25ff-487e-939c-527e9f64ef30_im-etcd_data-etcd-0chown -R browser data_restoremv data data_oldmv data_restore data -
Когда шаг 6 выполнен на всех нодах, увеличьте число реплик кластера etcd до трех:
kubectl -n im-etcd scale sts etcd --replicas=3 -
Дождитесь, когда кластер соберется.
Если одна из реплик кластера etcd перестала работать, выполните следующее.
-
Проверьте, есть ли проблемный под в списке членов кластера, выполнив команду в любом из доступных подов:
kubectl -n im-etcd exec -it etcd-0 -c etcd -- etcdctl member list -w table+------------------+---------+--------+------------------------------------------------------------+-------------------------------------------------------------------------------------------------------+------------+| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |+------------------+---------+--------+------------------------------------------------------------+-------------------------------------------------------------------------------------------------------+------------+| dc48925886e0b0a | started | etcd-1 | http://etcd-1.etcd-headless.im-etcd.svc.cluster.local:2380 | http://etcd-1.etcd-headless.im-etcd.svc.cluster.local:2379,http://etcd.im-etcd.svc.cluster.local:2379 | false || 1e191f5562c1a901 | started | etcd-0 | http://etcd-0.etcd-headless.im-etcd.svc.cluster.local:2380 | http://etcd-0.etcd-headless.im-etcd.svc.cluster.local:2379,http://etcd.im-etcd.svc.cluster.local:2379 | false || f2bd8228f2ae9e9a | started | etcd-2 | http://etcd-2.etcd-headless.im-etcd.svc.cluster.local:2380 | http://etcd-2.etcd-headless.im-etcd.svc.cluster.local:2379,http://etcd.im-etcd.svc.cluster.local:2379 | false |+------------------+---------+--------+------------------------------------------------------------+-------------------------------------------------------------------------------------------------------+------------+Если отображается, нужно удалить его из кластера. Если пода нет в списке членов, переходите к шагу 3.
-
Удалите член кластера:
kubectl -n im-etcd exec -it etcd-0 -c etcd -- etcdctl member remove <ID> -
Удалите PVC проблемного пода:
kubectl -n im-etcd delete pvc data-<NAME_OF_PROBLEM_POD> --timeout=5s -
Удалите сам под:
kubectl -n im-etcd delete po <NAME_OF_PROBLEM_POD> -
Дождитесь, когда под запустится, и проверьте членов кластера etcd.