Тщательно изучите серию статей etcd (3): как развернуть кластеры etcd

облачный носитель etcd
Тщательно изучите серию статей etcd (3): как развернуть кластеры etcd

0 Обзор альбома

etcd является важным базовым компонентом облачной архитектуры, которая инкубируется и размещается CNCF. etcd можно использовать не только для регистрации и обнаружения сервисов в микросервисах и кластерах Kubernetes, но и как промежуточное ПО для хранения ключей и значений.

"Понимание статей серии etcd" познакомит с etcd с точки зрения базовой функциональной практики etcd, интерфейса API, принципа реализации, анализа исходного кода и опыта преодоления ям в реализации. Ожидается, что будет около 20 статей, автор будет обновлять каждую неделю, прошу обратить внимание.

1 развертывание кластера etcd

В производственной среде для обеспечения высокой доступности всего кластера etcd обычно развертывается в кластере, чтобы избежать единой точки отказа. В этом разделе рассказывается, как развернуть кластер etcd. Существует три механизма начальной загрузки кластера etcd:

  • статический
  • динамическое обнаружение etcd
  • Обнаружение DNS

Статический запуск кластера etcd требует, чтобы каждый член знал о других членах в кластере. Во многих случаях IP-адреса членов кластера могут быть неизвестны заранее. В этих случаях кластер etcd можно загрузить с помощью службы обнаружения.

Ниже мы представим эти методы отдельно.

2 Статически запустить кластер etcd

Автономная установка

Если вы хотите попрактиковаться в построении кластера etcd на одной машине, вы можете использовать инструмент goreman.

goreman — инструмент управления несколькими процессами, написанный на языке Go, который представляет собой переписанный под Ruby широко используемый foreman (первоначальный автор foreman также реализовал Go-версию: forego, но он не так прост в использовании, как goreman).

Нам нужно подтвердить среду установки Go, а затем выполнить напрямую:

go get github.com/mattn/goreman

Скомпилированный файл помещается в$GOPATH/binсередина,$GOPATH/binКаталог добавлен в систему$PATH, поэтому мы можем легко выполнить командуgoremanЗаказ. Далее нужно написать скрипт Procfile, запускаем три etcd, конкретное соответствие следующее:

HostName ip Порт взаимодействия с клиентом одноранговый коммуникационный порт
infra1 127.0.0.1 12379 12380
infra2 127.0.0.1 22379 22380
infra3 127.0.0.1 32379 32380

Сценарий Procfile выглядит следующим образом:

etcd1: etcd --name infra1 --listen-client-urls http://127.0.0.1:12379 --advertise-client-urls http://127.0.0.1:12379 --listen-peer-urls http://127.0.0.1:12380 --initial-advertise-peer-urls http://127.0.0.1:12380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof --logger=zap --log-outputs=stderr
etcd2: etcd --name infra2 --listen-client-urls http://127.0.0.1:22379 --advertise-client-urls http://127.0.0.1:22379 --listen-peer-urls http://127.0.0.1:22380 --initial-advertise-peer-urls http://127.0.0.1:22380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof --logger=zap --log-outputs=stderr
etcd3: etcd --name infra3 --listen-client-urls http://127.0.0.1:32379 --advertise-client-urls http://127.0.0.1:32379 --listen-peer-urls http://127.0.0.1:32380 --initial-advertise-peer-urls http://127.0.0.1:32380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof --logger=zap --log-outputs=stderr

Описание элемента конфигурации:

  • --name: Имя узла в кластере etcd, которое может быть произвольным, различимым и не повторяющимся.
  • --listen-peer-urls: отслеживаемые URL-адреса для связи между узлами, которые можно отслеживать для нескольких, и кластер будет использовать эти URL-адреса для взаимодействия с данными (например, выборы, синхронизация данных и т. д.)
  • --initial-advertise-peer-urls: предлагаемые URL-адреса для связи между узлами, которые будут использоваться для связи между узлами.
  • --listen-client-urls: отслеживаемые URL-адреса для связи с клиентом, а также могут отслеживать несколько.
  • --advertise-client-urls: рекомендуемые URL-адреса для связи с клиентом. Это значение используется агентами etcd или членами etcd для связи с узлами etcd.
  • --initial-cluster-token: etcd-cluster-1, значение токена узла. После установки этого значения кластер будет генерировать уникальный идентификатор, а также уникальный идентификатор будет генерироваться для каждого узла. При использовании одного и того же файл конфигурации, чтобы снова запустить кластер. Пока значения токенов разные, кластеры etcd не будут влиять друг на друга.
  • --initial-cluster: коллекция всех начальных-рекламных-равных-адресов в кластере.
  • --initial-cluster-state: new, флаг нового кластера

