Configure o cluster Etcd no CentOS/Ubuntu/Debian/Fedora
Bem-vindo ao nosso guia sobre como configurar o etcd Cluster em máquinas CentOS/Ubuntu/Debian/Fedora Linux. Este tutorial entrará em detalhes ao discutir a configuração ideal de um cluster etcd de três nós em uma caixa Linux - Este pode ser um cluster Etcd no Ubuntu/Debian/CentOS/Fedora/Arch/Linux Mint ou outro distribuição Linux moderna.
etcd é um armazenamento de valores-chave distribuído e confiável para os dados mais críticos de um sistema distribuído. Ele foi escrito em Go e usa o algoritmo de consenso Raft para gerenciar um log replicado altamente disponível.
O Etcd foi projetado para ser:
- Simples: API bem definida voltada para o usuário (gRPC)
- Seguro: TLS automático com autenticação de certificado de cliente opcional
- Rápido: comparação de 10.000 gravações/s
- Confiável: distribuído corretamente usando Raft
Configurar cluster Etcd CentOS/Ubuntu/Debian/Fedora Linux
Esta configuração deve funcionar em todas as distribuições Linux que usam o gerenciador de serviços systemd.
Esta configuração é baseada nas informações e detalhes da rede do servidor abaixo.
Como todos os meus servidores usam o gerenciador de serviços Systemd, os nomes de host podem ser definidos usando os comandos.
# Node 1
sudo hostnamectl set-hostname etcd1.mydomain.com --static
# Node 2
sudo hostnamectl set-hostname etcd2.mydomain.com --static
# Node 3
sudo hostnamectl set-hostname etcd3.mydomain.com --static
Substitua meudominio.com
pelo nome de domínio dos seus servidores. Os nomes dos servidores podem ser mapeados para endereços IP corretos em seu DNS local ou adicionando registros diretamente ao arquivo /etc/hosts em cada servidor.
$ sudo vim /etc/hosts
192.168.18.9 etcd1.mydomain.com etcd1
192.168.18.10 etcd2.mydomain.com etcd2
192.168.18.11 etcd3.mydomain.com etcd3
Etapa 1: Baixe e instale os binários etcd (todos os nós)
Faça login em cada nó do cluster etcd a ser usado e baixe os binários do etcd. Isso é feito em todos os nós.
Crie um diretório temporário.
mkdir /tmp/etcd && cd /tmp/etcd
Instale as ferramentas wget
e curl
:
# RHEL family
sudo yum -y install wget curl
# Debian family
sudo apt -y install wget curl
# Arch/Manjaro
sudo pacman -S wget curl
Remova todas as versões antigas do etcd:
rm -rf etcd*
Baixe o arquivo binário etcd.
curl -s https://api.github.com/repos/etcd-io/etcd/releases/latest \
| grep browser_download_url \
| grep linux-amd64 \
| cut -d '"' -f 4 \
| wget -i -
Desarquive o arquivo e mova os binários para o diretório /usr/local/bin.
tar xvf etcd-v*.tar.gz
cd etcd-*/
sudo mv etcd* /usr/local/bin/
cd ..
rm -rf etcd*
Verifique a versão do etcd e do etcdctl.
$ etcd --version
etcd Version: 3.5.2
Git SHA: 99018a77b
Go Version: go1.16.3
Go OS/Arch: linux/amd64
$ etcdctl version
etcdctl version: 3.5.2
API version: 3.5
$ etcdutl version
etcdutl version: 3.5.2
API version: 3.5
Etapa 2: Criar diretórios e usuários do etcd (todos os nós)
Armazenaremos os arquivos de configuração do etcd no diretório /etc/etcd e os dados em /var/lib/etcd. O usuário e grupo usado para gerenciar o serviço é chamado etcd.
Crie um usuário/grupo do sistema etcd
.
sudo groupadd --system etcd
sudo useradd -s /sbin/nologin --system -g etcd etcd
Em seguida, crie diretórios de dados e configurações para o etcd.
sudo mkdir -p /var/lib/etcd/
sudo mkdir /etc/etcd
sudo chown -R etcd:etcd /var/lib/etcd/
sudo chmod -R 700 /var/lib/etcd/
Etapa 3: configurar o etcd em todos os nós
Precisamos preencher os arquivos da unidade de serviço do systemd em todos os três servidores. Mas primeiro, algumas variáveis de ambiente são necessárias antes de prosseguirmos.
Identifique o nome da sua interface de rede ativa:
$ ip ad
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc fq_codel state UP group default qlen 1000
link/ether fa:16:3e:d9:f8:f0 brd ff:ff:ff:ff:ff:ff
inet 192.168.18.9/24 brd 192.168.18.255 scope global dynamic ens3
valid_lft 56972sec preferred_lft 56972sec
inet6 fe80::f816:3eff:fed9:f8f0/64 scope link
valid_lft forever preferred_lft forever
Pela minha saída, a interface de rede ativa com um endereço IP é ens3. O Etcd será configurado para rodar em seu endereço IP.
Execute em todos os servidores
Em cada servidor, salve essas variáveis executando os comandos abaixo.
#INT_NAME="eth0"
INT_NAME="ens3" #replace with your server interface name
ETCD_HOST_IP=$(ip addr show $INT_NAME | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)
ETCD_NAME=$(hostname -s)
Onde :
- INT_NAME é o nome da sua interface de rede a ser usada para tráfego de cluster. Altere-o para corresponder à configuração do seu servidor.
- ETCD_HOST_IP é o endereço IP interno da interface de rede especificada. Isso é usado para atender solicitações de clientes e comunicar-se com pares de cluster etcd.
- ETCD_NAME – Cada membro do etcd deve ter um nome exclusivo dentro de um cluster etcd. O comando usado definirá o nome do etcd para corresponder ao nome do host da instância de computação atual.
Verifique as variáveis para confirmar se elas têm valores corretos:
echo $INT_NAME
echo $ETCD_HOST_IP
echo $ETCD_NAME
Depois que todas as variáveis estiverem definidas, crie o arquivo de unidade etcd.service
systemd:
cat <<EOF | sudo tee /etc/systemd/system/etcd.service
[Unit]
Description=etcd service
Documentation=https://github.com/etcd-io/etcd
[Service]
Type=notify
User=etcd
ExecStart=/usr/local/bin/etcd \\
--name ${ETCD_NAME} \\
--data-dir=/var/lib/etcd \\
--initial-advertise-peer-urls http://${ETCD_HOST_IP}:2380 \\
--listen-peer-urls http://${ETCD_HOST_IP}:2380 \\
--listen-client-urls http://${ETCD_HOST_IP}:2379,http://127.0.0.1:2379 \\
--advertise-client-urls http://${ETCD_HOST_IP}:2379 \\
--initial-cluster-token etcd-cluster-0 \\
--initial-cluster etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380 \\
--initial-cluster-state new \
[Install]
WantedBy=multi-user.target
EOF
Se você não tiver uma resolução de nome funcional ou mapeamentos adicionados ao arquivo /etc/hosts, substitua etcd1, etcd2 e etcd3 com os endereços IP dos seus nós.
Para distribuições CentOS/RHEL Linux, defina o modo SELinux como permissivo.
sudo setenforce 0
sudo sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config
Se você tiver um serviço de firewall ativo, permita as portas 2379 e 2380.
# RHEL / CentOS / Fedora firewalld
sudo firewall-cmd --add-port={2379,2380}/tcp --permanent
sudo firewall-cmd --reload
# Ubuntu/Debian
sudo ufw allow proto tcp from any to any port 2379,2380
Etapa 4: inicie o servidor etcd
Inicie o serviço etcd executando os seguintes comandos em cada nó do cluster.
sudo systemctl daemon-reload
sudo systemctl enable etcd
sudo systemctl start etcd
Confirme se o serviço etcd está sendo executado em todos os nós.
[computingforgeeks@etcd1 ~]$ systemctl status etcd -l
● etcd.service - etcd service
Loaded: loaded (/etc/systemd/system/etcd.service; disabled; vendor preset: disabled)
Active: active (running) since Mon 2019-06-03 18:20:49 UTC; 30s ago
Docs: https://github.com/etcd-io/etcd
Main PID: 5931 (etcd)
CGroup: /system.slice/etcd.service
└─5931 /usr/local/bin/etcd --name etcd1 --data-dir=/var/lib/etcd --initial-advertise-peer-urls http://192.168.18.9:2380 --listen-peer-urls http://192.168.18.9:2380 --listen-client-urls http://192.168.18.9:2379,http://127.0.0.1:2379 --advertise-client-urls http://192.168.18.9:2379 --initial-cluster-token etcd-cluster-0 --initial-cluster etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380 --initial-cluster-state new
....................................................................................
[computingforgeeks@etcd2 ~]$ systemctl status etcd -l
● etcd.service - etcd service
Loaded: loaded (/etc/systemd/system/etcd.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2019-06-03 18:20:49 UTC; 2min 17s ago
Docs: https://github.com/etcd-io/etcd
Main PID: 5949 (etcd)
CGroup: /system.slice/etcd.service
└─5949 /usr/local/bin/etcd --name etcd2 --data-dir=/var/lib/etcd --initial-advertise-peer-urls http://192.168.18.10:2380 --listen-peer-urls http://192.168.18.10:2380 --listen-client-urls http://192.168.18.10:2379,http://127.0.0.1:2379 --advertise-client-urls http://192.168.18.10:2379 --initial-cluster-token etcd-cluster-0 --initial-cluster etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380 --initial-cluster-state new
....................................................................................
[computingforgeeks@etcd3 ~]$ systemctl status etcd -l
● etcd.service - etcd service
Loaded: loaded (/etc/systemd/system/etcd.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2019-06-03 18:20:49 UTC; 3min 20s ago
Docs: https://github.com/etcd-io/etcd
Main PID: 5974 (etcd)
CGroup: /system.slice/etcd.service
└─5974 /usr/local/bin/etcd --name etcd3 --data-dir=/var/lib/etcd --initial-advertise-peer-urls http://192.168.18.11:2380 --listen-peer-urls http://192.168.18.11:2380 --listen-client-urls http://192.168.18.11:2379,http://127.0.0.1:2379 --advertise-client-urls http://192.168.18.11:2379 --initial-cluster-token etcd-cluster-0 --initial-cluster etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380 --initial-cluster-state new
Etapa 5: testar a instalação do cluster Etcd
Teste sua configuração listando os membros do cluster etcd:
$ etcdctl member list
152d6f8123c6ac97: name=etcd3 peerURLs=http://etcd3:2380 clientURLs=http://192.168.18.11:2379 isLeader=false
332a8a315e569778: name=etcd2 peerURLs=http://etcd2:2380 clientURLs=http://192.168.18.10:2379 isLeader=false
aebb404b9385ccd4: name=etcd1 peerURLs=http://etcd1:2380 clientURLs=http://192.168.18.9:2379 isLeader=true
Para usar o etcd v3, você precisa especificar explicitamente a versão.
$ ETCDCTL_API=3 etcdctl member list
152d6f8123c6ac97, started, etcd3, http://etcd3:2380, http://192.168.18.11:2379
332a8a315e569778, started, etcd2, http://etcd2:2380, http://192.168.18.10:2379
aebb404b9385ccd4, started, etcd1, http://etcd1:2380, http://192.168.18.9:2379
Verifique também a integridade do cluster executando o comando:
$ etcdctl endpoint health
Vamos também tentar escrever no etcd.
$ etcdctl put /message "Hello World"
OK
$ etcdctl put foo "Hello World!"
OK
Leia o valor de message
de volta – deve funcionar em todos os nós.
$ etcdctl get /message
/message
Hello World
$ etcdctl get foo
foo
Hello World!
Passo 6 – Falha do Líder de Teste
Quando um líder falha, o cluster etcd elege automaticamente um novo líder. A eleição não acontece instantaneamente quando o líder falha. Demora cerca de um tempo limite de eleição para eleger um novo líder, uma vez que o modelo de detecção de falhas é baseado em tempo limite.
Durante a eleição do líder, o cluster não pode processar nenhuma gravação. As solicitações de gravação enviadas durante a eleição ficam na fila para processamento até que um novo líder seja eleito.
Nosso líder atual é etcd1 – Nó 1.
$ etcdctl member list
152d6f8123c6ac97: name=etcd3 peerURLs=http://etcd3:2380 clientURLs=http://192.168.18.11:2379 isLeader=false
332a8a315e569778: name=etcd2 peerURLs=http://etcd2:2380 clientURLs=http://192.168.18.10:2379 isLeader=false
aebb404b9385ccd4: name=etcd1 peerURLs=http://etcd1:2380 clientURLs=http://192.168.18.9:2379 isLeader=true
Vamos anotá-lo.
[computingforgeeks@etcd1 ~]$ sudo systemctl stop etcd
Verifique o novo Líder – Agora servidor etcd2.
$ etcdctl member list
152d6f8123c6ac97: name=etcd3 peerURLs=http://etcd3:2380 clientURLs=http://192.168.18.11:2379 isLeader=false
332a8a315e569778: name=etcd2 peerURLs=http://etcd2:2380 clientURLs=http://192.168.18.10:2379 isLeader=true
aebb404b9385ccd4: name=etcd1 peerURLs=http://etcd1:2380 clientURLs=http://192.168.18.9:2379 isLeader=false
Uma vez iniciado o serviço etcd1, o líder permanecerá etcd2 a menos que fique inativo.
Conclusão
Agora você tem um cluster Etcd funcional de três nós instalado no sistema CentOS/Ubuntu/Debian Linux. Visite a documentação do Etcd para configuração detalhada e guia de uso.
Configurações semelhantes:
- Configure o Cluster Consul no Ubuntu/Debian
- Configure o Consul Cluster no servidor CentOS/RHEL
- Como configurar o cluster local OpenShift Origin (OKD) no CentOS
- Como instalar o cluster de armazenamento Ceph no Ubuntu