docker stack deploy + k8s

Alef Carlos
Bee Lab Academy
Published in
4 min readApr 10, 2019

Bom dia. Boa tarde. Boa noite.

Que tal juntarmos os melhores de dois mundos em um cluster Kubernetes ?

É comum montarmos todo nosso ambiente com Docker e depois que pegamos a prática começamos a estudar sobre docker-compose, que facilita subir todos os serviços necessários para nossa solução.

Um outro ponto interessante do docker-compose é a praticidade de criação de networks para que nossos serviços resolvam os hosts via service discovery.

Imagine que precisamos subir uma WebApi que se conecte com o mongoDb, e para isso precisamos de uma connection string, no compose podemos simplesmente escrever assim:

mongodb://[service-name]:27017/dbname

Primeiro vamos ao docker-compose:

Vamos montar um compose de um webapi .NET Core conectando no mongoDb:

No exemplo acima estamos utilizando variável de ambiente para armazenar a connection string, o host que devemos utilizar sempre é o nome do serviço criado: mongodb.

Para montar a stack do compose basta executar:

docker-compose build

Com isso todas as imagens necessárias serão criadas/baixadas. No exemplo acima o serviço mongodb já utiliza uma imagem, então a única ação a ser fazer é o download da mesma, já o serviço web utiliza um arquivo Dockfile para criar sua imagem. No final, duas imagens estarão disponíveis para uso:

  • mongo
  • demo-api

Para subir nossa aplicação basta executar o comando:

docker-compose up

Output

Para acessar a aplicação basta acessar http://localhost:8181

docker stack + k8s

Com as últimas versões do Docker foi disponibilizado o orquestrador de containers Kubernetes.

Tela de configuração

Para ativarmos basta ir na tela de configurações do Docker e habilitar as duas opções acima.

Após ter finalizado todo o setup, sua máquina pode reiniciar algumas vezes, digite o comando para validar sua configuração:

kubectl get nodes

O resultado deve ser algo parecido com isso:

Output do comando executado

Um cluster de um nó é criado quando o Kubernetes é ativado.

Vamos aproveitar nossa estrutura do docker-compose para gerar nossos recursos no cluster utilizando o docker stack.

Primeiro vamos criar um namespace no cluster para organizar nossos recursos, namespace é um agrupador. É uma boa prática de organização.

kubectl create namespace demo-k8s

Nosso arquivo de compose terá algumas modificações para atender melhor:

A partir da versão 3 do formato foi adicionada uma tag deploy que usamos para configurar quantas instâncias queremos de um container, limites de memória e cpu, entre outras. Para uma lista completa acesse a documentação.

E no exemplo acima configuramos apenas uma instância do nosso container.

Uma dica muito importante: o docker stack ignora a tag build, pois só funciona com imagens já buildadas, então para executar, temos de ter a imagem demo-api já disponível

docker-compose build

Para não quebrarmos a compatibilidade com o docker-compose, a tag build é mantida.

Após a conclusão do comando, vamos criar nossa stack no k8s:

docker stack deploy --namespace demo-k8s -c docker-compose.yml demostack

A estrutura do comando é a seguinte:

docker stack deploy [OPTIONS] STACK_NAME

No exemplo acima, estamos pedindo para que a stack seja criada no namespace demo-k8s e para utilizar o arquivo docker-compose.yml.

E sempre temos de dar um nome para essa stack, que no exemplo foi demostack.

Se o parâmetroe --namespace for omitido, todo os recursos serão criado no namespace default do k8s.

Caso o namespace não exista, o seguinte output será exibido:

namespaces "demo-k8s" not found

Após a mensagem Stack demostack is stable and running, você já poderá brincar a vontade.

Vamos listar todas as stack disponíveis:

docker stack ls

Agora vamos listar todos os recursos criados no k8s:

kubectl get all -n demo-k8s

Precisamos informar o parâmetro -n, pois criamos com um namespace

Output esperado

Para ver a aplicação basta acessar: http://localhost:8181

Lembrando que essa porta 8181 foi a configurada lá no docker-compose. E o recurso de service discovery ainda funciona!

Para listar os pods de um namespace:

kubectl get pods -n demo-k8s

Output esperado

Para removermos um stack basta digitar o comando:

docker stack rm --namespace demo-k8s demostack

Agora, caso tentemos obter os recursos, nada será exibido.

Output esperado

O repositório contendo a aplicação de exemplo é esse.

Referencias

--

--

Alef Carlos
Bee Lab Academy

Desenvolvedor por paixão, arquiteto de software por profissão.