Usando Docker Swarm

Published: 2019-08-04, Updated: 2019-01-27

Links

Ferramentas

Anotações

Configurar mais de um manager

assim que usar o comando de join abaixo serah um manager

$ docker swarm join-token manager
docker swarm join \
    --token SWMTKN-1-2jylbfdn5mt55yp0khqd55ryr6f9sqww4e81s9yz4afz52zvmy-5gy57cgjwpbxffc2i3thdv4hy \
    192.168.1.103:2377

assim quem usar o comando de join serah um worker

$ docker swarm join-token worker
docker swarm join \
    --token SWMTKN-1-2jylbfdn5mt55yp0khqd55ryr6f9sqww4e81s9yz4afz52zvmy-598k8ie5dnfrzc7d54cdby8it \
    192.168.1.103:2377

uma vez criados os nos voce pode faze-los virarem managers ou workers com o comando abaixo

$ docker node --help
Usage:	docker node COMMAND
Manage Docker Swarm nodes

Options:
      --help   Print usage

Commands:
  demote      Demote one or more nodes from manager in the swarm
  promote     Promote one or more nodes to manager in the swarm

Porque quando tenho <=50% dos managers de pe o docker não elege um novo líder?

De a acordo com os links acima o docker precisa de disponibilidade quorum para poder decidir quem será o líder

Exemplo de healthcheck do docker swarm e go

Assim basta criar um service e baseado no healthcheck do dockerfile tudo ira funcionar

Criar um servidor swarm

$  docker swarm init --advertise-addr `ifconfig | grep -A1 -E "enp3s0|eth0" | grep -o -P 'inet addr:\K([0-9.]+)'`
Swarm initialized: current node (bvz81updecsj6wjz393c09vti) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx \
    172.17.0.2:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

onde 192.168.99.121 é o ip da maquina

Recuperar o comando do join

$ docker swarm join-token worker

Criar um slave para o manager

Quando voce roda o proprio manger gera o comando para que os slaves possam se conectar

$ docker swarm join \
  --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx \
  172.17.0.2:2377
This node joined a swarm  as a worker.

Nós / Nodes

Ver quais sao os nós do cluster

docker node ls

Pegar os IPs de todos os nodes do cluster

echo docker node inspect `docker node ls --format '{{ .ID }}'` --format '{{ .Status.Addr  }}' && \
docker node inspect `docker node ls --format '{{ .ID }}'` --format '{{ .ManagerStatus.Addr  }}'

Erros que aconteceram

ERRO[0301] Bulk sync to node typer-pc-c769453f8c12 timed out

Como funciona o deploy de uma nova versao de um service

O que acontece se eu tentar fazer scale enquanto existe uma versao estragada ?

Se voce subir uma versao zuada e fiz scale correra o risco do swarm matar as instancias que ja estavam funcionando

Qual container o docker vai matar para instalar a nova versao?

O docker sempre tenta jogar a nova versao no primeiro container do service eg: go-server1.1 e entao aplica tambem a todos os outros que estiverem restartando assim que eles desistirem da versao que estavam tentando instalar

Nodes nao conseguem fazer join no manager

erro:

error response from daemon: rpc error: code = 13 desc = connection error: desc = "transport: x509: certificate has expired or is not yet valid"

aparentemente a solucao foi deletar todos os ips da placa (ela estava com mais de um) e criar uma faixa de ip isolada

ip addr flush dev eth0

Problema noh que sai do pool demora muito ou nem mais publica as portas dos services

Relacionados

Passos:

Exemplo de como criar um cluster swarm

Criar meu cluster docker swarm na cloud at cost

Removendo um node do cluster

Para remover um no que nao esta down voce precisa rodar com -f

$ docker node ls
ID                           HOSTNAME           STATUS  AVAILABILITY  MANAGER STATUS
ibh4kr8q0eq85zs7lu6gkdv14 *  CI-80279-0         Ready   Active        Leader
mj93cvm1u6twbrf22b2577jmf    kmymoney-compiler  Down    Active        