Обратите внимание на приведенный выше сценарий, команду etcd необходимо настроить в соответствии с фактическим локальным адресом установки при выполнении команды etcd. Далее мы запускаем кластер etcd.

goreman -f /opt/procfile start

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

$ etcdctl --endpoints=http://localhost:22379  member list

8211f1d0f64f3269, started, infra1, http://127.0.0.1:12380, http://127.0.0.1:12379, false
91bc3c398fb3c146, started, infra2, http://127.0.0.1:22380, http://127.0.0.1:22379, false
fd422379fda50e48, started, infra3, http://127.0.0.1:32380, http://127.0.0.1:32379, false

Мы успешно построили псевдокластер на одной машине.Следует отметить, что при запуске кластера мы указываем членов кластера статическим образом.В реальной среде ip членов кластера может быть неизвестен заранее, авансом. В настоящее время необходимо принять механизм динамического обнаружения.

докер запускает кластер

etcd использует gcr.io/etcd-development/etcd в качестве основного ускорителя для контейнеров и quay.io/coreos/etcd в качестве вторичного ускорителя. К сожалению, мы не можем получить доступ к этим двум ускорителям, если вы не можете их скачать, вы можете использовать адрес, предоставленный автором:

docker pull bitnami/etcd:3.4.7

Затем повторно пометьте извлеченное изображение:

docker image tag bitnami/etcd:3.4.7 quay.io/coreos/etcd:3.4.7

После настройки зеркала запускаем кластер etcd из 3-х нод, и команда скрипта такая:

REGISTRY=quay.io/coreos/etcd

# For each machine
ETCD_VERSION=3.4.7
TOKEN=my-etcd-token
CLUSTER_STATE=new
NAME_1=etcd-node-0
NAME_2=etcd-node-1
NAME_3=etcd-node-2
HOST_1= 192.168.202.128
HOST_2= 192.168.202.129
HOST_3= 192.168.202.130
CLUSTER=${NAME_1}=http://${HOST_1}:2380,${NAME_2}=http://${HOST_2}:2380,${NAME_3}=http://${HOST_3}:2380
DATA_DIR=/var/lib/etcd

# For node 1
THIS_NAME=${NAME_1}
THIS_IP=${HOST_1}
docker run \
  -p 2379:2379 \
  -p 2380:2380 \
  --volume=${DATA_DIR}:/etcd-data \
  --name etcd ${REGISTRY}:${ETCD_VERSION} \
  /usr/local/bin/etcd \
  --data-dir=/etcd-data --name ${THIS_NAME} \
  --initial-advertise-peer-urls http://${THIS_IP}:2380 --listen-peer-urls http://0.0.0.0:2380 \
  --advertise-client-urls http://${THIS_IP}:2379 --listen-client-urls http://0.0.0.0:2379 \
  --initial-cluster ${CLUSTER} \
  --initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}

# For node 2
THIS_NAME=${NAME_2}
THIS_IP=${HOST_2}
docker run \
  -p 2379:2379 \
  -p 2380:2380 \
  --volume=${DATA_DIR}:/etcd-data \
  --name etcd ${REGISTRY}:${ETCD_VERSION} \
  /usr/local/bin/etcd \
  --data-dir=/etcd-data --name ${THIS_NAME} \
  --initial-advertise-peer-urls http://${THIS_IP}:2380 --listen-peer-urls http://0.0.0.0:2380 \
  --advertise-client-urls http://${THIS_IP}:2379 --listen-client-urls http://0.0.0.0:2379 \
  --initial-cluster ${CLUSTER} \
  --initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}

# For node 3
THIS_NAME=${NAME_3}
THIS_IP=${HOST_3}
docker run \
  -p 2379:2379 \
  -p 2380:2380 \
  --volume=${DATA_DIR}:/etcd-data \
  --name etcd ${REGISTRY}:${ETCD_VERSION} \
  /usr/local/bin/etcd \
  --data-dir=/etcd-data --name ${THIS_NAME} \
  --initial-advertise-peer-urls http://${THIS_IP}:2380 --listen-peer-urls http://0.0.0.0:2380 \
  --advertise-client-urls http://${THIS_IP}:2379 --listen-client-urls http://0.0.0.0:2379 \
  --initial-cluster ${CLUSTER} \
  --initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}

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

