Pular para o conteúdo

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.
Mundo Docker mundodocker
Hits: 7.674 Categoria: Linux Subcategoria: Redes
  • Indicar
  • Impressora
  • Denunciar

Parte 2: 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.

   1. Introdução
   2. Instalação e configuração
   3. Testes

Montando Volumes no Docker

Rancher - Painel para Docker

Conexão do Vindula com o Active Directory Server 2008 R2

Instalação e configuração do Nagios (versões 3.2.1 e 4.0.8)

Configurando o Rclone no CentOS 7

Crimpagem de Conectores RJ-45

FreeRadius 3 + iODBC + Base de Dados em MS SQL Server 2008 no Ubuntu Server - Guia definitivo

#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

Entre na sua conta para comentar.