Sobes.tech
Middle+

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.