Перейти к основному содержимому

5.1.5.8. Восстановление

В данной главе, рассмотрим два варианта ETCD:

I. ETCD, развернутый внутри K8s кластера.

II. ETCD, используемый KubeAPI текущего k8s кластера.

5.1.5.8.1. ETCD in k8s cluster

5.1.5.8.1.1. Восстановление с одного узла из мгновенного снимка

Данный вариант подразумевает, что бэкап разворачивается на первом узле и кластер запускается в режиме одного узла. Далее поочередно будут добавляться другие узлы кластера.

Инструкция
Для начала задайте переменные:
export ETCD_NODE_NAME_1=
export ETCD_NODE_NAME_2=
export ETCD_NODE_NAME_3=
export ETCD_NODE_ADDRESS=
export ETCD_NODE_ADDRESS=
export ETCD_NODE_ADDRESS=
export K8S_NODE_ADDRESS_1=
export K8S_NODE_ADDRESS_1=
export K8S_NODE_ADDRESS_1=
export ETCD_CLIENT_PORT=
export ETCD_PEER_PORT=
export K8S_NODE_USERNAME=
warning

Если адрес первого узла указан в конфигурации других еще работающих узлов, они упадут с ошибкой, пока не будут подключены к новому кластеру.

  1. Загрузите файл мгновенного снимка на ВМ первого узла кластера по пути /tmp/etcd/backup.db при помощи rsync
ssh ${K8S_NODE_USERNAME}@${K8S_NODE_ADDRESS_1} "mkdir -p /tmp/etcd"
rsync --rsync-path="sudo rsync" /tmp/etcd/backup.db ${K8S_NODE_USERNAME}@${K8S_NODE_ADDRESS_1}:/tmp/etcd/backup.db
  1. Подключитесь к ВМ первого узла кластера по ssh и переключитесь на суперпользователя. Затем остановите kubelet, чтобы не позволить ему запускать ETCD.
systemctl stop kubelet
  1. Остановите и удалите контейнер etcd:

Выведите список запущенных контейнеров содержащих etcd в названии пода, контейнера, или неймспейса

crictl ps -o json |
jq -r '(["PODNAME","PODNAMESPACE","CONTAINERNAME","CONTAINERID"] | (., map(length*"-"))), (.containers[] | [.labels."io.kubernetes.pod.name", .labels."io.kubernetes.pod.namespace", .metadata.name, .id ])| @tsv' |
grep -e "etcd" -e "PODNAME" -e "---" |
column -t

Используя вывод предыдущей команды задайте неймспейс и имя пода, который нужно удалить:

export SEARCH_NAMESPACE=undefined
export SEARCH_POD_NAME=undefined

Выполните команду:

crictl stop $(cidsearch ${SEARCH_POD_NAME} ${SEARCH_NAMESPACE})
crictl rm $(cidsearch ${SEARCH_POD_NAME} ${SEARCH_NAMESPACE})
  1. Создайте резервную копию.

  2. Удалите старые файлы из директории /var/lib/etcd

