docker stack deploy + k8s
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
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.
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:
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
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
Para removermos um stack basta digitar o comando:
docker stack rm --namespace demo-k8s demostack
Agora, caso tentemos obter os recursos, nada será exibido.
O repositório contendo a aplicação de exemplo é esse.
Referencias