Pesquisa de site

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

Artigos relacionados: