Не удалось настроить кластер HA etcd - PullRequest
0 голосов
/ 27 февраля 2020

Я хочу настроить запуск кластера etcd на нескольких узлах. У меня работает 2 машины unbuntu 18.04, работающие на терминале Hyper-V.

Я следовал этому руководству на официальном сайте kubernetes: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm/

Поэтому я изменил несколько сценариев и выполнили эти сценарии на HOST0 и HOST1

export HOST0=192.168.101.90
export HOST1=192.168.101.91

mkdir -p /tmp/${HOST0}/ /tmp/${HOST1}/


ETCDHOSTS=(${HOST0} ${HOST1} ${HOST2})
NAMES=("infra0" "infra1")

for i in "${!ETCDHOSTS[@]}"; do
HOST=${ETCDHOSTS[$i]}
NAME=${NAMES[$i]}
cat << EOF > /tmp/${HOST}/kubeadmcfg.yaml
apiVersion: "kubeadm.k8s.io/v1beta2"
kind: ClusterConfiguration
etcd:
    local:
        serverCertSANs:
        - "${HOST}"
        peerCertSANs:
        - "${HOST}"
        extraArgs:
            initial-cluster: ${NAMES[0]}=https://${ETCDHOSTS[0]}:2380,${NAMES[1]}=https://${ETCDHOSTS[1]}:2380
            initial-cluster-state: new
            name: ${NAME}
            listen-peer-urls: https://${HOST}:2380
            listen-client-urls: https://${HOST}:2379
            advertise-client-urls: https://${HOST}:2379
            initial-advertise-peer-urls: https://${HOST}:2380
EOF
done

После этого я выполнил эту команду на HOST0

kubeadm init phase certs etcd-ca

Я создал все необходимые файлы на HOST0

# cleanup non-reusable certificates
find /etc/kubernetes/pki -not -name ca.crt -not -name ca.k
kubeadm init phase certs etcd-peer --config=/tmp/${HOST1}/kubeadmcfg.yaml
kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST1}/kubeadmcfg.yaml
kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST1}/kubeadmcfg.yaml
cp -R /etc/kubernetes/pki /tmp/${HOST1}/
find /etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -delete


kubeadm init phase certs etcd-server --config=/tmp/${HOST0}/kubeadmcfg.yaml
kubeadm init phase certs etcd-peer --config=/tmp/${HOST0}/kubeadmcfg.yaml
kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST0}/kubeadmcfg.yaml
kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST0}/kubeadmcfg.yaml
# No need to move the certs because they are for HOST0

# clean up certs that should not be copied off this host
find /tmp/${HOST1} -name ca.key -type f -delete

После этого я скопировал файлы на второй узел ETCTD (HOST1). До этого я создал root user mbesystem

