Boas Práticas
As boas práticas aqui descritas são excertos das fontes pesquisadas, de forma a serem lidas por completo como uma lista de itens a validar.
Fontes
Leitura Obrigatória
Leituras Opcionais
Diretrizes
Ambiente de Desenvolvimento
- Usar 2FA/MFA para autenticação nas plataformas de desenvolvimento, sempre que houver: GitLab, GitHub etc.
- Recomendação de ferramenta: Visual Studio Code ou equivalente como Gitpod e outros.
- Extensões: GitLens, Indented Block HighLighting, Kubernetes, REST Client e Settings Sync.
Controle de versão
- Arquivos em YAML e validados e organizados por alguma ferramenta como YAML Lint.
- Todos os arquivos de configuração sob controle de versão.
- Uso de ramos para cada estágio do código: desenvolvimento (
desenvolvimento
), teste (testes
), produção (master
) e código fora de uso (abandonado
). - Os namespaces devem estar alinhados com os estágios de desenvolvimento, com especial cuidado na sequência: quando pronto o código para o próximo estágio, deve-se alterar primeiramente o namespace para depois mesclar (
git merge
) no ramo da próxima etapa.
Definição das imagens Docker
- Preferir sempre a menor imagem possível: Alpine, depois Debian Slim, depois os demais…
- Verificar se a instalação dos pacotes (
apk
,apt
) irá gerar uma imagem muito grande, e daí considerar outra distribuição mais adequada/pronta. - Criar um webhook no Docker Hub para criar/atualizar a imagem e salvar a URL no repositório privado de webhooks.
- Quando usado código de terceiro, preferir sempre a política de atualização deste. Quando houver dúvidas na política, fixar as imagens pelo número primário (major) e acompanhar regularmente (assinatura de email, changelog etc.) a publicação de novas versões. A leitura das modificações é importante por dois motivos: compatibilidade com a(s) versão(ões) anterior(es) e possível mudança nos parâmetros padrão de configuração.
- Quando houver uma atualização de versão, a política mais simples é a de encerrar os atuais pods e esperar o sistema (
ReplicaSet
) convergir para a quantidade de pods definida. - Executar com usuário com o mínimo de privilégios, evitando ao máximo root.
Definição dos objetos Kubernetes
- Labels da aplicação: nome (
app
), tipo (type
, comobackend
oudatabase
), versão (vX.X.X
), entre outros específicos por serviço/aplicação. - O namespace deve estar incluído na definição do objeto, já que usamos vários repositórios (GitLab e GitHub).
- KISS: valores padrão são omitidos.
- Recursos: tanto recursos mínimos (
resources
) quanto limites (limits
). Sempre. Se houver dúvida dos valores, pode executar uma primeira vez, observar os números no Grafana para executar novamente com os valores próximos da realidade. - Sempre que possível, deve haver monitoramento constante da aplicação com livenessProbe. Para aplicações HTTP, obrigatório monitoramento, direto do protocolo. Para os demais serviços, teste TCP ou, no pior caso, comando a ser executado.
Ordem dos objetos K8s
- Volumes:
Secret
,ConfigMap
,PersistentVolume
; - Associações de volumes:
PersistentVolumeClaim
; - Ingresso:
Ingress
; - Serviço:
Service
; - Pods:
Deployment
,StatefulSet
,DaemonSet
. - Tarefas:
Job
,CronJob
.
Atualização de ambiente
- Ler changelog, sempre. Os valores padrão podem ser alterados, e portanto deve-se ter cuidado.