Como é que o Kubernetes irá atualizar os segredos, se eu tiver seis réplicas de pods com o mesmo segredo?
sobes.tech IA
Resposta da IA
O Kubernetes não atualiza os segredos diretamente durante a execução do pod. Os pods usam uma cópia exata do segredo que existia no momento do seu início.
Para que os pods "vejam" o segredo atualizado, é necessário reiniciá-los ou recriá-los. As estratégias de implantação populares para isso são:
-
Atualização contínua (Rolling Update): Os pods antigos são substituídos gradualmente por novos com o segredo atualizado. Esta é a estratégia padrão para Deployments.
-
Recriar: Todos os pods antigos são eliminados simultaneamente e depois criados novos. Isso provoca uma breve interrupção do serviço.
-
Implantação azul/verde: Uma nova versão completa da aplicação (com o segredo atualizado) é implantada paralelamente à antiga. Após a verificação, todo o tráfego é redirecionado para a nova versão e a antiga é eliminada.
-
Lançamento canário: Uma nova versão da aplicação (com o segredo atualizado) é implantada a um pequeno subconjunto de utilizadores, aumentando gradualmente o tráfego para ela.
Ao usar ConfigMaps e Secrets montados como ficheiros, as alterações no segredo podem ser atualizadas automaticamente dentro do pod já em execução, mas isso ocorre com alguma demora (kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-files-from-a-pod). No entanto, para usar um segredo, por exemplo, em variáveis de ambiente, é necessário reiniciar o pod.
Exemplo de atualização de Deployment usando Rolling Update:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 6
selector:
matchLabels:
app: my-app
strategy:
type: RollingUpdate # Estratégia padrão
rollingUpdate:
maxUnavailable: 1 # Número máximo de pods indisponíveis durante a atualização
maxSurge: 1 # Número máximo de novos pods criados acima do número desejado de réplicas
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: my-image:latest
env:
- name: MY_SECRET_VALUE
valueFrom:
secretKeyRef:
name: my-secret # Nome do segredo
key: my-key # Chave do segredo
Após alterar o segredo my-secret, é necessário atualizar o Deployment (por exemplo, alterando a versão da imagem ou adicionando uma anotação) para disparar o Rolling Update:
kubectl apply -f deployment.yaml
O Kubernetes detectará as alterações na especificação do Deployment e começará a criar novos pods que terão acesso ao segredo atualizado. Os pods antigos serão terminados.