Neste laboratório, serão configuradas 4 vms (virtual machines), utilizando o vagrant. As VMs:
- 1 VM para servidor de NFS
- 3 VMs para nodes do cluster docker swarm (1 node manager e 2 node workers)
- Sistema operacional utilizado: Oracle Linux 8
-
Acessar o diretório vagrant deste repositório:
cd vagrant
-
Subir as vms:
vagrant up
Caso necessite ajustar algo nas vms, como por exemplo, quantidade de memória RAM ou vCPUs, utilize o arquivo vagrant/environment.yml
Atenção: É necessário adicionar um segundo disco nesta VM, que será configurado com LVM. O procedimento para isso vai variar de acordo com o virtualizador utilizado (virtualbox, vmware, hyperv, etc), consulte a documentação do virtualizador que está sendo utilizado.
Estando dentro do diretório vagrant deste repositório, execute, conecte-se via ssh na vm nfs-server:
vagrant ssh nfs-server
O nome nfs-server foi definido no arquivo vagrant/environment.yml.
Para simular um cenário próximo do real, será configurado um volume lógico para o path que será servido via NFS para os clientes.
Execução, como root (execute primeiramente sudo -i):
-
Identificando o disco adicional**
fdisk -l
No caso, o disco aqui identificado para configurar no LVM foi /dev/sdb.
-
Criação da partição LVM:
fdisk /dev/sdb
Após abrir o fdisk, basta digitar as seguintes teclas:
- n -> para nova partição
- p -> para tipo primária
- t -> para escolher um tipo
- 8e -> para definir o tipo LVM
- w -> para gravar as alterações e sair
Serão solicitadas outras informações, basta ler com calma, mas em todas basta digitar Enter.
Ao finalizar, foi criada a partição /dev/sdb1.
-
Criação do LVM: Criando o PV:
pvcreate /dev/sdb1
Criando o VG:
vgcreate vg_data /dev/sdb1
Criando o LV:
lvcreate -l 100%FREE --name lv_data vg_data
-
Formatar a partição:
mkfs.xfs /dev/vg_data/lv_data
-
Tornando a montagem permanente do disco
Primeiro criar o diretório destino, que vai receber a montagem do LV:
mkdir -p /nfs/data
Recuperando o block id do dispositivo:
[root@nfs ~]# blkid /dev/mapper/vg_data-lv_data /dev/mapper/vg_data-lv_data: UUID="b98deca6-47cd-4e7a-9b3b-5a9cc4857a2f" BLOCK_SIZE="512" TYPE="xfs"
O que precisamos é b98deca6-47cd-4e7a-9b3b-5a9cc4857a2f. Atente para a saída, pois essa informação vai mudar no seu caso.
Edite o arquivo /etc/fstab:
vim /etc/fstab
Adicione no final do arquivo a linha contendo o UUID recuperado no passo anterior:
UUID=b98deca6-47cd-4e7a-9b3b-5a9cc4857a2f /nfs/data xfs defaults 0 1
-
Instalando pacotes necessários:
yum install nfs-utils -y
-
Iniciando e habilitando o serviço do NFS:
systemctl start nfs-server && systemctl enable nfs-server
-
Adicionando informações no /etc/exports:
vim /etc/exports
Adicione a seguinte linha no final do arquivo:
/nfs/data 192.168.56.0/24(rw,sync,no_root_squash,no_subtree_check)
O diretório /nfs/data é o diretório que será servido via NFS ao cluster swarm. O uso do NFS está permitido para a rede das vms 192.168.56.0/24. Para iniciar o compartilhamento, execute:
exportfs -a
Para confirmar se está tudo certo:
[root@nfs ~]# showmount -e 127.0.0.1 Export list for 127.0.0.1: /nfs/data 192.168.56.0/24
-
Adicionando regras no firewall:
Para que os clientes consigam conectar no NFS, é necessário adicionar as rules adequadas com o firewall-cmd:
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --permanent --add-service=mountd
firewall-cmd --permanent --add-port=2049/tcp
firewall-cmd --permanent --add-port=2049/udp
firewall-cmd --reload
Por padrão o firewalld é ativado no Oracle Linux 8.
Antes de mais nada, é necessário instalar o docker nos hosts node01, node02 e node03.
Para que consigamos trabalhar melhor e acessar o servidor NFS, alguns pacotes são necessários:
yum install epel-release -y && yum update -y && yum install wget git vim htop curl net-tools nfs-utils traceroute tcpdump rsyslog -y
Só para confirmar se os nodes (node01, node02 e node03) estão conseguindo enxegar o servidor NFS:
[root@node01 ~]# showmount -e 192.168.56.50
Export list for 192.168.56.50:
/nfs/data 192.168.56.0/24
Se for mostrada a saída acima, está tudo certo.
Acessar cada uma das VMs. Estando no diretório vagrant deste repositório:
vagrant ssh manager01
O ideal é ter um terminal para cada VM. Será demonstrado a instalação no node01, mas o processo é o mesmo para o node02 e node03.
-
Instalando:
sudo dnf install -y dnf-utils zip unzip sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo sudo dnf remove -y runc sudo dnf install -y docker-ce --nobest
Cada linha acima é uma linha de comando.
-
Habilitando e iniciando o serviço Docker:
sudo systemctl enable docker.service sudo systemctl start docker.service
-
Criar as regras de firewall
Para que funcione perfeitamente o cluster, nas 3 vms que vão compor o cluster, é necessário adicionar as seguintes liberações de portas:
firewall-cmd --add-port=2376/tcp --permanent firewall-cmd --add-port=2377/tcp --permanent firewall-cmd --add-port=7946/tcp --permanent firewall-cmd --add-port=7946/udp --permanent firewall-cmd --add-port=4789/udp --permanent firewall-cmd --reload
Acima, para restringir melhor, pode-se criar um um ipset com o fireall-cmd para liberar apenas para um determinado conjunto de ips ou subrede. Mais informações, consulte a documentação do firewall-cmd.
-
Na vm manager01, que será o node manager, execute:
docker swarm init --advertise-addr 192.168.56.51
Após a conclusão da execução do comandoa acima, será gerado o comando para executar nos nodes que serão workers (vms worker01 e worker02).
-
Nas vms worker01 e worker02, que serão nodes workers, execute:
docker swarm join --token TOKEN_AQUI 192.168.56.51:2377
Se precisar recuperar o token, execute:
docker swarm join-token worker
Com o comando acima é exibido o token para adicionar um node do tipo wroker. Caso necessite do token pra adicionar um manager, basta executar o mesmo comando, substituindo o worker por manager.
Para confirmar se os nodes estão todos no cluster, na vm manager01:
[root@node01 ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION xhygmgk6qknmb8yhc0hasr8x0 * node01 Ready Active Leader 23.0.1 31ecipqku5pce3kb389gcvpkz node02 Ready Active 23.0.1 mwrx3zcizjgq97me6pzkf32ui node03 Ready Active 23.0.1
Agora que os 3 nodes estão prontos, falta configurar a montagem do NFS nos nodes, no path /data. Os passos abaixo devem ser executados nas 3 vms do cluster.
-
Criar o diretório:
mkdir -p /data
-
Instalando pacotes necessários e úteis que podem ser necessários posteriormente:
yum install epel-release -y && yum update -y && yum install wget git vim htop curl net-tools nfs-utils traceroute tcpdump rsyslog openssl-y
-
Montando o NFS no diretório:
mount -t nfs 192.168.56.50:/nfs/data /data
-
Adicionando a montagem no /etc/fstab, assim ao reiniciar o host, já será montado automaticamente no boot:
vim /etc/fstab
Adicione no final do arquivo, a seguinte linha:
192.168.56.50:/nfs/data /data nfs rw,hard,intr,rsize=8192,wsize=8192,timeo=14 0 0
Agora, pode-se criar certificado TLS/SSL autoassinados do tipo wildcard (*.dominio) para utilização mais a frente, se necessário, caso vá implantar em ambiente interno e queira utilizar TLS/SSL no proxy Traefik.
-
Primeiro deve-se criar a CA (Autoridade Certificadora) que será utilizada para assinar os certificados que será criados. Para tanto:
openssl req -x509 -sha256 -days 3650 -nodes -newkey rsa:2048 -keyout CA.key -out CA.crt
a. openssl: é o comando que executa a biblioteca OpenSSL, que fornece funções criptográficas e de segurança para várias aplicações e sistemas.
b. req: indica que o comando deve ser usado para trabalhar com certificados e solicitações de certificados.
c. -x509: especifica que um certificado autoassinado deve ser gerado.
d. -sha256: indica que o algoritmo de hash SHA-256 deve ser usado para assinar o certificado.
e. -days 3650: define a validade do certificado em dias. Neste caso, 10 anos.
f. -nodes: informa que a chave privada gerada não deve ser criptografada com uma senha.
g. -newkey rsa:2048: cria uma nova chave privada RSA com um comprimento de 2048 bits.
h. -keyout CA.key: especifica o arquivo onde a chave privada gerada deve ser armazenada.
i. -out CA.crt: especifica o arquivo onde o certificado autoassinado gerado deve ser armazenado.
-
Agora, cria-se a chave privada relacionada à identificação do servidor, identicar o próprio servidor que vai utilizar o certificado:
openssl genrsa -out server.key 2048
-
Próxima etada, dev-se criar uma CSR, que é uma solicitação de assinatura de certificado, ou seja, pedindo para CA assinar o certificado que será gerado.
openssl req -new -key server.key -out solicitacao.csr
Como estamos gerando um certificado do tipo wildcard, quando for perguntado sobre qual o domínio, coloque *.dominio.
a. openssl req: indica que o comando deve ser usado para trabalhar com certificados e solicitações de certificados.
b. -new: solicita a criação de uma nova solicitação de certificado.
c. -key server.key: indica o arquivo que contém a chave privada do servidor para o qual a solicitação de certificado está sendo criada.
d. -out solicitacao.csr: especifica o nome do arquivo que conterá a solicitação de certificado gerada.
-
Finalmente, procede-se com a criação do certificado TLS/SSL assinado pela CA criada anteriormente:
openssl x509 -req -in solicitacao.csr -CA CA.crt -CAkey CA.key -CAcreateserial -out certificado.crt -days 3650 -sha256
a. openssl x509: indica que o comando deve ser usado para trabalhar com certificados digitais.
b. -req: indica que o certificado deve ser gerado a partir de uma CSR (Certificate Signing Request).
c. -in solicitacao.csr: especifica o arquivo que contém a CSR.
d. -CA CA.crt: especifica o arquivo que contém o certificado público da CA que será usada para assinar o certificado.
e. -CAkey CA.key: especifica o arquivo que contém a chave privada da CA que será usada para assinar o certificado.
f. -CAcreateserial: cria um arquivo serial com o número de série do certificado assinado.
g. -out certificado.crt: especifica o nome do arquivo que conterá o certificado assinado gerado.
h. -days 3650: especifica o número de dias durante os quais o certificado será válido (neste caso, 10 anos).
i. -sha256: especifica o algoritmo de hash que deve ser usado para assinar o certificado (neste caso, SHA256).
O Traefik é uma solução de proxy reverso. Será utilizado no cluster swarm para gerenciar o encaminhamento de requisições para as aplicações que forem implantadas.
Implantando o Traefik. Para isso, efetue login na vm manager01, como root:
-
Criando a rede docker para o Traefik:
docker network create --driver=overlay traefik-public
-
Crie, se ainda não o tiver feito, o diretório que servirá de volume para Traefik:
mkdir -p /data/traefik-public-certificates
-
Crie o arquivo necessário para uso do Traefik no diretório criado acima:
touch /mnt/data/traefik-public-certificates/acme.json
-
Crie uma variável de ambiente com o e-mail que será usado para geração de certificados TLS/SSL.
export [email protected]
-
Crie uma variável de ambiente para guardar a url de acesso da UI do Traefik.
export DOMAIN=traefik.sys.example.com
Deve-se criar uma entrada de DNS apontando o domínio para o IP da VM manager01. Localmente, no Linux, pode-se adicionar essa entrada através do arquivo /etc/hosts.
-
Crie uma variável de ambiente com o usuário para autenticar na UI:
export USERNAME=admin
-
Crie uma variável de ambiente para definir a senha de acesso:
export PASSWORD=sua_senha_aqui
-
Utilize o openssl para gerar a hash da senha e colocar em uma variável de ambiente:
export HASHED_PASSWORD=$(openssl passwd -apr1 $PASSWORD)
Caso não possua o openssl instalado, basta executar yum install openssl -y.
-
Subindo a stack do Traefik a partir do arquivo treafik.yaml:
docker stack deploy -c traefik.yml traefik
Para verificar o status da implantação:
docker stack ps traefik
Depois de tudo UP, basta acessar https://traefik.SEU_DOMINIO. Será solicitada a senha criada anteriormente.
O Portainer é uma aplicação que permite administrar containers docker e consequentemente um cluster swarm. Para isso, acesse a vm manager01 e siga os passos abaixo:
-
Crie o diretório que vai armazenar o volume do Portainer:
mkdir -p /data/portainer_data
-
Agora crie um arquivo no diretório home do usuário root, conforme o portainer.yml.
-
Crie uma variável de ambiente para guardar a url de acesso da UI do Portainer.
export DOMAIN_PORTAINER=portainer.sys.example.com
Deve-se criar uma entrada de DNS apontando o domínio para o IP da VM manager01. Localmente, no Linux, pode-se adicionar essa entrada através do arquivo /etc/hosts.
-
Faça o deploy da stack do portainer com:
docker stack deploy -c portainer.yml portainer
Após terminar de subir a app, basta acessar no browser http://DOMINIO:9000/
Irá aparecer a tela abaixo, configure a senha do usuário admin e clique no botão para criar o usuário