Realizaremos a implantação do Canary manualmente via GitOps e criando/modificando os principais recursos do Kubernetes. Este artigo destina-se principalmente à introdução sobre como funciona a implantação no Kubernetes Canary, já que existem métodos de automação mais eficazes, que consideraremos nos artigos a seguir.
Com a estratégia Canary, as atualizações são aplicadas primeiro apenas a um subconjunto de usuários. Através de monitoramento, dados de log, testes manuais ou outros canais de feedback, a versão é testada antes de ser liberada para todos os usuários.
Implantação do Kubernetes (atualização contínua)
A estratégia padrão para implantação do Kubernetes é a atualização contínua, em que um determinado número de pods é lançado com novas versões das imagens. Se eles foram criados sem problemas, os pods com versões antigas de imagens serão encerrados e novos pods serão criados em paralelo.
GitOps
Usamos GitOps neste exemplo porque:
usando Git como uma única fonte de verdade
usamos operações Git para construção e implantação (nenhum comando além de git tag/merge é necessário)
Exemplo
Vamos adotar uma boa prática: ter um repositório para código de aplicação e outro para infraestrutura.
Repositório de aplicativos
Esta é uma API Python+Flask muito simples que retorna uma resposta como JSON. Construiremos o pacote via GitlabCI e enviaremos o resultado para o registro do Gitlab. No registro, temos duas versões de lançamento diferentes:
wuestkamp/k8s-deployment-example-app:v1
wuestkamp/k8s-deployment-example-app:v2
A única diferença entre eles é a alteração no arquivo JSON retornado. Usamos este aplicativo para visualizar o mais facilmente possível com qual versão estamos nos comunicando.
Repositório de infraestrutura
Neste nabo iremos implantar via GitlabCI no Kubernetes, .gitlab-ci.yml é o seguinte:
Enviamos essas alterações para o repositório a partir do qual a implantação será iniciada (via GitlabCI) e vemos o resultado:
Nosso Serviço apontará para ambas as implantações, já que ambas possuem o seletor de aplicativos. Devido à randomização padrão do Kubernetes, devemos ver respostas diferentes para aproximadamente 10% das solicitações:
O estado atual da nossa aplicação (GitOps, retirado do Git como Single Source Of Truth) é a presença de duas implantações com réplicas ativas, uma para cada versão.
Cerca de 10% dos usuários se familiarizam com uma nova versão e a testam involuntariamente. Agora é a hora de verificar se há erros nos logs e monitorar os dados para encontrar problemas.
Etapa 2: liberar a nova versão para todos os usuários
Decidimos que tudo correu bem e agora precisamos lançar a nova versão para todos os usuários. Para fazer isso, simplesmente atualizamos deploy.yaml instalando uma nova versão da imagem e o número de réplicas igual a 10. Em deploy-canary.yaml definimos o número de réplicas de volta para 0. Após a implantação, o resultado será o seguinte:
Resumindo
Para mim, executar a implantação manualmente dessa forma ajuda a entender como ela pode ser facilmente configurada usando k8s. Como o Kubernetes permite atualizar tudo por meio de uma API, essas etapas podem ser automatizadas por meio de scripts.
Outra coisa que precisa ser implementada é um ponto de entrada do testador (LoadBalancer ou via Ingress) através do qual somente a nova versão poderá ser acessada. Ele pode ser usado para navegação manual.
Em artigos futuros, verificaremos outras soluções automatizadas que implementam a maior parte do que fizemos.