VK WorkSpace On-Premise logo
Помощь
Обновлена 29 октября 2026 г. в 21:31

Восстановление кластера etcd из снапшота

В статье описан процесс восстановления кластера 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

Создание снапшота

  1. Создайте снапшот с любой из нод кластера:

    kubectl -n im-etcd exec -it etcd-0 -c etcd -- etcdctl snapshot save /bitnami/etcd/data/etcd.db
  2. Скопируйте снапшот на хост:

    kubectl cp im-etcd/etcd-0:/bitnami/etcd/data/etcd.db -c etcd /mnt/data/etcd-backups/etcd.db

Восстановление кластера

  1. Определите, на каких нодах 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
  2. Определите ноды 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" ; done
    path: /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
  3. На все ноды Kubernetes-кластера из полученного списка скопируйте снапшот.

  4. Восстановите поочередно ноды кластера 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. Значение должно совпадать с именем ноды, для которой проводится процесс восстановления.
  5. Уменьшите число реплик кластера etcd до нуля:

    kubectl -n im-etcd scale sts etcd --replicas=0
  6. Перейдите в каталог, в который смонтирован 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
  7. Когда шаг 6 выполнен на всех нодах, увеличьте число реплик кластера etcd до трех:

    kubectl -n im-etcd scale sts etcd --replicas=3
  8. Дождитесь, когда кластер соберется.

Что делать, если один из подов не работает

Если одна из реплик кластера etcd перестала работать, выполните следующее.

  1. Проверьте, есть ли проблемный под в списке членов кластера, выполнив команду в любом из доступных подов:

    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.

  2. Удалите член кластера:

    kubectl -n im-etcd exec -it etcd-0 -c etcd -- etcdctl member remove <ID>
  3. Удалите PVC проблемного пода:

    kubectl -n im-etcd delete pvc data-<NAME_OF_PROBLEM_POD> --timeout=5s
  4. Удалите сам под:

    kubectl -n im-etcd delete po <NAME_OF_PROBLEM_POD>
  5. Дождитесь, когда под запустится, и проверьте членов кластера etcd.

Была ли статья полезна?