Docker e Flannel

Veremos nesse artigo, como é possível utilizar o Flannel para criar um ambiente de multihost no Docker. Para quem não conhece ainda, o Flannel é backend para rede desenvolvido pela CoreOS, com o intuito de facilitar a administração dos clusters de Docker e da rede de cada container. Nesse artigo, abordaremos desde a instalação e configuração básica, até um exemplo prático de utilização.

[ Hits: 6.109 ]

Por: Mundo Docker em 09/10/2016 | Blog: http://www.mundodocker.com.br


Instalação e configuração



Servidor Etcd

Nosso exemplo foi baseado no CentOS-7 64 bits, mas você pode utilizar em outro S.O sem problemas. Vamos lá, primeiramente você deve habilitar o repositório Extras do CentOS, para isso edite o "CentOS-Base.repo" e coloque habilite-o.

Veja:

# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client. You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
enable=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

Agora, vamos instalar o backend do Flannel, que é o etcd (serviço de chave valor em memória), o etcd é utilizada para armazenar as informações sobre as redes que serão distribuídas entre os containers.

Vamos lá:

# yum install etcd

Edite o /etc/etcd/etcd.conf, alterando o ETCD_LISTEN_CLIENT_URLS. Em nosso teste, colocamos "0.0.0.0", ou seja, o etcd estará acessível através de qualquer IP do host, veja:

ETCD_NAME=default
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://localhost:2379"

Cuide para que a porta 2389 esteja liberado no Firewall desse host. Agora, vamos aproveitar que estamos no host de etcd e vamos já deixar configurado a rede que será utilizada pelos hosts de Docker. Para isso, crie um arquivo, em nosso lab: rede.json e adicione o seguinte código:

{
"Network": "192.0.0.0/16",
"SubnetLen": 22,
"Backend": {
"Type": "vxlan",
"VNI": 1
}
}

Onde:
  • Network → Bloco de rede que será distribuída para os containers;
  • SubnetLen → Tamanho do bloco alocada para cada host, ou seja, cada host receberá um /22 do bloco 192.0.0.0/16, isso que dizer que poderíamos ter até 1000 containers em 1 host;
  • Type → Tipo do canal que será utilizado, lembra que no Flannel você pode escolher em vxlan ou udp, pois bem, é aqui que você configura isso, por experiência própria, recomendamos utilizar vxlan, pois há menos overhead.

O que faço com isso agora? Importe no etcd, lembrando que o etcd trabalha com chave=valor, então execute:

# etcdctl set /mundodocker/network/config < rede.json

Onde:
  • /mundodocker/network/config → chave
  • rede.json → valor

Agora, vamos ver se essas informações foram persistidas no etcd:

# etcdctl get /mundodocker/network/config
{
  "Network": "192.0.0.0/16",
  "SubnetLen": 22,
  "Backend": {
  "Type": "vxlan",
  "VNI": 1
}
}


Servidores Docker

Não esqueça, em todos os hosts temos que ativar o repositório de extras do CentOS, da mesma forma que foi feita acima. Vamos às instalações das dependências, o docker é claro:

# curl -fsSL https://get.docker.com/ | sh

Agora, o Flannel:

# yum install flannel -y

Vamos às configurações agora, começamos pelo Flannel, para isso, edite o arquivo: /etc/sysconfig/flanneld, modificando as linhas:

FLANNEL_ETCD = Servidor do Etcd
FLANNEL_ETCD_KEY = Key definida no Etcd

Veja como deve ficar:

# cat /etc/sysconfig/flanneld | grep -v ^#

FLANNEL_ETCD="http://host-etcd:2379"
FLANNEL_ETCD_KEY="/mundodocker/network"

Agora, inicie o serviço do Flannel:

# systemctl enable flanneld
# systemctl start flanneld

Note que ele criará uma interface de rede chamada flannel.1, que será utilizada para comunicação entre os hosts. Note também que será criado um arquivo dentro de: /run/flannel/subnet.env com as informações sobre a rede que o host assumiu, esse arquivo será utilizado daqui a pouco.

Agora vamos configurar nosso serviço de Docker para utilizar a rede Flannel configurada anteriormente, para isso, edite o arquivo: /lib/systemd/system/docker.service, adicionando a linha: "EnvironmentFile=-/run/flannel/subnet.env" e alterando a forma como o Docker será iniciado.

Veja como deve ficar:

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target docker.socket
Requires=docker.socket

[Service]
Type=notify
EnvironmentFile=-/run/flannel/subnet.env
ExecStart=/usr/bin/docker daemon -H fd:// $OPTIONS $DOCKER_STORAGE_OPTIONS --bip=${FLANNEL_SUBNET} --mtu=${FLANNEL_MTU}
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target

Agora basta iniciar/reiniciar o serviço do Docker:

# systemctl enable docker.service
# systemctl start docker.service

Não esqueça de fazer isso em todos os hosts de Docker que você quer colocar nessa rede.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Instalação e configuração
   3. Testes
Outros artigos deste autor

Rancher - Painel para Docker

Montando Volumes no Docker

Leitura recomendada

Análise de Desempenho: Web API - Recursos técnicos

GNU/Linux no mundo corporativo

Asterisk - Recebimento de Fax com encaminhamento por e-mail

TurnKey Linux - Instale e configure serviços de rede facilmente

WebHTB - Controle de banda de internet

  
Comentários
[1] Comentário enviado por UrielRicardo em 17/10/2016 - 14:53h

Parabéns pelo artigo! Saberia me informar se a configuração é em JSON?

[2] Comentário enviado por mundodocker em 18/10/2016 - 07:04h

Olá Uriel,
Sim, o formato é em JSON, faltou essa informação ali mesmo.
Obrigado pelo feedback.

[3] Comentário enviado por UrielRicardo em 20/10/2016 - 15:37h


[2] Comentário enviado por mundodocker em 18/10/2016 - 07:04h

Olá Uriel,
Sim, o formato é em JSON, faltou essa informação ali mesmo.
Obrigado pelo feedback.


Muito obrigado


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts