Como instalar o cluster HA de 3 nós Etcd no Ubuntu 22.04
O conceito de conteinerização está agora em toda parte. Pode ser definido como o empacotamento de pacotes e todas as dependências necessárias em um executável leve chamado contêiner. Este conceito foi altamente adotado porque elimina todos os problemas de dependências associados aos pacotes. Ele também fornece segurança aprimorada ao isolar cargas de trabalho e desempenho aprimorado do aplicativo com escalabilidade, portabilidade e flexibilidade. A conteinerização trouxe diversas ferramentas como Docker, Podman, Containerd, Kubernetes, ETCD etc.
etcd é popular entre todas as pessoas que interagiram com o Kubernetes. É um armazenamento de valores-chave consistente e altamente disponível que serve como espinha dorsal de sistemas distribuídos para fazer backup de todos os dados do cluster. Ele serve como armazenamento primário para armazenar e replicar todos os estados do cluster Kubernetes. Esta ferramenta foi inicialmente construída para executar clusters no Fedora CoreOS e posteriormente adotada em sistemas OSX, Linux e BSD. Hoje, muitos sistemas distribuídos, como Google Kubernetes, Cloud Foundry e Fleet, dependem em grande parte do etcd.
Em um cluster Kubernetes, o etcd atua como o cérebro. É responsável por armazenar todas as informações confidenciais necessárias para executar o cluster. Sempre que o etcd encontra um problema, todo o cluster pode enfrentar problemas. Para obter alta disponibilidade, é recomendado isolar o cluster ectd. Isso melhora a manutenção e a capacidade de gerenciamento.
Abaixo está um diagrama que ilustra a arquitetura do Cluster Etcd
Neste guia, veremos como instalar o 3 Node Etcd HA Cluster no Ubuntu 22.04.
Começando
Para executar o cluster ETCD sem problemas, você precisa de um número ímpar de serviços, digamos 3 ou 5. Você também precisa garantir que não haja falta de recursos para garantir que o cluster esteja estável.
Neste guia, utilizaremos um ambiente de 4 servidores Ubuntu 22.04 configurados conforme mostrado abaixo:
TASK | IP ADDRESS | HOSTNAME |
ETCD1 | 192.168.200.52 | etcd1.computingforgeeks.com |
ETCD1 | 192.168.200.62 | etcd2.computingforgeeks.com |
ETCD1 | 192.168.200.63 | etcd3computingforgeeks.com |
LOAD-BALANCER | 192.168.200.56 | loadbalancer.computingforgeeks.com |
Certifique-se de que os sistemas estejam atualizados e que todos os pacotes necessários estejam instalados:
sudo apt update
sudo apt install vim curl -y
Em seguida, prossiga para definir os nomes de host em todos os servidores. Por exemplo em;
sudo hostnamectl set-hostname etcd1.computingforgeeks.com #Node1
sudo hostnamectl set-hostname etcd2.computingforgeeks.com #Node2
sudo hostnamectl set-hostname etcd3.computingforgeeks.com #Node3
Em seguida, configure /etc/hosts em todas as máquinas conforme mostrado:
$ sudo vim /etc/hosts
192.168.200.52 etcd1.computingforgeeks.com etcd1
192.168.200.62 etcd2.computingforgeeks.com etcd2
192.168.200.63 etcd3.computingforgeeks.com etcd3
192.168.200.56 loadbalancer.computingforgeeks.com loadbalancer
Existem muitos outros requisitos para implantações de produção. Uma delas é que as versões mínimas do etcd necessárias são 3.4.22+
e 3.5.6+
. Existem muitos outros requisitos, consulte a referência de requisitos de recursos
Depois que tudo estiver configurado, você pode prosseguir conforme mostrado nas etapas abaixo.
1. Instale os pacotes necessários
Existem alguns pacotes necessários em todos os nós do etcd antes de prosseguirmos com a inicialização do cluster.
Para este método, os usuários podem escolher as versões mais recentes disponíveis do etcd. Para conseguir isso, visite a página de lançamentos do etcd. Uma vez aqui, exporte a versão mais recente disponível:
ETCD_VER=v3.5.10
Exporte outras variáveis necessárias:
GOOGLE_URL=https://storage.googleapis.com/etcd
GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
DOWNLOAD_URL=${GOOGLE_URL}
Crie o diretório /tmp para alcançar:
rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
Agora extraia o binário com os comandos:
curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
Extraia o arquivo:
tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1
rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
Mova os binários para o seu PATH:
sudo cp /tmp/etcd-download-test/etcd* /usr/local/bin
Agora crie um arquivo de serviço:
sudo vim /etc/systemd/system/etcd.service
Adicione estas linhas ao arquivo:
[Unit]
Description=etcd
[Service]
Type=notify
EnvironmentFile=/etc/default/etcd
ExecStart=/usr/local/bin/etcd
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Agora verifique a instalação:
$ etcd --version
etcd Version: 3.5.10
Git SHA: 0223ca52b
Go Version: go1.20.10
Go OS/Arch: linux/amd64
$ etcdctl version
etcdctl version: 3.5.10
API version: 3.5
Depois que o etcd for instalado nos 3 servidores, proceda conforme mostrado abaixo.
2. Configure o cluster Etcd HA no Ubuntu
Depois que os pacotes necessários forem instalados nos nós do etcd, podemos agora criar o cluster. Para conseguir isso, precisamos fazer alguns ajustes na configuração do etcd.
Abra o arquivo para edição:
sudo vim /etc/default/etcd
Este arquivo contém todas as variáveis de ambiente do cluster. Precisamos definir todas as variáveis em todos os 3 nós:
ETCD_NAME=<node-name>
##ETCD_DATA_DIR=/var/lib/etcd
ETCD_INITIAL_CLUSTER=<node1-name=http://<node1-ip>:2380,node2-name=http://<node2-ip>:2380,node3-name=http://<node3-ip>:2380>
ETCD_INITIAL_ADVERTISE_PEER_URLS=http://<node-ip>:2380
ETCD_ADVERTISE_CLIENT_URLS=http://<node-ip>:2379
ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
Substitua todas as variáveis em cada nó antes de iniciá-los. Lembre-se de que pelo menos 2 nós etcd devem ser iniciados dentro de 50 segundos ou ocorrerá um erro devido ao tempo limite da eleição mestre.
Por exemplo, no meu nó etcd1, as variáveis serão:
ETCD_NAME=etcd1
##ETCD_DATA_DIR=/var/lib/etcd
ETCD_INITIAL_CLUSTER=etcd1=http://192.168.200.52:2380,etcd2=http://192.168.200.62:2380,etcd3=http://192.168.200.63:2380
ETCD_INITIAL_ADVERTISE_PEER_URLS=http://192.168.200.52:2380
ETCD_ADVERTISE_CLIENT_URLS=http://192.168.200.52:2379
ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
Depois que as alterações forem feitas em todos os 3 nós, inicie ou reinicie o serviço etcd com os comandos:
sudo systemctl daemon-reload
sudo systemctl enable --now etcd
##To Restart, Use:
sudo systemctl restart etcd
Verifique se o serviço está sendo executado em todos os nós:
$ systemctl status etcd
● etcd.service - etcd
Loaded: loaded (/etc/systemd/system/etcd.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2023-11-19 16:21:21 EAT; 29s ago
Main PID: 4684 (etcd)
Tasks: 7 (limit: 4617)
Memory: 12.7M
CPU: 455ms
CGroup: /system.slice/etcd.service
└─4684 /usr/local/bin/etcd
Nov 19 16:21:43 etcd1.computingforgeeks.com etcd[4684]: {"level":"info","ts":"2023-11-19T16:21:43.013666+0300","caller":"rafthttp/peer_status.go:53","msg":"peer became active","peer-id":"3c>
Nov 19 16:21:43 etcd1.computingforgeeks.com etcd[4684]: {"level":"info","ts":"2023-11-19T16:21:43.014271+0300","caller":"rafthttp/stream.go:412","msg":"established TCP streaming connection >
Nov 19 16:21:43 etcd1.computingforgeeks.com etcd[4684]: {"level":"info","ts":"2023-11-1
....
Agora, neste ponto, o cluster está instalado e funcionando. Para verificar isso, use o comando abaixo e substitua o IP pelo de qualquer servidor etcd.
$ etcdctl --endpoints=http://192.168.200.52:2379 member list
12aca8afa5a60d1a, started, etcd1, http://192.168.200.52:2380, http://192.168.200.52:2379, false
3ccdae3b547878c4, started, etcd3, http://192.168.200.63:2380, http://192.168.200.63:2379, false
cdf1b4107740a046, started, etcd2, http://192.168.200.62:2380, http://192.168.200.62:2379, false
Na saída acima, temos 3 nós no cluster etcd.
3. Instalar e configurar LoadBalancer
Primeiro, instale o balanceador de carga. Neste guia, usaremos o Haproxy como nosso balanceador de carga. Você ainda pode usar o Nginx ou qualquer outro conforme desejar.
Para instalar o Haproxy em seu sistema Ubuntu, use:
##On Debian/Ubuntu
sudo apt update && sudo apt install haproxy
Depois de instalado, inicie e habilite o serviço:
sudo systemctl start haproxy
sudo systemctl enable haproxy
Prossiga e crie a configuração do proxy:
sudo cp /etc/haproxy/haproxy.cfg{,.old}
sudo vim /etc/haproxy/haproxy.cfg
Lembre-se de que a configuração do HAProxy possui 4 partes principais. Estes são:
- Seção global com parâmetros para todos os servidores em execução.
- Configurações padrão com detalhes que se aplicam a todas as subseções de proxy
- Configurações de front-end definem os soquetes de escuta da conexão do cliente
- Configurações de back-end definem o endereço IP do servidor e o algoritmo do balanceador de carga
No arquivo, precisamos adicionar as linhas abaixo definindo como ele deve lidar com o balanceamento de carga:
frontend main
bind *:2379
mode tcp
default_backend etcd-api
backend etcd-api
mode tcp
balance roundrobin
server node1 etcd1.computingforgeeks.com:2379 check
server node2 etcd2.computingforgeeks.com:2379 check
server node3 etcd3.computingforgeeks.com:2379 check
Forneça os nomes de domínio corretamente no arquivo acima. Se você tiver um firewall habilitado, permita esta porta em todos os nós:
sudo ufw allow 2379
Agora reinicie o serviço HAProxy:
sudo systemctl restart haproxy
Agora você pode acessar o cluster usando o IP do balanceador de carga. Por exemplo:
Agora você pode usar o endpoint etcd em seu cluster Kubernetes. Você precisa especificá-lo na configuração do Kubernetes conforme mostrado:
$ sudo vim /etc/kubernetes/apiserver
KUBE_ETCD_SERVERS=” — etcd_servers=http://etcd1:2379,http://etcd2:2379, http://etcd3:2379"
##OR
KUBE_ETCD_SERVERS=” — etcd_servers=http://<loadbalancer-IP>:2379
Teste se você pode gravar no cluster:
##Member list in a table
# etcdctl --write-out=table --endpoints=<loadbalancer_IP>:2379 member list
+------------------+---------+--------+------------------------+------------------------+
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS |
+------------------+---------+--------+------------------------+------------------------+
| 8211f1d0f64f3269 | started | etcd1 | http://192.168.200.52:2380 | http://192.168.200.52:2379 |
| 91bc3c398fb3c146 | started | etcd2 | http://192.168.200.62:22380 | http://192.168.200.62:22379 |
| fd422379fda50e48 | started | etcd3 | http://192.168.200.63:32380 | http://192.168.200.63:32379 |
+------------------+---------+--------+------------------------+------------------------+
##Store a Key
$ etcdctl put key hello
OK
##Retrieve the Key
$ etcdctl get key
hello
4. Proteja o etcd com certificados TLS
É possível gerar e usar certificados para o seu cluster ETCD. Isso garante uma comunicação segura entre os nós. Para demonstrar isso, gerarei certificados autoassinados para ETCD.
Podemos usar o Mkcert para isso. Primeiro, instale-o extraindo o binário mais recente das versões do GitHub. Exportaremos a versão:
VER=v1.4.4
Agora baixe os binários com o comando:
##AMD64
wget https://github.com/FiloSottile/mkcert/releases/download/$VER/mkcert-$VER-linux-amd64
##ARM64
wget https://github.com/FiloSottile/mkcert/releases/download/$VER/mkcert-$VER-linux-arm64
##ARM
wget https://github.com/FiloSottile/mkcert/releases/download/$VER/mkcert-$VER-linux-arm
Torne-o executável e mova-o para o seu PATH
chmod +x mkcert-$VER-linux-*
sudo mv mkcert-$VER-linux-* /usr/local/bin/mkcert
Agora gere certificados com o comando:
mkcert -install
mkcert '*.computingforgeeks.com'
Você terá então a chave e o certificado gerados em seus locais. A CA está disponível em $ (mkcert -CAROOT)/rootCA.pem
. Você pode copiar e usar a CA no seu cliente para evitar avisos de certificados SSL
Copie esses certificados em todos os nós etcd. Você pode usar o SCP para isso.
Depois que os certificados forem movidos para o diretório necessário, diga /etc/ssl/certs/etcd. Você pode configurar o etcd para usá-los adicionando estas linhas à configuração:
Amostra no Nó 2:
$ sudo vim /etc/default/etcd
ETCD_NAME=etcd2
##ETCD_DATA_DIR=/var/lib/etcd
ETCD_INITIAL_CLUSTER=etcd1=http://192.168.200.52:2380,etcd2=http://192.168.200.62:2380,etcd3=http://192.168.200.63:2380
ETCD_INITIAL_ADVERTISE_PEER_URLS=https://192.168.200.62:2380
ETCD_ADVERTISE_CLIENT_URLS=https://192.168.200.62:2379
ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
ETCD_LISTEN_CLIENT_URLS=https://0.0.0.0:2379
##[Security]
ETCD_CERT_FILE=/etc/ssl/certs/etcd/_wildcard.computingforgeeks.com.pem
ETCD_KEY_FILE=/etc/ssl/certs/etcd/_wildcard.computingforgeeks.com-key.pem
#ETCD_CLIENT_CERT_AUTH="false"
ETCD_TRUSTED_CA_FILE=/etc/ssl/certs/etcd/rootCA.pem
Depois que as alterações forem feitas em todos os 3 servidores, reinicie o serviço etcd:
sudo systemctl restart etcd
Você pode adicionar o certificado CA à lista de certificados confiáveis em seu sistema, conforme mostrado:
sudo cp /etc/ssl/certs/etcd/rootCA.pem /usr/local/share/ca-certificates/rootCA.crt
sudo update-ca-certificates
Se você não puder ou não quiser adicionar a CA à lista de certificados confiáveis, poderá acessar o cluster especificando-o conforme mostrado:
$ etcdctl --endpoints=https://192.168.200.56:2379 member list --cacert /path/to/rootCA.crt
12aca8afa5a60d1a, started, etcd1, https://192.168.200.52:2380, https://192.168.200.52:2379, false
3ccdae3b547878c4, started, etcd3, https://192.168.200.63:2380, https://192.168.200.63:2379, false
cdf1b4107740a046, started, etcd2, https://192.168.200.62:2380, https://192.168.200.62:2379, false
Isso mostra que a comunicação dentro dos nós é segura.
Veredito
Esse é o fim deste guia detalhado sobre como instalar o 3 Node Etcd HA Cluster no Ubuntu 22.04. Agora você pode usar o etcd em seu cluster Kubernetes. Espero que isso tenha sido informativo.
Ver mais:
- Faça backup dos dados do Etcd no OpenShift 4.x para AWS S3 Bucket
- Como monitorar cluster Etcd com Prometheus e Grafana
- Configure o cluster Etcd no CentOS/Ubuntu/Debian/Fedora