docker exec etcd /bin/sh -c "export ETCDCTL_API=3 && /usr/local/bin/etcdctl put foo bar"

Метод установки докера относительно прост, и читатели могут настроить некоторые конфигурации в соответствии со своими потребностями.

3 Динамическое обнаружение для запуска кластера etcd

Как упоминалось ранее, в реальной среде IP-адреса членов кластера могут быть неизвестны заранее. В этом случае кластер etcd должен быть загружен с помощью автоматического обнаружения вместо указания статической конфигурации, процесса, называемогоОбнаружить. Запускаем три etcd, которые соответствуют следующему:

HostName ip Порт взаимодействия с клиентом одноранговый коммуникационный порт
etcd1 192.168.202.128 2379 2380
etcd2 192.168.202.129 2379 2380
etcd3 192.168.202.130 2379 2380

Принципы соглашения

Протокол службы обнаружения помогает новым членам etcd обнаруживать всех других участников на этапе начальной загрузки кластера с помощью общего URL-адреса.

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

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

Протокол обнаружения использует внутренний кластер etcd для координации начальной загрузки новых кластеров. Во-первых, все новые участники взаимодействуют со службой обнаружения и помогают сформировать ожидаемый список участников. После этого каждый новый участник загружает свой сервер, используя этот список, который выполняет те же действия.--initial-clusterПомечает ту же функцию, то есть устанавливает информацию о членах всех кластеров.

Получить токен открытия

Создайте уникальный токен, который будет идентифицировать новый кластер. В следующих шагах он будет использоваться как уникальный префикс в пространстве ключей обнаружения. Простой способ - использовать uuidgen:

UUID=$(uuidgen)

Укажите размер кластера

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

curl -X PUT http://10.0.10.10:2379/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83/_config/size -d value=3

Нам нужно указать URL-адресhttp://10.0.10.10:2379/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83так как--discoveryпараметры для запуска etcd.

узел будет автоматически использоватьhttp://10.0.10.10:2379/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83Каталог сервисов регистрации и обнаружения etcd.

служба публичного обнаружения

Когда локального кластера etcd нет, официальный веб-сайт etcd предоставляет адрес хранилища etcd, к которому можно получить доступ из общедоступной сети. Мы можем получить каталог сервиса etcd с помощью следующей команды и использовать его как--discoveryиспользование параметра.

служба публичного обнаруженияdiscovery.etcd.ioРаботает так же, но с уровнем очистки, который извлекает уродливые URL-адреса, автоматически генерирует UUID и обеспечивает защиту от чрезмерных запросов. Служба публичного обнаружения по-прежнему использует кластер etcd в качестве хранилища данных.

$ curl http://discovery.etcd.io/new?size=3

http://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de

Запустите кластер с динамическим обнаружением

В режиме EtCD Discovery команда для начала ETCD выглядит следующим образом:

# etcd1 启动
$ /opt/etcd/bin/etcd  --name etcd1 --initial-advertise-peer-urls http://192.168.202.128:2380 \
  --listen-peer-urls http://192.168.202.128:2380 \
  --data-dir /opt/etcd/data \
  --listen-client-urls http://192.168.202.128:2379,http://127.0.0.1:2379 \
  --advertise-client-urls http://192.168.202.128:2379 \
  --discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de

# etcd2 启动
 /opt/etcd/bin/etcd  --name etcd2 --initial-advertise-peer-urls http://192.168.202.129:2380 \
  --listen-peer-urls http://192.168.202.129:2380 \
  --data-dir /opt/etcd/data \
  --listen-client-urls http://192.168.202.129:2379,http://127.0.0.1:2379 \
  --advertise-client-urls http://192.168.202.129:2379 \
  --discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de

# etcd3 启动
 /opt/etcd/bin/etcd  --name etcd3 --initial-advertise-peer-urls http://192.168.202.130:2380 \
    --listen-peer-urls http://192.168.202.130:2380 \
    --data-dir /opt/etcd/data \
    --listen-client-urls http://192.168.202.130:2379,http://127.0.0.1:2379 \
    --advertise-client-urls http://192.168.202.130:2379 \
    --discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de

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

Проверка результата

После запуска кластера для проверки посмотрим на членов кластера:

$ /opt/etcd/bin/etcdctl member list
# 结果如下
    40e2ac06ca1674a7, started, etcd3, http://192.168.202.130:2380, http://192.168.202.130:2379, false
    c532c5cedfe84d3c, started, etcd1, http://192.168.202.128:2380, http://192.168.202.128:2379, false
    db75d3022049742a, started, etcd2, http://192.168.202.129:2380, http://192.168.202.129:2379, false

Результаты соответствуют ожиданиям, а затем посмотрите на состояние работоспособности узла:

$ /opt/etcd/bin/etcdctl  --endpoints="http://192.168.202.128:2379,http://192.168.202.129:2379,http://192.168.202.130:2379"  endpoint  health
# 结果如下
    http://192.168.202.128:2379 is healthy: successfully committed proposal: took = 3.157068ms
    http://192.168.202.130:2379 is healthy: successfully committed proposal: took = 3.300984ms
    http://192.168.202.129:2379 is healthy: successfully committed proposal: took = 3.263923ms

Как видите, три узла в кластере находятся в исправном и нормальном состоянии. Кластер успешно запущен в режиме динамического обнаружения.

4 Режим самообнаружения DNS

etcd также поддерживает загрузку с записями DNS SRV. На самом деле это реализуется путем непрерывного опроса и запроса записей SRV DNS. DNS SRV — это тип ресурсной записи, поддерживаемой в базе данных DNS, которая записывает соответствие между компьютерами и информацию о предоставляемых ими услугах.

4.1 Установка DNSmasq

Здесь мы используем Dnsmasq для создания службы DNS. Dnsmasq предоставляет кэш DNS и службу DHCP, функции службы Tftp. В качестве DNS-сервера Dnsmasq может повысить скорость подключения к посещаемым URL-адресам за счет кэширования DNS-запросов. Dnsmasq легкий и простой в настройке, подходит для отдельных пользователей или сетей с менее чем 50 хостами. Он также поставляется с сервером PXE.

При получении DNS-запроса Dnsmasq сначала просматривает файл /etc/hosts, а затем ищет внешний DNS, определенный в /etc/resolv.conf. Настройте Dnsmasq в качестве кэш-сервера DNS и добавьте разрешение локальной интрасети в файл /etc/hosts, чтобы файл hosts запрашивался первым при запросе машины интрасети, что эквивалентно совместному использованию /etc/hosts со всеми машинами интрасети. ., чтобы решить проблему идентификации компьютеров интрасети друг друга. Вместо редактирования файла hosts для каждой машины или добавления записей Bind DNS вы можете редактировать только один файл hosts.

Основываясь на хосте Centos 7, используемом автором, сначала установите Dnsmasq:

yum install dnsmasq

После установки настройте его, вся настройка делается в одном файле /etc/dnsmasq.conf. Мы также можем писать файлы конфигурации с произвольными именами в /etc/dnsmasq.d.

Настройте адрес вышестоящего сервера

resolv-file настраивает дополнительные вышестоящие DNS-серверы для Dnsmasq. Если этот параметр не включен, будет использоваться сервер имен из файла /etc/resolv.conf хоста Linux по умолчанию.

$ vim /etc/dnsmasq.conf

# 增加如下的内容:
resolv-file=/etc/resolv.dnsmasq.conf
srv-host=_etcd-server._tcp.blueskykong.com,etcd1.blueskykong.com,2380,0,100
srv-host=_etcd-server._tcp.blueskykong.com,etcd2.blueskykong.com,2380,0,100
srv-host=_etcd-server._tcp.blueskykong.com,etcd3.blueskykong.com,2380,0,100

Соответствующие записи доменных имен в dnsmasq.conf настраивают три задействованных нами сервера, соответствующие etcd1, etcd2 и etcd3 соответственно.

Добавить адрес перенаправления DNS в указанный файл
$ vim /etc/resolv.dnsmasq.conf

nameserver 8.8.8.8
nameserver 8.8.4.4

Вы должны быть знакомы с этими двумя бесплатными службами DNS. Считыватели могут конфигурироваться в соответствии с фактической локальной сетью.

Включить парсинг Dnsmasq локально
$ vim /etc/resolv.conf

nameserver 127.0.0.1

Настройте синтаксический анализ Dnsmasq локально, что легко понять.

Добавить записи парсинга

Настройте соответствующие записи A для каждого доменного имени, чтобы они указывали на IP-адрес машины, соответствующий основному узлу etcd. Есть три способа добавить записи разрешения: использовать системные хосты по умолчанию, использовать пользовательский файл hosts и использовать пользовательский файл conf. Здесь мы используем более простой первый метод.

$ vim /etc/hosts

# 增加如下的内容解析
192.168.202.128 etcd1.blueskykong.com
192.168.202.129 etcd2.blueskykong.com
192.168.202.130 etcd3.blueskykong.com

запустить службу

service dnsmasq start

После запуска проверяем:

  • Запрос записи SRV на DNS-сервере, результаты запроса следующие:

    $ dig @192.168.202.128 +noall +answer SRV _etcd-server._tcp.blueskykong.com
    
    _etcd-server._tcp.blueskykong.com. 0 IN SRV     0 100 2380 etcd2.blueskykong.com.
    _etcd-server._tcp.blueskykong.com. 0 IN SRV     0 100 2380 etcd1.blueskykong.com.
    _etcd-server._tcp.blueskykong.com. 0 IN SRV     0 100 2380 etcd3.blueskykong.com.
    
  • Сделать запрос результатов разрешения доменного имени

    $ dig @192.168.202.128 +noall +answer etcd1.blueskykong.com etcd2.blueskykong.com etcd3.blueskykong.com
    
    etcd1.blueskykong.com.  0       IN      A       192.168.202.128
    etcd2.blueskykong.com.  0       IN      A       192.168.202.129
    etcd3.blueskykong.com.  0       IN      A       192.168.202.130
    

На данный момент мы успешно установили Dnsmasq. Ниже мы запускаем кластер etcd на основе обнаружения DNS.

запустить кластер

После завершения описанной выше двухэтапной настройки DNS вы можете использовать DNS для запуска кластера etcd. Конфигурацию ETCD_INITIAL_CLUSTER (для обнаружения статического сервиса) необходимо удалить и указать доменное имя DNS SRV (ETCD_DISCOVERY_SRV). Параметр URL для настройки разрешения DNS:-discovery-srv, где команда запуска узла etcd1 выглядит следующим образом:

$ /opt/etcd/bin/etcd   --name etcd1 \
--discovery-srv blueskykong.com \
--initial-advertise-peer-urls http://etcd1.blueskykong.com:2380 \
--initial-cluster-token etcd-cluster-1 \
--data-dir /opt/etcd/data \
--initial-cluster-state new \
--advertise-client-urls http://etcd1.blueskykong.com:2379 \
--listen-client-urls http://0.0.0.0:2379 \
--listen-peer-urls http://0.0.0.0:2380

Члены кластера etcd могут осуществлять широковещательную рассылку, используя доменные имена или IP-адреса, и инициированный процесс разрешает записи DNS. Разрешенные адреса в --initial-advertise-peer-urls должны совпадать с разрешенными адресами в цели SRV. Члены etcd читают разрешенный адрес, чтобы узнать, принадлежит ли он кластеру, определенному в записи SRV.

Проверяем правильность запуска кластера на основе DNS discovery и просматриваем список участников кластера:

$ /opt/etcd/bin/etcdctl member list

# 结果如下:
40e2ac06ca1674a7, started, etcd3, http://192.168.202.130:2380, http://etcd3.blueskykong.com:2379, false
c532c5cedfe84d3c, started, etcd1, http://192.168.202.128:2380, http://etcd1.blueskykong.com:2379, false
db75d3022049742a, started, etcd2, http://192.168.202.129:2380, http://etcd2.blueskykong.com:2379, false

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

$ /opt/etcd/bin/etcdctl  --endpoints="http://192.168.202.128:2379,http://192.168.202.129:2379,http://192.168.202.130:2379"  endpoint  health

# 结果如下:
http://192.168.202.129:2379 is healthy: successfully committed proposal: took = 2.933555ms
http://192.168.202.128:2379 is healthy: successfully committed proposal: took = 7.252799ms
http://192.168.202.130:2379 is healthy: successfully committed proposal: took = 7.415843ms

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

5 Резюме

Эта статья дополняет предыдущую статью об установке etcd на одной машине и в основном знакомит с различными методами установки и запуска кластеров etcd: статический мономер, статический докер, динамическое обнаружение и методы запуска обнаружения DNS. Так много установочных положений предназначены для нашего фактического использования, и в следующей статье мы специально рассмотрим использование etcdctl.

Подписывайтесь на свежие статьи, приглашаю обратить внимание на мой публичный номер

Рекомендуемое чтение

  1. Сравнение etcd с другими компонентами k-v, такими как Zookeeper и Consul
  2. Тщательно изучите серию статей etcd (1): первое знакомство с etcd
  3. Тщательно изучите серию статей etcd (2): различные позы установки etcd

Ссылаться на

etcd docs