Я посмотрел на него, воспроизвел то, что было в ссылке, которую вы предоставили: 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
)
Шаги:
Предварительная настройка перед официальным руководством
Предварительная настройка этих машин была выполнена с помощью этого сообщения 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 работает правильно, но имейте в виду четное количество узлов.
Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы к этому.