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.