USER=mbesystem
 HOST=${HOST1}
 scp -r /tmp/${HOST}/* ${USER}@${HOST}:
 ssh ${USER}@${HOST}
 USER@HOST $ sudo -Es
 root@HOST $ chown -R root:root pki
 root@HOST $ mv pki /etc/kubernetes/

Я проверю все файлы, которые были там на HOST0 и HOST1.

На HOST0 я запустил кластер etcd, используя:

kubeadm init phase etcd local --config=/tmp/192.168.101.90/kubeadmcfg.yaml

На Host1 я начал использовать:

kubeadm init phase etcd local --config=/home/mbesystem/kubeadmcfg.yaml

После того, как я выполнил:

docker run --rm -it \
--net host \
-v /etc/kubernetes:/etc/kubernetes k8s.gcr.io/etcd:3.4.3-0 etcdctl \
--cert /etc/kubernetes/pki/etcd/peer.crt \
--key /etc/kubernetes/pki/etcd/peer.key \
--cacert /etc/kubernetes/pki/etcd/ca.crt \
--endpoints https://192.168.101.90:2379 endpoint health --cluster

Я обнаружил, что мой кластер не здоров, я получил отказ в соединении .

enter image description here

Я не могу понять, что пошло не так. Любая помощь будет оценена.

1 Ответ

0 голосов
/ 03 марта 2020

Я посмотрел на него, воспроизвел то, что было в ссылке, которую вы предоставили: Kubernetes.io: Настройте etcd с kubeadm и сумел заставить его работать.

Вот некоторые пояснения / шаги по устранению неполадок / советы и др. c.

Прежде всего etcd должен быть настроен с нечетным числом узлов. Я имею в виду, что он должен быть создан как кластер из 3 или 5 узлов.

Почему нечетное число членов кластера?

Для кластера etcd требуется большинство узлов, кворум, для согласования обновлений состояния кластера. Для кластера с n членами кворум равен (n / 2) +1. Для любого кластера нечетного размера добавление одного узла всегда увеличивает количество узлов, необходимых для кворума. Хотя добавление узла в кластер нечетного размера выглядит лучше, поскольку имеется больше машин, отказоустойчивость хуже, поскольку точно такое же количество узлов может выйти из строя без потери кворума, но есть больше узлов, которые могут выйти из строя. Если кластер находится в состоянии, в котором он не может больше терпеть сбоев, добавление узла перед удалением узлов опасно, поскольку если новый узел не сможет зарегистрироваться в кластере (например, неверно настроен адрес), кворум будет окончательно потерян .

- Github.com: документация etcd


Дополнительно приведены некоторые действия по устранению неполадок:

  • Проверьте, работает ли docker Вы можете проверить это, выполнив команду (на ОС, установленной systemd): $ systemctl show --property ActiveState docker
  • Проверьте, работает ли контейнер etcd с $ sudo docker ps
  • Проверка журналов контейнера etcd, если он работает с: $ sudo docker logs ID_OF_CONTAINER

Как мне удалось заставить его работать :

Предполагается, что 2 сервера Ubuntu 18.04 имеют IP-адреса:

  • 10.156.0.15 и имя: etcd-1
  • 10.156.0.16 и имя: etcd-2

Дополнительно:

  • S SH ключи настроены для root доступа
  • DNS reso lution работает для обеих машин ($ ping etcd-1)

Шаги:

  • Предварительная настройка перед официальным руководством.

    Я выполнил все перечисленные ниже настройки с использованием учетной записи root

  • Настройте kubelet для управления службами для etcd.
  • Создание файлов конфигурации для kubeadm.
  • Создание центра сертификации.
  • Создание сертификатов для каждого члена
  • Копирование сертификатов и конфигураций kubeadm.
  • Создание манифестов модуля stati c .
  • Проверьте работоспособность кластера.

Предварительная настройка перед официальным руководством

Предварительная настройка этих машин была выполнена с помощью этого сообщения StackOverflow с Ansible playbooks: Stackoverflow.com: 3 кластера kubernetes 1 база на локальном компьютере

Вы также можете следовать официальной документации: Kubernetes.io: установить kubeadm

Настройте kubelet для обслуживания nager for etcd.

Запустите команды ниже на etcd-1 и etcd-2 с учетной записью root.

cat << EOF > /etc/systemd/system/kubelet.service.d/20-etcd-service-manager.conf
[Service]
ExecStart=
#  Replace "systemd" with the cgroup driver of your container runtime. The default value in the kubelet is "cgroupfs".
ExecStart=/usr/bin/kubelet --address=127.0.0.1 --pod-manifest-path=/etc/kubernetes/manifests --cgroup-driver=systemd
Restart=always
EOF

$ systemctl daemon-reload

$ systemctl restart kubelet

Создание файлов конфигурации для kubeadm.

Создание файла конфигурации на вашем etcd-1 node.

Вот модифицированный скрипт, который создаст kubeadmcfg.yaml только для 2 узлов:

export HOST0=10.156.0.15
export HOST1=10.156.0.16

# Create temp directories to store files that will end up on other hosts.
mkdir -p /tmp/${HOST0}/ /tmp/${HOST1}/

ETCDHOSTS=(${HOST0} ${HOST1})
NAMES=("etcd-1" "etcd-2")

for i in "${!ETCDHOSTS[@]}"; do
HOST=${ETCDHOSTS[$i]}
NAME=${NAMES[$i]}
cat << EOF > /tmp/${HOST}/kubeadmcfg.yaml
apiVersion: "kubeadm.k8s.io/v1beta2"
kind: ClusterConfiguration
etcd:
    local:
        serverCertSANs:
        - "${HOST}"
        peerCertSANs:
        - "${HOST}"
        extraArgs:
            initial-cluster: ${NAMES[0]}=https://${ETCDHOSTS[0]}:2380,${NAMES[1]}=https://${ETCDHOSTS[1]}:2380
            initial-cluster-state: new
            name: ${NAME}
            listen-peer-urls: https://${HOST}:2380
            listen-client-urls: https://${HOST}:2379
            advertise-client-urls: https://${HOST}:2379
            initial-advertise-peer-urls: https://${HOST}:2380
EOF
done

Обратите особое внимание на:

  • export HOSTX в верхней части скрипта. Вставьте туда IP-адреса своих машин.
  • NAMES=("etcd-1" "etcd-2"). Вставьте туда имена ваших машин (имя хоста).

Запустите этот скрипт из учетной записи root и проверьте, не были ли созданы файлы в каталоге /tmp/IP_ADDRESS.

Создание центра сертификации

Запустите команду ниже из root учетной записи на вашем etcd-1 узле:

$ kubeadm init phase certs etcd-ca

Создайте сертификаты для каждого член

Ниже приведена часть скрипта, которая отвечает за создание сертификатов для каждого члена кластера etcd. Пожалуйста, измените переменные HOST0 и HOST1.

#!/bin/bash
HOST0=10.156.0.15
HOST1=10.156.0.16

kubeadm init phase certs etcd-server --config=/tmp/${HOST1}/kubeadmcfg.yaml
kubeadm init phase certs etcd-peer --config=/tmp/${HOST1}/kubeadmcfg.yaml
kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST1}/kubeadmcfg.yaml
kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST1}/kubeadmcfg.yaml
cp -R /etc/kubernetes/pki /tmp/${HOST1}/
find /etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -delete

kubeadm init phase certs etcd-server --config=/tmp/${HOST0}/kubeadmcfg.yaml
kubeadm init phase certs etcd-peer --config=/tmp/${HOST0}/kubeadmcfg.yaml
kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST0}/kubeadmcfg.yaml
kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST0}/kubeadmcfg.yaml
# No need to move the certs because they are for HOST0

Запустите указанный выше сценарий из учетной записи root и проверьте, есть ли каталог pki внутри /tmp/10.156.0.16/.

Внутри /tmp/10.156.0.15/ не должно быть каталога pki, поскольку он уже есть.

Копирование сертификатов и конфигураций kubeadm.

Скопируйте kubeadmcfg.yaml из etcd-1 из /tmp/10.156.0.15 в root каталог с: $ mv /tmp/10.156.0.15/kubeadmcfg.yaml /root/

Скопируйте содержимое /tmp/10.156.0.16 с вашего etcd-1 на ваш etcd-2 узел в /root/ каталог:

$ scp -r /tmp/10.156.0.16/* root@10.156.0.16:

После этого проверьте, правильно ли скопированы файлы, имеют правильные разрешения и скопируйте папку pki в /etc/kubernetes/ с командой etcd-2:

$ mv /root/pki /etc/kubernetes/

Создайте манифесты стати c.

Запустите команду ниже etcd-1 и etcd-2:

$ kubeadm init phase etcd local --config=/root/kubeadmcfg.yaml

Все должно быть запущено.

Проверка работоспособности кластера.

Выполните команду ниже для проверки работоспособности кластера на etcd-1.

docker run --rm -it --net host -v /etc/kubernetes:/etc/kubernetes k8s.gcr.io/etcd:3.4.3-0 etcdctl --cert /etc/kubernetes/pki/etcd/peer.crt --key /etc/kubernetes/pki/etcd/peer.key --cacert /etc/kubernetes/pki/etcd/ca.crt --endpoints https://10.156.0.15:2379 endpoint health --cluster

Изменить: --endpoints https://10.156.0.15:2379 с правильным IP-адресом etcd-1

Должно появиться сообщение, подобное этому:

https://10.156.0.15:2379 is healthy: successfully committed proposal: took = 26.308693ms
https://10.156.0.16:2379 is healthy: successfully committed proposal: took = 26.614373ms

Выше В сообщении делается вывод, что etcd работает правильно, но имейте в виду четное количество узлов.

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

...