rm -rf /var/lib/etcd/*
  1. Подготовьте БД из снимка:
etcdctl snapshot restore /tmp/etcd/backup.db           --name=${ETCD_NODE_NAME_1}           --data-dir /var/lib/etcd           --initial-advertise-peer-urls=https://${K8S_NODE_ADDRESS_1}:${ETCD_PEER_PORT}           --initial-cluster=${ETCD_NODE_NAME_1}=https://${K8S_NODE_ADDRESS_1}:${ETCD_PEER_PORT}
примечание

Обратите внимание, что запускается локальный файл etcdctl и снимок так же расположен на мастере в директории /tmp/etcd. В качестве data-dir указана директория, которая монтируется внутрь контейнера ETCD и будет использоваться в качестве хранения файлов БД.

  1. Проверьте и по необходимости отредактируйте параметры запуска ETCD в файле $/etc/kubernetes/manifests/etcd.yaml указанные в разделе spec.containers[0].command. А именно проверьте наличие необходимых полей и их значения, поля не входящие в данный перечень удалять не нужно!
--advertise-client-urls=https://:
--cert-file=/etc/kubernetes/pki/etcd/server.crt
--client-cert-auth=true
--data-dir=/var/lib/etcd
--key-file=/etc/kubernetes/pki/etcd/server.key
--listen-client-urls=https://127.0.0.1:2379,https://:
--listen-metrics-urls=http://0.0.0.0:2381
--listen-peer-urls=https://:2380
--name=
--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
--trusted-ca-file=/etc/kubernetes/pki/etcd/ca.key
ПараметрОписание
advertise-client-urls Анонсируемые точки подключения к узлу, для подключения клиентов. Совпадает с IP адресом узла k8s кластера
cert-file Путь до сертификата ETCD кластера
client-cert-auth Включить/выключить авторизацию пользователей по сертификату
data-dir Директория в которой хранятся файлы БД ETCD
key-file Путь до ключа сертификата ETCD кластера
listen-client-urls Точка подключения, на которой ETCD будет принимать клиентские запросы (0.0.0.0, 127.0.0.1 или IP адрес узла k8s кластера)
listen-metrics-urls Точка подключения, на которой ETCD будет принимать запросы к метрикам (0.0.0.0, 127.0.0.1 или IP адрес узла k8s кластера)
listen-peer-urls Точка подключения, на которой ETCD будет принимать запросы от других узлов ETCD кластера (0.0.0.0, 127.0.0.1 или IP адрес узла k8s кластера)
name Имя узла ETCD кластера
peer-cert-file Путь до сертификата для подключения между узлами ETCD кластера
peer-client-cert-auth Путь до сертификата для авторизации подключений между узлами ETCD кластера
peer-key-file Путь до ключа сертификата для подключения между узлами ETCD кластера
peer-trusted-ca-file Путь до корневого доверенного сертификата для подключения между узлами ETCD кластера
trusted-ca-file Путь до корневого доверенного сертификата ETCD кластера
warning

Если параметр initial-cluster-state равен значению existing или отсутствуют файлы БД и метаданных в ней, тогда все прочие параметры, имя которых начинается со слова initial будут игнорироваться. В нашем случае, мы уже восстановили файлы БД и внесли метаданные на этапе подготовки БД из снимка."

  1. Запустите kubelet:
systemctl start kubelet
  1. Проверьте состояние и логи контейнера

Выведите список запущенных контейнеров содержащих etcd в названии пода, контейнера, или неймспейса

crictl ps -o json |
jq -r '(["PODNAME","PODNAMESPACE","CONTAINERNAME","CONTAINERID"] | (., map(length*"-"))), (.containers[] | [.labels."io.kubernetes.pod.name", .labels."io.kubernetes.pod.namespace", .metadata.name, .id ])| @tsv' |
grep -e "etcd" -e "PODNAME" -e "---" |
column -t

Используя вывод предыдущей команды задайте неймспейс и имя пода, который нужно просмотреть:

export SEARCH_NAMESPACE=undefined
export SEARCH_POD_NAME=undefined
crictl ps $(cidsearch ${SEARCH_POD_NAME} ${SEARCH_NAMESPACE})
crictl logs $(cidsearch ${SEARCH_POD_NAME} ${SEARCH_NAMESPACE})
  1. При помощи команд etcdctl member list и etcdctl endpoint status --cluster проверьте состояние кластера.

  2. переходите к настройке второго узла.

После выполнения работ на всех трех узлах ETCD кластера, кластер восстановлен и готов к работе.


5.1.5.8.1.2. Восстановление всех трех узлов из мгновенного снимка

Данный вариант подразумевает восстановление БД и ее метаданных на всех трех узлах одновременно.

Инструкция
Для начала задайте переменные:
export ETCD_NODE_NAME_1=etcd-main-1
export ETCD_NODE_NAME_2=etcd-main-2
export ETCD_NODE_NAME_3=etcd-main-3
export ETCD_NODE_ADDRESS=10.10.10.3
export ETCD_NODE_ADDRESS=10.10.10.4
export ETCD_NODE_ADDRESS=10.10.10.5
export K8S_NODE_ADDRESS_1=10.10.10.3
export K8S_NODE_ADDRESS_1=10.10.10.4
export K8S_NODE_ADDRESS_1=10.10.10.5
export ETCD_CLIENT_PORT=2379
export ETCD_PEER_PORT=2380
export K8S_NODE_USERNAME=admin
warning

В данном случае, если при запуске восстановленного узла ETCD кластера, в его конфигурации будут присутствовать точки подключения и имена других узлов, которые не сконфигурированы для работы с восстановленным узлом, тогда под восстановленного узла может падать с ошибкой, до тех пор, пока на других узлах не появится корректная конфигурация.

Шаги с 1 по 8 рекомендуется выполнять синхронно на всех трех узлах ETCD кластера.

  1. Загрузите файл мгновенного снимка на ВМ первого узла кластера по пути /tmp/etcd/backup.db при помощи rsync
ssh capv@${K8S_NODE_ADDRESS_1} "mkdir -p /tmp/etcd"
rsync --rsync-path="sudo rsync" LOCAL_PATH_TO_BACKUP/backup.db capv@${K8S_NODE_ADDRESS_1}:/tmp/etcd/backup.db
  1. Подключитесь к ВМ первого узла кластера по ssh и переключитесь на суперпользователя. Затем остановите kubelet, чтобы не позволить ему запускать ETCD.
systemctl stop kubelet
  1. Остановите и удалите контейнер etcd:
export CONTAINER_ID="$(crictl ps -a            --label io.kubernetes.container.name=etcd           --label io.kubernetes.pod.namespace=kube-system           | awk 'NR>1{r=$1} $0~/Running/{exit} END{print r}')"
crictl stop ${CONTAINER_ID}
crictl rm ${CONTAINER_ID}
  1. Создайте резервную копию.

  2. Удалите старые файлы из директории /var/lib/etcd

rm -rf /var/lib/etcd/*
  1. Подготовьте БД из снимка:
etcdctl snapshot restore /tmp/etcd/backup.db           --name=${K8S_NODE_1}           --data-dir /var/lib/etcd           --initial-advertise-peer-urls=https://${K8S_NODE_ADDRESS_1}:2380           --initial-cluster=${K8S_NODE_1}=https://${K8S_NODE_ADDRESS_1}:2380,${K8S_NODE_2}=https://${K8S_NODE_ADDRESS_2}:2380,${K8S_NODE_3}=https://${K8S_NODE_ADDRESS_3}:2380
примечание

Обратите внимание, что запускается локальный файл etcdctl и снимок так же расположен на мастере в директории /tmp/etcd. В качестве data-dir указана директория на хосте, которая монтируется внутрь контейнера ETCD и будет использоваться в качестве хранения файлов БД.

  1. Проверьте и по необходимости отредактируйте параметры запуска ETCD в файле $/etc/kubernetes/manifests/etcd.yaml указанные в разделе spec.containers[0].command. А именно проверьте наличие необходимых полей и их значения, поля не входящий в данный перечень удалять не нужно!
--advertise-client-urls=https://10.10.10.3:2379
--cert-file=/etc/kubernetes/pki/etcd/server.crt
--client-cert-auth=true
--data-dir=/var/lib/etcd
--key-file=/etc/kubernetes/pki/etcd/server.key
--listen-client-urls=https://127.0.0.1:2379,https://10.10.10.3:2379
--listen-metrics-urls=http://0.0.0.0:2381
--listen-peer-urls=https://10.10.10.3:2380
--name=in-cloud-k8s-sandbox-dev-csko-1-tcgzn-7plhz
--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
--trusted-ca-file=/etc/kubernetes/pki/etcd/ca.key
ПараметрОписание
advertise-client-urls Анонсируемые точки подключения к узлу, для подключения клиентов. Совпадает с IP адресом узла k8s кластера
cert-file Путь до сертификата ETCD кластера
client-cert-auth Включить/выключить авторизацию пользователей по сертификату
data-dir Директория в которой хранятся файлы БД ETCD
key-file Путь до ключа сертификата ETCD кластера
listen-client-urls Точка подключения, на которой ETCD будет принимать клиентские запросы (0.0.0.0, 127.0.0.1 или IP адрес узла k8s кластера)
listen-metrics-urls Точка подключения, на которой ETCD будет принимать запросы к метрикам (0.0.0.0, 127.0.0.1 или IP адрес узла k8s кластера)
listen-peer-urls Точка подключения, на которой ETCD будет принимать запросы от других узлов ETCD кластера (0.0.0.0, 127.0.0.1 или IP адрес узла k8s кластера)
name Имя узла ETCD кластера
peer-cert-file Путь до сертификата для подключения между узлами ETCD кластера
peer-client-cert-auth Путь до сертификата для авторизации подключений между узлами ETCD кластера
peer-key-file Путь до ключа сертификата для подключения между узлами ETCD кластера
peer-trusted-ca-file Путь до корневого доверенного сертификата для подключения между узлами ETCD кластера
trusted-ca-file Путь до корневого доверенного сертификата ETCD кластера
примечание

Если параметр initial-cluster-state равен значению "existing" или отсутствуют файлы БД и метаданных в ней, тогда все прочие параметры, имя которых начинается со слова initial будут игнорироваться. В нашем случае, мы уже восстановили файлы БД и внесли метаданные на этапе подготовки БД из снимка.

  1. Выполните аналогичные действия на остальных узлах ETCD кластера.

  2. Запустите kubelet:

systemctl start kubelet
  1. Проверьте состояние контейнера и наличие ошибок
export CONTAINER_ID="$(crictl ps -a            --label io.kubernetes.container.name=etcd           --label io.kubernetes.pod.namespace=kube-system           | awk 'NR>1{r=$1} $0~/Running/{exit} END{print r}')"

crictl ps --id $CONTAINER_ID

crictl logs $CONTAINER_ID
  1. Повторите этапы сбора пререквизитов и подключения к кластеру ETCD.

  2. При помощи команд member list и endpoint status описанных выше проверьте состояние кластера.

После выполнения работ на всех трех узлах ETCD кластера, кластер восстановлен и готов к работе.


5.1.5.8.1.3. Восстановление кластера при конфликтах или проблемах с кворумом

Данная необходимость может возникнуть в случаях:

I. При обновлении кластера появилось больше или меньше 3х управляющих узлов K8s кластера. II. Распался кворум ETCD кластера. III. Повреждены метаданные БД на одном или нескольких узлах ETCD кластера.

Инструкция
Для начала задайте переменные:
export ETCD_NODE_NAME_1=etcd-main-1
export ETCD_NODE_NAME_2=etcd-main-2
export ETCD_NODE_NAME_3=etcd-main-3
export ETCD_NODE_ADDRESS=10.10.10.3
export ETCD_NODE_ADDRESS=10.10.10.4
export ETCD_NODE_ADDRESS=10.10.10.5
export K8S_NODE_ADDRESS_1=10.10.10.3
export K8S_NODE_ADDRESS_1=10.10.10.4
export K8S_NODE_ADDRESS_1=10.10.10.5
export ETCD_CLIENT_PORT=2379
export ETCD_PEER_PORT=2380
export K8S_NODE_USERNAME=admin
  1. Определите текущее количество узлов ETCD кластера.

Если  KubeAPI восстанавливаемого кластера доступно, тогда используйте этот вариант.

  1. Подключитесь к KubeAPI и введите команду:
kubectl get pod -n kube-system -l component=etcd -o wide
  1. Выберите под узла ETCD кластера из полученной таблицы, на основе которого вы будете восстанавливать кластер.
  1. Подключитесь к выбранному вами узлу K8s кластера или узлу K8s кластера выбранного вами пода.

  2. Cоберите все возможные пререквизиты для подключения к ETCD и K8s кластеру.

  1. Если удается подключиться к ETCD кластеру, тогда создайте резервную копию и выполните восстановление кластера с дальнейшим подключением остальных узлов ETCD кластера.

На этом восстановление кластера завершено.

5.1.5.8.2. ETCD Kube API current k8s cluster

5.1.5.8.2.1. Восстановление с одного узла из мгновенного снимка

Данный вариант подразумевает, что бэкап разворачивается на первом узле и кластер запускается в режиме одного узла. Далее поочередно будут добавляться другие узлы кластера.

Инструкция
Данный вариант ETCD кластера разворачивается на ControlPlane нодах кластера, по 1му на каждую.
Для начала задайте переменные:
  • ETCD_NODE_NAME_N - Имя пода ETCD (Обычно записывается в формате `etcd-ИМЯ_CONTROLPLANE_НОДЫ`)
  • K8S_NODE_NAME_N - Имя ноды K8s кластера на которой поднимается ETCD.
  • K8S_NODE_ADDRESS_N - IP адрес ноды K8s кластера на которой поднимается ETCD.
  • ETCD_CLIENT_PORT - Порт к которому подключаются клиенты ETCD кластера.
  • ETCD_PEER_PORT - Порт к которому подключаются другие узлы ETCD кластера.
  • K8S_NODE_USERNAME - Имя пользователя, по которому вы можете подключиться к узлам K8s кластера по SSH.
  • export ETCD_NODE_NAME_1=etcd-in-cloud-k8s-sandbox-dev-csko-1-tcgzn-7plhz
    export ETCD_NODE_NAME_2=etcd-in-cloud-k8s-sandbox-dev-csko-1-tcgzn-h9g49
    export ETCD_NODE_NAME_3=etcd-in-cloud-k8s-sandbox-dev-csko-1-tcgzn-wps6k
    export K8S_NODE_NAME_1=10.10.10.3
    export K8S_NODE_NAME_2=10.10.10.4
    export K8S_NODE_NAME_3=10.10.10.5
    export K8S_NODE_ADDRESS_1=10.10.10.3
    export K8S_NODE_ADDRESS_2=10.10.10.4
    export K8S_NODE_ADDRESS_3=10.10.10.5
    export ETCD_CLIENT_PORT=2379
    export ETCD_PEER_PORT=2380
    export K8S_NODE_USERNAME=admin
    1. Загрузите файл мгновенного снимка на ВМ первого узла кластера по пути /tmp/etcd/backup.db при помощи rsync
    ssh ${K8S_NODE_USERNAME}@${K8S_NODE_ADDRESS_1} "mkdir -p /tmp/etcd"
    rsync --rsync-path="sudo rsync" \
    backup.db \
    ${K8S_NODE_USERNAME}@${K8S_NODE_ADDRESS_1}:/tmp/etcd/backup.db
    2. Подключитесь к ВМ первого узла кластера по ssh и переключитесь на суперпользователя. Затем остановите `kubelet`, чтобы не позволить ему запускать ETCD.
    ssh ${K8S_NODE_USERNAME}@${K8S_NODE_ADDRESS_1}
    sudo su -
    systemctl stop kubelet
    3. Определите контейнер `etcd` на ноде: Выведите список запущенных контейнеров etcd.
    crictl ps \
    --label io.kubernetes.container.name=etcd \
    -o json | jq -r \
    '(["PODNAME","PODNAMESPACE","CONTAINERNAME","CONTAINERID"] | (., map(length*"-"))), (.containers[] | [.labels."io.kubernetes.pod.name", .labels."io.kubernetes.pod.namespace", .metadata.name, .id ])| @tsv' | column -t
    Используя вывод предыдущей команды задайте неймспейс и имя пода контейнера:
    export SEARCH_NAMESPACE=undefined
    export SEARCH_POD_NAME=undefined
    4. Сбор Флагов
    ectlflagsearch() {
    ETCD_ARGS=$(
    crictl inspect \
    -o yaml \
    $(cidsearch \
    ${SEARCH_POD_NAME} \
    ${SEARCH_NAMESPACE} \
    )) ; \
    echo -n \
    '--cert='$(grep -- '--peer-cert-file=' <<< $ETCD_ARGS |
    head -n1 |
    sed 's/[^=]*=//') \
    '--key='$(grep -- '--peer-key-file=' <<< $ETCD_ARGS |
    head -n1 |
    sed 's/[^=]*=//') \
    '--cacert='$(grep -- '--trusted-ca-file=' <<< $ETCD_ARGS |
    head -n1 |
    sed 's/[^=]*=//') \
    '--endpoints='$(grep -- '--advertise-client-urls=' <<< $ETCD_ARGS |
    head -n1 |
    sed 's/[^=]*=//' |
    sed 's/$(POD_NAME)/'${SEARCH_POD_NAME}'/' |
    sed 's/$(POD_NAMESPACE)/'${SEARCH_NAMESPACE}'/')
    }
    Выполните команды для остановки и удаления контейнера:
    crictl stop $(cidsearch ${SEARCH_POD_NAME} ${SEARCH_NAMESPACE})
    crictl rm $(cidsearch ${SEARCH_POD_NAME} ${SEARCH_NAMESPACE})
    4. Создайте резервную копию ФС (Процесс описан в главы Бекапы). 5. Удалите старые файлы из директории /var/lib/etcd
    rm -rf /var/lib/etcd/*
    6. Подготовьте БД из снимка:
    etcdctl snapshot restore /tmp/etcd/backup.db \
    --name=${ETCD_NODE_NAME_1} \
    --data-dir /var/lib/etcd \
    --initial-advertise-peer-urls=https://${K8S_NODE_ADDRESS_1}:${ETCD_PEER_PORT} \
    --initial-cluster=${ETCD_NODE_NAME_1}=https://${K8S_NODE_ADDRESS_1}:${ETCD_PEER_PORT}
    :::note Обратите внимание, что запускается локальный файл `etcdctl` и снимок так же расположен на мастере в директории /tmp/etcd. В качестве `data-dir` указана директория, которая монтируется внутрь контейнера ETCD и будет использоваться в качестве хранения файлов БД. ::: 7. Проверьте и по необходимости отредактируйте параметры запуска ETCD в файле $/etc/kubernetes/manifests/etcd.yamlуказанные в разделе `spec.containers[0].command`. А именно проверьте наличие необходимых полей и их значения, поля не входящие в данный перечень удалять не нужно!
    --advertise-client-urls=https://10.10.10.3:2379
    --cert-file=/etc/kubernetes/pki/etcd/server.crt
    --client-cert-auth=true
    --data-dir=/var/lib/etcd
    --key-file=/etc/kubernetes/pki/etcd/server.key
    --listen-client-urls=https://127.0.0.1:2379,https://10.10.10.3:2379
    --listen-metrics-urls=http://0.0.0.0:2381
    --listen-peer-urls=https://10.10.10.3:2380
    --name=etcd-in-cloud-k8s-sandbox-dev-csko-1-tcgzn-7plhz
    --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
    --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.key
    ПараметрОписание
    `advertise-client-urls` Анонсируемые точки подключения к узлу, для подключения клиентов. Совпадает с IP адресом узла k8s кластера
    `cert-file` Путь до сертификата ETCD кластера
    `client-cert-auth` Включить/выключить авторизацию пользователей по сертификату
    `data-dir` Директория в которой хранятся файлы БД ETCD
    `key-file` Путь до ключа сертификата ETCD кластера
    `listen-client-urls` Точка подключения, на которой ETCD будет принимать клиентские запросы (`0.0.0.0`, `127.0.0.1` или IP адрес узла k8s кластера)
    `listen-metrics-urls` Точка подключения, на которой ETCD будет принимать запросы к метрикам (`0.0.0.0`, `127.0.0.1` или IP адрес узла k8s кластера)
    `listen-peer-urls` Точка подключения, на которой ETCD будет принимать запросы от других узлов ETCD кластера (`0.0.0.0`, `127.0.0.1` или IP адрес узла k8s кластера)
    `name` Имя узла ETCD кластера
    `peer-cert-file` Путь до сертификата для подключения между узлами ETCD кластера
    `peer-client-cert-auth` Путь до сертификата для авторизации подключений между узлами ETCD кластера
    `peer-key-file` Путь до ключа сертификата для подключения между узлами ETCD кластера
    `peer-trusted-ca-file` Путь до корневого доверенного сертификата для подключения между узлами ETCD кластера
    `trusted-ca-file` Путь до корневого доверенного сертификата ETCD кластера
    8. Запустите kubelet:
    systemctl start kubelet
    9. Проверьте состояние и логи контейнера Выведите список запущенных контейнеров содержащих etcd в названии пода, контейнера, или неймспейса
    crictl ps -o json | jq -r \
    '(["PODNAME","PODNAMESPACE","CONTAINERNAME","CONTAINERID"] | (., map(length*"-"))), (.containers[] | [.labels."io.kubernetes.pod.name", .labels."io.kubernetes.pod.namespace", .metadata.name, .id ])| @tsv' |
    grep -e "etcd" -e "PODNAME" -e "---" |
    column -t
    Используя вывод предыдущей команды задайте неймспейс и имя пода, который нужно просмотреть:
    export SEARCH_NAMESPACE=undefined
    export SEARCH_POD_NAME=undefined
    crictl ps $(cidsearch ${SEARCH_POD_NAME} ${SEARCH_NAMESPACE})
    crictl logs $(cidsearch ${SEARCH_POD_NAME} ${SEARCH_NAMESPACE})
    11. При помощи команд `etcdctl member list` и `etcdctl endpoint status --cluster` проверьте состояние кластера. 12. переходите к настройке второго узла.
    После выполнения работ на всех трех узлах ETCD кластера, кластер восстановлен и готов к работе.

    5.1.5.8.2.2. Восстановление всех трех узлов из мгновенного снимка

    Данный вариант подразумевает, восстановление БД и ее метаданных на всех трех узлах одновременно.

    Инструкция
    Данный вариант ETCD кластера разворачивается на ControlPlane нодах кластера, по 1му на каждую.
    Для начала задайте переменные:
  • ETCD_NODE_NAME_N - Имя пода ETCD (Обычно записывается в формате `etcd-ИМЯ_CONTROLPLANE_НОДЫ`)
  • K8S_NODE_NAME_N - Имя ноды K8s кластера на которой поднимается ETCD.
  • K8S_NODE_ADDRESS_N - IP адрес ноды K8s кластера на которой поднимается ETCD.
  • ETCD_CLIENT_PORT - Порт к которому подключаются клиенты ETCD кластера.
  • ETCD_PEER_PORT - Порт к которому подключаются другие узлы ETCD кластера.
  • K8S_NODE_USERNAME - Имя пользователя, по которому вы можете подключиться к узлам K8s кластера по SSH.
  • export ETCD_NODE_NAME_1=etcd-in-cloud-k8s-sandbox-dev-csko-1-tcgzn-7plhz
    export ETCD_NODE_NAME_2=etcd-in-cloud-k8s-sandbox-dev-csko-1-tcgzn-h9g49
    export ETCD_NODE_NAME_3=etcd-in-cloud-k8s-sandbox-dev-csko-1-tcgzn-wps6k
    export K8S_NODE_NAME_1=10.10.10.3
    export K8S_NODE_NAME_2=10.10.10.4
    export K8S_NODE_NAME_3=10.10.10.5
    export K8S_NODE_ADDRESS_1=10.10.10.3
    export K8S_NODE_ADDRESS_2=10.10.10.4
    export K8S_NODE_ADDRESS_3=10.10.10.5
    export ETCD_CLIENT_PORT=2379
    export ETCD_PEER_PORT=2380
    export K8S_NODE_USERNAME=admin
    warning

    В данном случае, если при запуске восстановленного узла ETCD кластера, в его конфигурации будут присутствовать точки подключения и имена других узлов, которые не сконфигурированы для работы с восстановленным узлом, тогда под восстановленного узла может падать с ошибкой, до тех пор, пока на других узлах не появится корректная конфигурация.

    Шаги с 1 по 8 рекомендуется выполнять синхронно на всех трех узлах ETCD кластера.

    1. Загрузите файл мгновенного снимка на ВМ первого узла кластера по пути /tmp/etcd/backup.db при помощи rsync
    ssh capv@${K8S_NODE_ADDRESS_1} "mkdir -p /tmp/etcd"
    rsync --rsync-path="sudo rsync" LOCAL_PATH_TO_BACKUP/backup.db capv@${K8S_NODE_ADDRESS_1}:/tmp/etcd/backup.db
    1. Подключитесь к ВМ первого узла кластера по ssh и переключитесь на суперпользователя. Затем остановите kubelet, чтобы не позволить ему запускать ETCD.
    systemctl stop kubelet
    1. Остановите и удалите контейнер etcd:
    export CONTAINER_ID="$(crictl ps -a          --label io.kubernetes.container.name=etcd         --label io.kubernetes.pod.namespace=kube-system         | awk 'NR>1{r=$1} $0~/Running/{exit} END{print r}')"
    crictl stop ${CONTAINER_ID}
    crictl rm ${CONTAINER_ID}
    1. Создайте резервную копию.

    2. Удалите старые файлы из директории /var/lib/etcd

    rm -rf /var/lib/etcd/*
    1. Подготовьте БД из снимка:
    etcdctl snapshot restore /tmp/etcd/backup.db         --name=${K8S_NODE_1}         --data-dir /var/lib/etcd         --initial-advertise-peer-urls=https://${K8S_NODE_ADDRESS_1}:2380         --initial-cluster=${K8S_NODE_1}=https://${K8S_NODE_ADDRESS_1}:2380,${K8S_NODE_2}=https://${K8S_NODE_ADDRESS_2}:2380,${K8S_NODE_3}=https://${K8S_NODE_ADDRESS_3}:2380
    примечание

    Обратите внимание, что запускается локальный файл etcdctl и снимок так же расположен на мастере в директории /tmp/etcd. В качестве data-dir указана директория на хосте, которая монтируется внутрь контейнера ETCD и будет использоваться в качестве хранения файлов БД.

    1. Проверьте и по необходимости отредактируйте параметры запуска ETCD в файле $/etc/kubernetes/manifests/etcd.yaml указанные в разделе spec.containers[0].command. А именно проверьте наличие необходимых полей и их значения, поля не входящий в данный перечень удалять не нужно!
    --advertise-client-urls=https://10.10.10.3:2379
    --cert-file=/etc/kubernetes/pki/etcd/server.crt
    --client-cert-auth=true
    --data-dir=/var/lib/etcd
    --key-file=/etc/kubernetes/pki/etcd/server.key
    --listen-client-urls=https://127.0.0.1:2379,https://10.10.10.3:2379
    --listen-metrics-urls=http://0.0.0.0:2381
    --listen-peer-urls=https://10.10.10.3:2380
    --name=in-cloud-k8s-sandbox-dev-csko-1-tcgzn-7plhz
    --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
    --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.key
    ПараметрОписание
    advertise-client-urls Анонсируемые точки подключения к узлу, для подключения клиентов. Совпадает с IP адресом узла k8s кластера
    cert-file Путь до сертификата ETCD кластера
    client-cert-auth Включить/выключить авторизацию пользователей по сертификату
    data-dir Директория в которой хранятся файлы БД ETCD
    key-file Путь до ключа сертификата ETCD кластера
    listen-client-urls Точка подключения, на которой ETCD будет принимать клиентские запросы (0.0.0.0, 127.0.0.1 или IP адрес узла k8s кластера)
    listen-metrics-urls Точка подключения, на которой ETCD будет принимать запросы к метрикам (0.0.0.0, 127.0.0.1 или IP адрес узла k8s кластера)
    listen-peer-urls Точка подключения, на которой ETCD будет принимать запросы от других узлов ETCD кластера (0.0.0.0, 127.0.0.1 или IP адрес узла k8s кластера)
    name Имя узла ETCD кластера
    peer-cert-file Путь до сертификата для подключения между узлами ETCD кластера
    peer-client-cert-auth Путь до сертификата для авторизации подключений между узлами ETCD кластера
    peer-key-file Путь до ключа сертификата для подключения между узлами ETCD кластера
    peer-trusted-ca-file Путь до корневого доверенного сертификата для подключения между узлами ETCD кластера
    trusted-ca-file Путь до корневого доверенного сертификата ETCD кластера
    примечание

    Если параметр initial-cluster-state равен значению "existing" или отсутствуют файлы БД и метаданных в ней, тогда все прочие параметры, имя которых начинается со слова initial будут игнорироваться. В нашем случае, мы уже восстановили файлы БД и внесли метаданные на этапе подготовки БД из снимка.

    1. Выполните аналогичные действия на остальных узлах ETCD кластера.

    2. Запустите kubelet:

    systemctl start kubelet
    1. Проверьте состояние контейнера и наличие ошибок
    export CONTAINER_ID="$(crictl ps -a          --label io.kubernetes.container.name=etcd         --label io.kubernetes.pod.namespace=kube-system         | awk 'NR>1{r=$1} $0~/Running/{exit} END{print r}')"

    crictl ps --id $CONTAINER_ID

    crictl logs $CONTAINER_ID
    1. Повторите этапы сбора пререквизитов и подключения к кластеру ETCD.

    2. При помощи команд member list и endpoint status описанных выше проверьте состояние кластера.

    После выполнения работ на всех трех узлах ETCD кластера, кластер восстановлен и готов к работе.


    5.1.5.8.2.3. Восстановление кластера при конфликтах или проблемах с кворумом

    Данная необходимость может возникнуть в случаях:

    I. При обновлении кластера появилось больше или меньше 3х управляющих узлов K8s кластера. II. Распался кворум ETCD кластера. III. Повреждены метаданные БД на одном или нескольких узлах ETCD кластера.

    Инструкция
    Данный вариант ETCD кластера разворачивается на ControlPlane нодах кластера, по 1му на каждую.
    Для начала задайте переменные:
  • ETCD_NODE_NAME_N - Имя пода ETCD (Обычно записывается в формате `etcd-ИМЯ_CONTROLPLANE_НОДЫ`)
  • K8S_NODE_NAME_N - Имя ноды K8s кластера на которой поднимается ETCD.
  • K8S_NODE_ADDRESS_N - IP адрес ноды K8s кластера на которой поднимается ETCD.
  • ETCD_CLIENT_PORT - Порт к которому подключаются клиенты ETCD кластера.
  • ETCD_PEER_PORT - Порт к которому подключаются другие узлы ETCD кластера.
  • K8S_NODE_USERNAME - Имя пользователя, по которому вы можете подключиться к узлам K8s кластера по SSH.
  • export ETCD_NODE_NAME_1=etcd-in-cloud-k8s-sandbox-dev-csko-1-tcgzn-7plhz
    export ETCD_NODE_NAME_2=etcd-in-cloud-k8s-sandbox-dev-csko-1-tcgzn-h9g49
    export ETCD_NODE_NAME_3=etcd-in-cloud-k8s-sandbox-dev-csko-1-tcgzn-wps6k
    export K8S_NODE_NAME_1=10.10.10.3
    export K8S_NODE_NAME_2=10.10.10.4
    export K8S_NODE_NAME_3=10.10.10.5
    export K8S_NODE_ADDRESS_1=10.10.10.3
    export K8S_NODE_ADDRESS_2=10.10.10.4
    export K8S_NODE_ADDRESS_3=10.10.10.5
    export ETCD_CLIENT_PORT=2379
    export ETCD_PEER_PORT=2380
    export K8S_NODE_USERNAME=admin
    1. Определите текущее количество узлов ETCD кластера.

    Если  KubeAPI восстанавливаемого кластера доступно, тогда используйте этот вариант.

    1. Подключитесь к KubeAPI и введите команду:
    kubectl get pod -n kube-system -l component=etcd -o wide
    1. Выберите под узла ETCD кластера из полученной таблицы, на основе которого вы будете восстанавливать кластер.
    1. Подключитесь к выбранному вами узлу K8s кластера или узлу K8s кластера выбранного вами пода.

    2. Cоберите все возможные пререквизиты для подключения к ETCD и K8s кластеру.

    1. Если удается подключиться к ETCD кластеру, тогда создайте резервную копию и выполните восстановление кластера с дальнейшим подключением остальных узлов ETCD кластера.

    На этом восстановление кластера завершено.


    TODO опиши как работает gardener etcd-backup (в режиме снапшотов)