$ docker node rm mj93cvm1u6twbrf22b2577jmf
mj93cvm1u6twbrf22b2577jmf

$ docker node ls
ID                           HOSTNAME    STATUS  AVAILABILITY  MANAGER STATUS
ibh4kr8q0eq85zs7lu6gkdv14 *  CI-80279-0  Ready   Active        Leader


Montando NFS

A ideia eh criar uma VM que tenha um servidor NFS, entao em cada node do cluster swarm rodar uma app que basicamente vai conectar nesse servidor NFS e expor essa montagem via volume

Docker stack deploy

version: '3'
services:
  alpine:
    image: alpine:3.7
    command: sh -c 'apk add --update curl && tail -f /dev/null'
    networks:
      - swarm
  
  nginx-1:
    image: nginx:1.10
    hostname: nginx1
    networks: 
      - swarm

networks: 
  swarm:
    driver: overlay
    

Docker service

Criando um service

# cria o service
docker service create --name mydebian --detach=false debian:9 tailf -f /usr/bin/tail -f /dev/null

# ver como esta o processo de start 
docker ps mydebian

# ver como os services estao
docker service ls mydebian

Pegar o erro de ter startado

docker service ps --no-trunc {serviceName}

Criar um service

$ docker service create --replicas 2 --name helloworld alpine ping docker.com
9uk4639qpg7npwf3fn2aasksr

criar service passando network para poder resolver dns internamente

$ docker service create  --network services --name go-be-server3 --replicas 3 defreitas/test-http-count-server:latest

Os outros services vao poder resolver este service chamando pelo nome deste service

curl go-be-server3

criar a network

docker network create \
--driver overlay \
--subnet 10.10.1.0/24 \
--opt encrypted \
services

Escalar o service

$ sudo docker service scale hellworld=10
helloworld scaled to 10

Inspecionando o service

Para ver em quais maquinas as instancias do service estao, estavam

sudo docker service ps helloworld-2
ID            NAME                IMAGE          NODE                   DESIRED STATE  CURRENT STATE           ERROR  PORTS
9dpspmfwx5tt  helloworld-2.1      alpine:latest  typer-pc               Running        Running 21 minutes ago         
ifeoixiolset  helloworld-2.2      alpine:latest  typer-pc               Running        Running 12 minutes ago         
gc4pqkyfwwf4   \_ helloworld-2.2  alpine:latest  localhost.localdomain  Shutdown       Running 12 minutes ago  

Listando os services do meu cluster

$ sudo docker service ls

Usando docker config

Criando config

echo 'some data' | docker config create test -

Pegando conteudo da config

docker config inspect -f '{{json .Spec.Data }}' test | cut -d'"' -f2 | base64 -d

Creating service

docker service create --name tmp-service -d=false --config test --config src=test,target="/myconfig" debian:9 /usr/bin/tail -f /dev/null

Testing config

docker exec -it tmp-service.1.lyvotf79pb91hf9z6n246s6qv  tail -n+1 /test /myconfig

Criando config no docker-compose

version: "3.3"
services:
  redis:
    image: redis:latest
    deploy:
      replicas: 1
    configs:
      - my_config
      - my_other_config
configs:
  my_config:
    file: ./my_config.txt
  my_other_config:
    external: true

Criando e apontando-a para um arquivo

version: "3.3"
services:
  redis:
    image: redis:latest
    deploy:
      replicas: 1
    configs:
      - source: my_config
        target: /redis_config
        uid: '103'
        gid: '103'
        mode: 0440
configs:
  my_config:
    file: ./my_config.txt
  my_other_config:
    external: true

Fazendo deploy com portainer

Referencia

keywords

docker swarm commands


TOP Commands Tooltips customizados com Tooltipster

Comments