Как восстановить кластер etcd из снимка в образе докера в CoreOS?

У меня есть кластер Kubernetes (v1.5.6) с 3 узлами etcd cluster (etcd версия 3.1.5) на vmware. Эти узлы etcd работают в трех контейнерах докеров (на трех хостах) на coreos на vmware.

Я пытаюсь сделать резервную копию etcd следующим решением:

docker run --rm --net=host -v /tmp:/etcd_backup -e ETCDCTL_API=3 quay.io/coreos/etcd:v3.1.5 etcdctl --endpoints=[1.1.1.1:2379,2.2.2.2:2379,3.3.3.3:2379] snapshot save etcd_backup/snapshot.db

Резервное копирование выполнено успешно.

Я хочу создать этот кластер kubernetes с нуля в другой среде vmware, но для этого мне нужно восстановить etcd из снимка.

Пока что не нашел подходящего решения, работающего с etcd в контейнерах докеров.

Я пытаюсь восстановить следующим способом, но, к сожалению, мне это не удалось.

Сначала я создал новый узел etcd после выполнения следующей команды:

docker run --rm --net=host -v /tmp/etcd_bak:/etcd_backup -e ETCDCTL_API=3 registry:5000/quay.io/coreos/etcd:v3.1.5 etcdctl snapshot restore etcd_backup/snapshot.db --name etcd0 --initial-cluster etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380 --initial-cluster-token etcd-cluster-1 --initial-advertise-peer-urls http://etcd0:2380

Результат:

2018-06-04 09:25:52.314747 I | etcdserver/membership: added member 7ff5c9c6942f82e [http://etcd0:2380] to cluster 5d1b637f4b7740d5
2018-06-04 09:25:52.314940 I | etcdserver/membership: added member 91b417e7701c2eeb [http://etcd2:2380] to cluster 5d1b637f4b7740d5
2018-06-04 09:25:52.315096 I | etcdserver/membership: added member faeb78734ee4a93d [http://etcd1:2380] to cluster 5d1b637f4b7740d5

К сожалению, ничего не происходит.

Какое хорошее решение для восстановления резервной копии etcd?

Как создать пустой кластер / узел etcd и как восстановить снимок?


person almi    schedule 12.06.2018    source источник


Ответы (2)


согласно документу Etcd Disaster Recovery, вам нужно восстановить все три узла etcd из снимка с помощью таких команд, как ваша, а затем запустить три узла с такими командами:

etcd \
  --name m1 \
  --listen-client-urls http://host1:2379 \
  --advertise-client-urls http://host1:2379 \
  --listen-peer-urls http://host1:2380 &

Кроме того, вы можете извлечь etcdctl из изображения, например:

docker run --rm -v /opt/bin:/opt/bin registry:5000/quay.io/coreos/etcd:v3.1.5 cp /usr/local/bin/etcdctl /opt/bin

Затем используйте etcdctl для восстановления снимка:

# ETCDCTL_API=3 ./etcdctl snapshot restore snapshot.db \
  --name m1 \
  --initial-cluster m1=http://host1:2380,m2=http://host2:2380,m3=http://host3:2380 \
  --initial-cluster-token etcd-cluster-1 \
  --initial-advertise-peer-urls http://host1:2380 \
  --data-dir /var/lib/etcd

Это восстановит снимок в каталог / var / lib / etcd. Затем запустите etcd с помощью docker, не забудьте смонтировать / var / lib / etcd в свой контейнер и указать для него --data-dir.

person Kun Li    schedule 13.06.2018
comment
Спасибо. Но мои узлы etcd работают в контейнерах докеров, а не в CoreOS. В этом случае, если образ докера не запущен, я не могу восстановить снимок, с другой стороны, как я могу запустить тот же образ докера с другими командами? К сожалению, эта часть мне непонятна. - person almi; 13.06.2018
comment
Мне удалось восстановить кластер по твоей инструкции, спасибо. К сожалению, моя резервная копия v3 не содержит ключей v2 (только события). У меня старая версия CoreOS на миньонах с etcdctl 2.3.7. (И моя версия кластера k8s - 1.5.6.) Мне нужно попробовать процедуры резервного копирования / восстановления v2. - person almi; 13.06.2018

Ectd в kubernetes работает в контейнерах Docker, вот что я сделал для восстановления кластера:

  • получить метеданные кластера Etcd

    docker inspect etcd1
    

    у вас будет что-то вроде ниже:

    "Binds": [
        "/etc/ssl/certs:/etc/ssl/certs:ro",
        "/etc/ssl/etcd/ssl:/etc/ssl/etcd/ssl:ro",
        "/var/lib/etcd:/var/lib/etcd:rw"
    ],
    ...
    "Env": [
        "ETCD_DATA_DIR=/var/lib/etcd",
        "ETCD_ADVERTISE_CLIENT_URLS=https://172.16.60.1:2379",
        "ETCD_INITIAL_ADVERTISE_PEER_URLS=https://172.16.60.1:2380",
        "ETCD_INITIAL_CLUSTER_STATE=existing",
        "ETCD_METRICS=basic",
        "ETCD_LISTEN_CLIENT_URLS=https://172.16.60.1:2379,https://127.0.0.1:2379",
        "ETCD_ELECTION_TIMEOUT=5000",
        "ETCD_HEARTBEAT_INTERVAL=250",
        "ETCD_INITIAL_CLUSTER_TOKEN=k8s_etcd",
        "ETCD_LISTEN_PEER_URLS=https://172.16.60.1:2380",
        "ETCD_NAME=etcd1",
        "ETCD_PROXY=off",
        "ETCD_INITIAL_CLUSTER=etcd1=https://172.16.60.1:2380,etcd2=https://172.16.60.2:2380,etcd3=https://172.16.60.2:2380",
        "ETCD_AUTO_COMPACTION_RETENTION=8",
        "ETCD_TRUSTED_CA_FILE=/etc/ssl/etcd/ssl/ca.pem",
        "ETCD_CERT_FILE=/etc/ssl/etcd/ssl/member-node01.pem",
        "ETCD_KEY_FILE=/etc/ssl/etcd/ssl/member-node01-key.pem",
        "ETCD_PEER_TRUSTED_CA_FILE=/etc/ssl/etcd/ssl/ca.pem",
        "ETCD_PEER_CERT_FILE=/etc/ssl/etcd/ssl/member-node01.pem",
        "ETCD_PEER_KEY_FILE=/etc/ssl/etcd/ssl/member-node01-key.pem",
        "ETCD_PEER_CLIENT_CERT_AUTH=true",
        "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    ],
    "Cmd": [
        "/usr/local/bin/etcd"
    ],
    
  • скопировать etcd snapshotdb на другие узлы etcd

    scp snapshotdb_20180913 node02:/root/  
    scp snapshotdb_20180913 node03:/root/  
    
  • перестроить новый кластер с исходной информацией

    # etcd1
    docker stop etcd1
    rm -rf /var/lib/etcd
    
    ETCDCTL_API=3 etcdctl snapshot restore snapshotdb_20180913 \
      --cacert /etc/ssl/etcd/ssl/ca.pem \
      --cert /etc/ssl/etcd/ssl/member-node01.pem \
      --key /etc/ssl/etcd/ssl/member-node01-key.pem \
      --name etcd1 \
      --initial-cluster etcd1=https://node01:2380,etcd2=https://node02:2380,etcd3=https://node03:2380 \
      --initial-cluster-token k8s_etcd \
      --initial-advertise-peer-urls https://node01:2380 \
      --data-dir /var/lib/etcd
    
    # etcd2
    docker stop etcd2
    rm -rf /var/lib/etcd
    
    ETCDCTL_API=3 etcdctl snapshot restore snapshotdb_20180913 \
      --cacert /etc/ssl/etcd/ssl/ca.pem \
      --cert /etc/ssl/etcd/ssl/member-node02.pem \
      --key /etc/ssl/etcd/ssl/member-node02-key.pem \
      --name etcd2 \
      --initial-cluster etcd1=https://node01:2380,etcd2=https://node02:2380,etcd3=https://node03:2380 \
      --initial-cluster-token k8s_etcd \
      --initial-advertise-peer-urls https://node02:2380 \
      --data-dir /var/lib/etcd
    
    # etcd3
    docker stop etcd3
    rm -rf /var/lib/etcd
    
    ETCDCTL_API=3 etcdctl snapshot restore snapshotdb_20180913 \
      --cacert /etc/ssl/etcd/ssl/ca.pem \
      --cert /etc/ssl/etcd/ssl/member-node03.pem \
      --key /etc/ssl/etcd/ssl/member-node03-key.pem \
      --name etcd3 \
      --initial-cluster etcd1=https://node01:2380,etcd2=https://node02:2380,etcd3=https://node03:2380 \
      --initial-cluster-token k8s_etcd \
      --initial-advertise-peer-urls https://node03:2380 \
      --data-dir /var/lib/etcd
    
  • запускать контейнеры и проверять статус кластера

    cd /etc/ssl/etcd/ssl
    etcdctl \
      --endpoints=https://node01:2379 \
      --ca-file=./ca.pem \
      --cert-file=./member-node01.pem \
      --key-file=./member-node01-key.pem \
      member list
    
person NOZUONOHIGH    schedule 14.09.2018
comment
Спасибо за публикацию, содержание, касающееся резервного копирования и восстановления etcd, довольно скудно. Кстати, это может вас заинтересовать: labs.consol.de /kubernetes/2018/05/25/kubeadm-backup.html Это задание cron для автоматизации резервного копирования etcd. Heptio Ark - еще одна крутая вещь, которую стоит проверить. - person neokyle; 08.10.2018