Atualmente o
Docker tem suporte a plugins, o que permite estender suas funcionalidades, e no caso deste artigo, iremos utilizar um plugin para volume de dados, o que permitirá especificamente armazenar o conteúdo de volumes Docker sob um backend storage DRBD.
A vantagem é que todas as operações que um ou mais containers realizar sob seus volumes de dados, não serão simplesmente gravadas em um filesystem local, mas gravados em um dispositivo virtual de blocos replicados gerenciado pelo módulo de kernel do DRBD, replicando os dados para um ou mais hosts (nós) do nosso Cluster.
A abordagem deste artigo será simplesmente permitir que quando um container for ser executado em dos nós do Cluster, ele terá acesso aos dados mais recentes existentes no volume, pois este volume é proveniente de uma estrutura de replicação estabelecida pelo DRBD.
Em outros artigos estaremos explorando ambientes mais complexos com o DRBD atuando em um modo Ativo/Ativo.
Para criação de nosso container que proverá o serviço de banco de dados baseado no Microsoft SQL Server, estaremos utilizando uma imagem de container Docker disponibilizada pela Microsoft denominada
microsoft/mssql-server-linux.
Para este artigo utilizaremos o
Docker Hub para realizar o pull da imagem acima mencionada.
A seguir temos os requisitos mínimos para poder utilizar a imagem de container Docker disponibilizada pela Microsoft:
- Docker Engine 1.8 ou superior
- Mínimo de 4 GB de espaço em disco
- Mínimo de 4 GB de RAM (apesar que para a finalidade de testes, uma máquina virtual 2.5 GB atenderá o mínimo de 2 GB exigido pelo SQL Server sobre container).
- Configurar uma senha forte para a conta de administrador do serviço do SQL Server, senha essa contendo pelo menos 8 caracteres utilizando letras maiúsculas e minúsculas, números e/ou símbolos não alfanuméricos.
- Para este artigo utilizamos a distribuição CentOS Linux 7 (7.4.1708), e a instalação do Docker pode ser realizada de maneira simples através da etapas abaixo descritas.
Todas as etapas abaixo serão realizadas em ambos os nós do nosso Cluster, que para este artigo os nós serão referenciados como:
- containernode01 - Endereço IP: 192.168.0.161
- containernode02 - Endereço IP: 192.168.0.162
Para atividades de configuração especificas em um determinado nó do Cluster, estaremos informando previamente.
Portanto, em ambos os nós:
Instale os pacotes que serão dependências no restante do processo de instalação do Docker Engine:
sudo yum install yum-utils
Neste caso, o pacote yum-utils permitirá utilizarmos a ferramenta yum-config-manager para adicionar o repositório Docker Comunity Edition.
Adicione o repositório ao sistema:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
Instale o pacote do Docker Engine:
sudo yum install -y docker-ce
Execute os daemons do Docker e ative o serviço na inicialização do sistema:
sudo systemctl start docker
$ sudo systemctl enable docker
Adicione o atual usuário logado no grupo de usuário Docker. Essa ação fará com que não seja necessária a utilização do comando sudo para utilização docker.
sudo gpasswd -a "${USER}" docker
Reinicie o sistema para testar a inicialização do serviço do Docker:
sudo reboot
Para testar o serviço Docker Engine, execute uma consulta simples através do docker cliente, por exemplo, se existe algum container em execução:
docker ps
Certamente a listagem estará vazia, o que indica que o docker client conseguiu estabelecer a conexão com o serviço Docker Engine.
Instale o pacote para adicionar e configurar o repositório EPEL, pois a versão 9 do DRBD que será utilizada neste artigo, encontra-se neste repositório:
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
Instale os pacotes do DRBD:
yum install drbd90-utils kmod-drbd90
Ative o carregamento do módulo do kernel durante o boot:
echo drbd > /etc/modules-load.d/drbd.conf
Instale os pacotes a seguir pois serão necessários para podermos realizar o download e compilar a ferramenta drbdmanage. Em seguida, descompacte o arquivo e proceda com as etapas de build e instalação:
yum install wget pygobject2 -y
$ wget http://www.linbit.com/downloads/drbdmanage/drbdmanage-0.99.14.tar.gz
$ tar -xvzf drbdmanage-0.99.14.tar.gz -C /opt/
$ cd /opt/drbdmanage-0.99.14/
$ ./setup.py build
$ ./setup.py install
Realize um teste com a ferramenta drbdmanage. O retorno deverá ser a palavra "pong", indicando que a ferramenta está funcional:
drbdmanange ping
A grande vantagem da ferramenta drbdmanage é que ela facilita o gerenciamento de Clusters utilizando a tecnologia DRBD. Através dela podemos gerenciar dispositivos de bloco baseados em LVM ou ZFS, onde o mesmo estejam sob um dispositivos de replicação DRBD.
Para este artigo teremos em cada nó do Cluster dois discos, sendo um para uso exclusivo do sistema operacional e demais serviços e um dele para criação do volume de dados replicados pelo DRBD, e que será utilizado para o armazenamento de dados de forma persistente em nossos containers.
Por padrão o drbdmanage possui uma referência a um volume group chamado drbdpool, referência essa existente no arquivo
/etc/drbdmanaged.cfg.
Podemos manter esse nome padrão ou altera-lo no arquivo de configuração anteriormente citado. Para este artigo iremos utilizar o nome, containersData, portanto, execute o comando abaixo para realizar a alteração:
sed -r 's/^#(.*drbdctrl-vg.*)$/\1/' -i /etc/drbdmanaged.cfg
$ sed 's/drbdpool/containersData\n/g' -i /etc/drbdmanaged.cfg
Para este artigo, vamos supor que a segunda unidade de disco seja /dev/sdb, portanto, criaremos um volume group chamado containersData nesta unidade de disco.
Crie uma partição primária na segunda unidade de disco e em seguida crie um volume físico e depois o volume lógico chamado containersData.
pvcreate /dev/sdb1
$ vgcreate containersData /dev/sdb1
No host containernode01 (192.168.0.161) e containernode02 (192.168.0.162) criaremos pares de chaves, para permitir que a partir de um host possamos acessar o outro via SSH, sem a necessidade de informarmos senha e vice-versa. Esta etapa é importante, pois iremos utilizar a ferramenta drbdmanage para provisionar nossa infraestrutura de Cluster, etapa essa que pode ser simplificada devido a autenticação entre hosts poderem ser realizadas por meio de chaves RSA.
No host containernode01 (192.168.0.161) execute:
ssh-keygen -t rsa
$ scp .ssh/id_rsa.pub root@192.168.0.162:/root/.
No host containernode02 (192.168.0.162) execute:
ssh-keygen -t rsa
$ scp .ssh/id_rsa.pub root@192.168.0.161:/root/.
$ cat id_rsa.pub >> .ssh/authorized_keys
No host containernode01 (192.168.0.161) execute:
cat id_rsa.pub >> .ssh/authorized_keys
No hosts containernode01 e containernode02 edite o arquivo /etc/hosts, deixando o final dele da seguinte forma para não dependermos de uma infraestrutura DNS para a resolução.
- 192.168.0.161 containernode01 containernode01.lab.local
- 192.168.0.162 containernode02 containernode02.lab.local
No host containernode01 (192.168.0.161) execute:
ssh 192.168.0.162 hostname
$ ssh containernode02 hostname
Em ambos os comandos deverá ser exibido o hostname do host 192.168.0.162. Esta etapa é importante, para testarmos a comunicação entre ambos hosts via SSH sem uso autenticação baseada em senha, pois conforme exposto, isto permitirá que a ferramenta drbdmanage estabeleça a conexão via SSH entre os hosts e procedimentos, como por exemplo, criação de volumes lógicos sob o dispositivo de bloco replicado DRBD seja realizado durante a criação de volumes docker.
No host containernode02 (192.168.0.162) execute:
ssh 192.168.0.161 hostname
$ ssh containernode01 hostname
Os testes de conexão via SSH sem senha em um primeiro momento, permitirá que os hosts que estão sofrendo conexão sejam inseridos na lista de hosts conhecidos em (/root/.ssh/know_hosts).
Os volumes de dados que criaremos a partir do docker utilizará um plugin chamado drbdmanage, onde todas as chamadas realizadas a esse plugin serão direcionadas ao serviço docker-drbdmanage-plugin, e o mesmo utilizará a atual estrutura de cluster provisionada, permitindo transparência durante a criação de volumes no docker, criação essa que utilizará do mecanismo de replicação do DRBD.