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=
Если адрес первого узла указан в конфигурации других еще работающих узлов, они упадут с ошибкой, пока не будут подключены к новому кластеру.
- Master-1
- Master-2
- Master-3
- Загрузите файл мгновенного снимка на ВМ первого узла кластера по пути
/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
- Подключитесь к ВМ первого узла кластера по ssh и переключитесь на суперпользователя.
Затем остановите
kubelet
, чтобы не позволить ему запускать ETCD.
systemctl stop kubelet
- Остановите и удалите контейнер
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})
-
Создайте резервную копию.
-
Удалите старые файлы из директории
/var/lib/etcd
rm -rf /var/lib/etcd/*
- Подготовьте БД из снимка:
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 и будет использоваться в качестве хранения файлов БД.
- Проверьте и по необходимости отредактируйте параметры запуска 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 кластера |
Если параметр initial-cluster-state
равен значению existing
или отсутствуют файлы БД и метаданных в ней, тогда все прочие параметры, имя которых начинается со слова initial
будут игнорироваться. В нашем случае, мы уже восстановили файлы БД и внесли метаданные на этапе подготовки БД из снимка."
- Запустите kubelet:
systemctl start kubelet
- Проверьте состояние и логи контейнера
Выведите список запущенных контейнеров содержащих 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})
-
При помощи команд
etcdctl member list
иetcdctl endpoint status --cluster
проверьте состояние кластера. -
переходите к настройке второго узла.
- На первом узле ETCD кластера добавьте второй узел кластера в режиме обучающегося:
etcdctl member add ${ETCD_NODE_NAME_2} --peer-urls=https://${K8S_NODE_ADDRESS_2}:${ETCD_PEER_PORT} --learner ;
- Подключитесь к ВМ второго узла кластера по ssh и остановите
kubelet
, чтобы не позволить ему запускать ETCD.
systemctl stop kubelet
- Остановите и удалите контейнер
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}
-
Создайте резервную копию.
-
Удалите старые файлы из директории
/var/lib/etcd
rm -rf /tmp/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
--initial-advertise-peer-urls=https://:2380
--initial-cluster==https://:2380,=https://:2380
--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 кластера |
initial-advertise-peer-urls | Анонсируемые точки подключения к данному узлу для подключения между узлами ETCD кластера |
initial-cluster | Перечень узлов кластера ETCD и их точки подключения для взаимодействия между узлами 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 кластера |
- Запустите kubelet:
systemctl start kubelet
- Проверьте состояние контейнера и наличие ошибок
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
- Вернитесь к первому узлу кластера и проверьте, что второй узел определился (Его состояние должно быть
started
):
ectl member list -w table
- После этого переведите второй узел в рабочий режим:
ectl member promote ${ETCD_NODE_NAME_2}
-
При помощи команд
member list
иendpoint status
описанных выше проверьте состояние кластера. -
Переходите к третьему узла кластера
- Подключитесь к первому узлу ETCD кластера и добавьте третий узел кластера в режиме обучающегося:
etcdctl member add ${ETCD_NODE_NAME_3} --peer-urls=https://${K8S_NODE_ADDRESS_3}:${ETCD_PEER_PORT} --learner ;
- Подключитесь к ВМ третьего узла кластера по ssh и остановите
kubelet
, чтобы не позволить ему запускать ETCD.
systemctl stop kubelet
- Остановите и удалите контейнер
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}
-
Создайте резервную копию.
-
Удалите старые файлы из директории
/var/lib/etcd
rm -rf /tmp/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
--initial-advertise-peer-urls=https://:2380
--initial-cluster==https://:2380,=https://:2380,=https://:2380
--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 кластера |
initial-advertise-peer-urls | Анонсируемые точки подключения к данному узлу для подключения между узлами ETCD кластера |
initial-cluster | Перечень узлов кластера ETCD и их точки подключения для взаимодействия между узлами 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 кластера |
- Запустите kubelet:
systemctl start kubelet
- Проверьте состояние контейнера и наличие ошибок
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
- Вернитесь к первому узлу кластера и проверьте, что третий узел определился (Его состояние должно быть
started
):
ectl member list -w table
- После этого переведите третий узел в рабочий режим:
ectl member promote ${ETCD_NODE_NAME_3}
- При помощи команд
member list
иendpoint status
описанных выше проверьте состояние кластера.
После выполнения работ на всех трех узлах 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
В данном случае, если при запуске восстановленного узла ETCD кластера, в его конфигурации будут присутствовать точки подключения и имена других узлов, которые не сконфигурированы для работы с восстановленным узлом, тогда под восстановленного узла может падать с ошибкой, до тех пор, пока на других узлах не появится корректная конфигурация.
Шаги с 1 по 8 рекомендуется выполнять синхронно на всех трех узлах ETCD кластера.
- Master-1
- Master-2
- Master-3
- Загрузите файл мгновенного снимка на ВМ первого узла кластера по пути
/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
- Подключитесь к ВМ первого узла кластера по ssh и переключитесь на суперпользователя.
Затем остановите
kubelet
, чтобы не позволить ему запускать ETCD.
systemctl stop kubelet
- Остановите и удалите контейнер
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}
-
Создайте резервную копию.
-
Удалите старые файлы из директории
/var/lib/etcd
rm -rf /var/lib/etcd/*
- Подготовьте БД из снимка:
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 и будет использоваться в качестве хранения файлов БД.
- Проверьте и по необходимости отредактируйте параметры запуска 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
будут игнорироваться.
В нашем случае, мы уже восстановили файлы БД и внесли метаданные на этапе подготовки БД из снимка.
-
Выполните аналогичные действия на остальных узлах ETCD кластера.
-
Запустите kubelet:
systemctl start kubelet
- Проверьте состояние контейнера и наличие ошибок
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
- Загрузите файл мгновенного снимка на ВМ первого узла кластера по пути
/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
- Подключитесь к ВМ первого узла кластера по ssh и переключитесь на суперпользователя.
Затем остановите
kubelet
, чтобы не позволить ему запускать ETCD.
systemctl stop kubelet
- Остановите и удалите контейнер
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}
-
Создайте резервную копию.
-
Удалите старые файлы из директории
/var/lib/etcd
rm -rf /var/lib/etcd/*
- Подготовьте БД из снимка:
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 и будет использоваться в качестве хранения файлов БД.
- Проверьте и по необходимости отредактируйте параметры запуска 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
будут игнорироваться.
В нашем случае, мы уже восстановили файлы БД и внесли метаданные на этапе подготовки БД из снимка.
-
Вы полните аналогичные действия на остальных узлах ETCD кластера.
-
Запустите kubelet:
systemctl start kubelet
- Проверьте состояние контейнера и наличие ошибок
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
- Загрузите файл мгновенного снимка на ВМ первого узла кластера по пути
/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
- Подключитесь к ВМ первого узла кластера по ssh и переключитесь на суперпользователя.
Затем остановите
kubelet
, чтобы не позволить ему запускать ETCD.
systemctl stop kubelet
- Остановите и удалите контейнер
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}
-
Создайте резервную копию.
-
Удалите старые файлы из директории
/var/lib/etcd
rm -rf /var/lib/etcd/*
- Подготовьте БД из снимка:
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 и будет использоваться в качестве хранения файлов БД.
- Проверьте и по необходимости отредактируйте параметры запуска 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
будут игнорироваться.
В нашем случае, мы уже восстановили файлы БД и внесли метаданные на этапе подготовки БД из снимка.
-
Выполните аналогичные действия на остальных узлах ETCD кластера.
-
Запустите kubelet:
systemctl start kubelet
- Проверьте состояние контейнера и наличие ошибок
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
-
Повторите этапы сбора пререквизитов и подключения к кластеру ETCD.
-
При помощи команд
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
- Определите текущее количество узлов ETCD кластера.
- KubeAPI восстанавливаемого кластера
- kubeAPI инфра кластера
Если KubeAPI восстанавливаемого кластера доступно, тогда используйте этот вариант.
- Подключитесь к KubeAPI и введите команду:
kubectl get pod -n kube-system -l component=etcd -o wide
- Выберите под узла ETCD кластера из полученной таблицы, на основе которого вы будете восстанавливать кластер.
- Подключитесь к KubeAPI инфраструктурного кластера и введите команду:
kubectl get machine -n in-cloud-k8s-sandbox-test-csko-1
-l cluster.x-k8s.io/control-plane=
-o custom-columns=NAME:.metadata.name,ADDRESSES:status.addresses[0].address
- Выберите узел k8s кластера, с которого вы будете восстанавливать кластер.
-
Подключитесь к выбранному вами узлу K8s кластера или узлу K8s кластера выбранного вами пода.
-
Cоберите все возможные пререквизиты для подключения к ETCD и K8s кластеру.
- ETCD кластер работает
- ETCD кластер не работает
- Если удается подключиться к ETCD кластеру, тогда создайте резервную копию и выполните восстановление кластера с дальнейшим подключением остальных узлов ETCD кластера.
-
Если подключение к ETCD кластеру невозможно, сделайте резервную копию файлов БД.
-
Откройте на редактирование файл
$/etc/kubernetes/manifests/etcd.yaml
. -
В параметрах запуска ETCD указанных в разделе
spec.containers[0].command
добавьте ключ:
--force-new-cluster
Здесь же измените параметр initial-cluster
так, чтобы в нем остался только текущий узел ETCD кластера.
--initial-cluster=in-cloud-k8s-sandbox-dev-csko-1-tcgzn-7plhz=https://10.10.10.3:2380
Таким образом, при следущем запуске ETCD будут удалены все текущие метаданные из файлов БД,
и туда будут записаны новые, указанные в разделе spec.containers[0].command
с суффиксом initial.
-
Дождитесь, когда пересоздастся под ETCD узла и проверьте его состояние.
-
В файле
$/etc/kubernetes/manifests/etcd.yaml
в параметрах запуска ETCD указанных в разделеspec.containers[0].command
удалите ключ:
--force-new-cluster
В противном случае, при каждом перезапуске пода/контейнера будут удаляться все метаданные из БД.
- Добавьте 2й и 3й узлы кластера ETCD как это указано в инструкции к
восстановлению с одного узла для
Master-2
иMaster-3
.
На этом восстановление кластера завершено.
5.1.5.8.2. ETCD Kube API current k8s cluster
5.1.5.8.2.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
- Master-1
- Master-2
- Master-3
/tmp/etcd/backup.db
при помощи rsyncssh ${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
ssh ${K8S_NODE_USERNAME}@${K8S_NODE_ADDRESS_1}
sudo su -
systemctl stop kubelet
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
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})
/var/lib/etcd
rm -rf /var/lib/etcd/*
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}
/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 кластера |
systemctl start kubelet
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})
etcdctl member add ${ETCD_NODE_NAME_2} --peer-urls=https://${K8S_NODE_ADDRESS_2}:2380 --learner ;
systemctl stop kubelet
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}
/var/lib/etcd
rm -rf /tmp/etcd/*
$/etc/kubernetes/manifests/etcd.yaml
: Найдите и замените значение следующих ключей в разделе `spec.containers[0].command` аналогично примеру ниже в соответствии с вашими параметрамии таблицей с описанием:--advertise-client-urls=https://10.10.10.4:2379
--cert-file=/etc/kubernetes/pki/etcd/server.crt
--client-cert-auth=true
--data-dir=/var/lib/etcd
--initial-advertise-peer-urls=https://10.10.10.4:2380
--initial-cluster=etcd-in-cloud-k8s-sandbox-dev-csko-1-tcgzn-7plhz=https://10.10.10.3:2380,etcd-in-cloud-k8s-sandbox-dev-csko-1-tcgzn-h9g49=https://10.10.10.4:2380
--key-file=/etc/kubernetes/pki/etcd/server.key
--listen-client-urls=https://127.0.0.1:2379,https://10.10.10.4:2379
--listen-metrics-urls=http://0.0.0.0:2381
--listen-peer-urls=https://10.10.10.4:2380
--name=etcd-in-cloud-k8s-sandbox-dev-csko-1-tcgzn-h9g49
--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 кластера |
`initial-advertise-peer-urls` | Анонсируемые точки подключения к данному узлу для подключения между узлами ETCD кластера |
`initial-cluster` | Перечень узлов кластера ETCD и их точки подключения для взаимодействия между узлами 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 кластера |
systemctl start kubelet
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
ectl member list -w table
ectl member promote ${ETCD_NODE_NAME_2}
etcdctl member add ${ETCD_NODE_NAME_3} --peer-urls=https://${K8S_NODE_ADDRESS_3}:2380 --learner ;
systemctl stop kubelet
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}
/var/lib/etcd
rm -rf /tmp/etcd/*
$/etc/kubernetes/manifests/etcd.yaml
: Найдите и замените значение следующих ключей в разделе `spec.containers[0].command` аналогично примеру ниже в соответствии с вашими параметрамии таблицей с описанием:--advertise-client-urls=https://10.10.10.5:2379
--cert-file=/etc/kubernetes/pki/etcd/server.crt
--client-cert-auth=true
--data-dir=/var/lib/etcd
--initial-advertise-peer-urls=https://10.10.10.5:2380
--initial-cluster=etcd-in-cloud-k8s-sandbox-dev-csko-1-tcgzn-7plhz=https://10.10.10.3:2380,etcd-in-cloud-k8s-sandbox-dev-csko-1-tcgzn-h9g49=https://10.10.10.4:2380,etcd-in-cloud-k8s-sandbox-dev-csko-1-tcgzn-wps6k=https://10.10.10.5:2380
--key-file=/etc/kubernetes/pki/etcd/server.key
--listen-client-urls=https://127.0.0.1:2379,https://10.10.10.5:2379
--listen-metrics-urls=http://0.0.0.0:2381
--listen-peer-urls=https://10.10.10.5:2380
--name=etcd-in-cloud-k8s-sandbox-dev-csko-1-tcgzn-wps6k
--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 кластера |
`initial-advertise-peer-urls` | Анонсируемые точки подключения к данному узлу для подключения между узлами ETCD кластера |
`initial-cluster` | Перечень узлов кластера ETCD и их точки подключения для взаимодействия между узлами 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 кластера |
systemctl start kubelet
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
ectl member list -w table
ectl member promote ${ETCD_NODE_NAME_3}
5.1.5.8.2.2. Восстановление всех трех узлов из мгновенного снимка
Данный вариант подразумевает, восстановление БД и ее метаданных на всех трех узлах одновременно.
Инструкция
Для начала задайте переменные:
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
В данном случае, если при запуске восстановленного узла ETCD кластера, в его конфигурации будут присутствовать точки подключения и имена других узлов, которые не сконфигурированы для работы с восстановленным узлом, тогда под восстановленного узла может падать с ошибкой, до тех пор, пока на других узлах не появится корректная конфигурация.
Шаги с 1 по 8 рекомендуется выполнять синхронно на всех трех узлах ETCD кластера.
- Master-1
- Master-2
- Master-3
- Загрузите файл мгновенного снимка на ВМ первого узла кластера по пути
/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
- Подключитесь к ВМ первого узла кластера по ssh и переключитесь на суперпользователя.
Затем остановите
kubelet
, чтобы не позволить ему запускать ETCD.
systemctl stop kubelet
- Остановите и удалите контейнер
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}
-
Создайте резервную копию.
-
Удалите старые файлы из директории
/var/lib/etcd
rm -rf /var/lib/etcd/*
- Подготовьте БД из снимка:
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 и будет использоваться в качестве хранения фа йлов БД.
- Проверьте и по необходимости отредактируйте параметры запуска 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
будут игнорироваться.
В нашем случае, мы уже восстановили файлы БД и внесли метаданные на этапе подготовки БД из снимка.
-
Выполните аналогичные действия на остальных узлах ETCD кластера.
-
Запустите kubelet:
systemctl start kubelet
- Проверьте состояние контейнера и наличие ошибок
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
- Загрузите файл мгновенного снимка на ВМ первого узла кластера по пути
/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
- Подключитесь к ВМ первого узла кластера по ssh и переключитесь на суперпользователя.
Затем остановите
kubelet
, чтобы не позволить ему запускать ETCD.
systemctl stop kubelet
- Остановите и удалите контейнер
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}
-
Создайте резервную копию.
-
Удалите старые файлы из директории
/var/lib/etcd
rm -rf /var/lib/etcd/*
- Подготовьте БД из сним ка:
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 и будет использоваться в качестве хранения файлов БД.
- Проверьте и по необходимости отредактируйте параметры запуска 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
будут игнорироваться.
В нашем случае, мы уже восстановили файлы БД и внесли метаданные на этапе подготовки БД из снимка.
-
Выполните аналогичные действия на остальных узлах ETCD кластера.
-
Запустите kubelet:
systemctl start kubelet
- Проверьте состояние контейнера и наличие ошибок
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
- Загрузите файл мгновенного снимка на ВМ первого узла кластера по пути
/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
- Подключитесь к ВМ первого узла кластера по ssh и переключитесь на суперпользователя.
Затем остановите
kubelet
, чтобы не позволить ему запускать ETCD.
systemctl stop kubelet
- Остановите и удалите контейнер
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}
-
Создайте резервную копию.
-
Удалите старые файлы из директории
/var/lib/etcd
rm -rf /var/lib/etcd/*
- Подготовьте БД из снимка:
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 и будет использоваться в качестве хранения файлов БД.
- Проверьте и по необходимости отредактируйте параметры запуска 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
будут игнорироваться.
В нашем случае, мы уже восстановили файлы БД и внесли метаданные на этапе подготовки БД из снимка.
-
Выполните аналогичные действия на остальных узлах ETCD кластера.
-
Запустите kubelet:
systemctl start kubelet
- Проверьте состояние контейнера и наличие ошибок
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
-
Повторите этапы сбора пререквизитов и подключения к кластеру ETCD.
-
При помощи команд
member list
иendpoint status
описанных выше проверьте состояние кластера.
После выполнения работ на всех трех узлах ETCD кластера, кластер восстановлен и готов к работе.
5.1.5.8.2.3. Восстановление кластера при конфликтах или проблемах с кворумом
Данная необходимость может возникнуть в случаях:
I. При обновлении кластера появилось больше или меньше 3х управляющих узлов K8s кластера. II. Распался кворум ETCD кластера. III. Повреждены метаданные БД на одном или нескольких узлах ETCD кластера.
Инструкция
Для начала задайте переменные:
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
- Определите текущее количество узлов ETCD кластера.
- KubeAPI восстанавливаемого кластера
- kubeAPI инфра кластера
Если KubeAPI восстанавливаемого кластера доступно, тогда используйте этот вариант.
- Подключитесь к KubeAPI и введите команду:
kubectl get pod -n kube-system -l component=etcd -o wide
- Выберите под узла ETCD кластера из полученной таблицы, на основе которого вы будете восстан авливать кластер.
- Подключитесь к KubeAPI инфраструктурного кластера и введите команду:
kubectl get machine -n in-cloud-k8s-sandbox-test-csko-1
-l cluster.x-k8s.io/control-plane=
-o custom-columns=NAME:.metadata.name,ADDRESSES:status.addresses[0].address
- Выберите узел k8s кластера, с которого вы будете восстанавливать кластер.
-
Подключитесь к выбранному вам и узлу K8s кластера или узлу K8s кластера выбранного вами пода.
-
Cоберите все возможные пререквизиты для подключения к ETCD и K8s кластеру.
- ETCD кластер работает
- ETCD кластер не работает
- Если удается подключиться к ETCD кластеру, тогда создайте резервную копию и выполните восстановление кластера с дальнейшим подключением остальных узлов ETCD кластера.
-
Если подключение к ETCD кластеру невозможно, сделайте резервную копию файлов БД.
-
Откройте на редактирование файл
$/etc/kubernetes/manifests/etcd.yaml
. -
В параметрах запуска ETCD указанных в разделе
spec.containers[0].command
добавьте ключ:
--force-new-cluster
Здесь же измените параметр initial-cluster
так, чтобы в нем остался только текущий узел ETCD кластера.
--initial-cluster=in-cloud-k8s-sandbox-dev-csko-1-tcgzn-7plhz=https://10.10.10.3:2380
Таким образом, при следущем запуске ETCD будут удалены все текущие метаданные из файлов БД,
и туда будут записаны новые, указанные в разделе spec.containers[0].command
с суффиксом initial.
-
Дождитесь, когда пересозд астся под ETCD узла и проверьте его состояние.
-
В файле
$/etc/kubernetes/manifests/etcd.yaml
в параметрах запуска ETCD указанных в разделеspec.containers[0].command
удалите ключ:
--force-new-cluster
В противном случае, при каждом перезапуске пода/контейнера будут удаляться все метаданные из БД.
- Добавьте 2й и 3й узлы кластера ETCD как это указано в инструкции к
восстановлению с одного узла для
Master-2
иMaster-3
.
На этом восстановление кластера завершено.
TODO опиши как работает gardener etcd-backup (в режиме снапшотов)