Como habilitar a atualização automática de contêineres Podman
Podman é uma plataforma de conteinerização compatível com OCI que é frequentemente usada no lugar do Docker. Seu modelo sem daemon e extenso conjunto de recursos o tornam um bom candidato para uso em desenvolvimento e produção.
Neste artigo, mostraremos como usar o sistema de atualização automática do Podman para reiniciar seus contêineres quando novas imagens forem lançadas. O Podman pode ser configurado para verificar periodicamente as atualizações, extrair a imagem mais recente e regenerar os contêineres afetados usando suas configurações atuais.
Por que atualizar contêineres automaticamente?
Os contêineres geralmente têm vida curta, mas ainda precisam de manutenção regular. Uma vulnerabilidade crítica em uma imagem pode dar aos invasores acesso ao seu aplicativo, que será explorado horas depois de ser descoberto.
A maioria das tecnologias de contêiner populares exige que você atualize manualmente seus contêineres. Isso coloca o ônus nas equipes de operações de se inscrever para anúncios de lançamento e criar ferramentas que implementam novas alterações.
O sistema de atualização de contêiner integrado do Podman resolve esse problema e mantém as cargas de trabalho atualizadas. Os contêineres podem ser atualizados rapidamente depois que novas versões de imagem são inseridas, garantindo que suas implantações estejam atualizadas com os patches e correções de bugs mais recentes.
Ativar atualizações automáticas
As atualizações automáticas são habilitadas para um contêiner definindo um io.containers.autoupdate
rótulo quando ele é criado.
$ podman run -d -p 8080:80 \
–name nginx-container\
–label io.containers.autoupdate=registry\
docker.io/library/nginx:latest
O rótulo pode ter dois valores possíveis:
registry
– Durante a verificação de atualizações, o Podman verificará com o registro de imagens se uma nova versão da tag usada pelo seu contêiner está disponível. Nesse caso, a imagem será extraída e seu contêiner será reiniciado. As atualizações do registro só funcionam se você usar o caminho completo do registro –docker.io/library/nginx:latest
o link mostrado acima é intencional,nginx:latest
pois é muito vago.local
– Este método de atualização impede que o Podman visualize imagens de contêiner que já existem no sistema de arquivos do seu host. O contêiner será reiniciado se a versão local da tag de imagem for diferente da versão na qual o contêiner está sendo executado. Isso pode ser útil ao reconstruir imagens durante o desenvolvimento.
A presença do rótulo torna este contêiner NGINX de amostra elegível para atualizações automáticas. No entanto, é necessário mais trabalho antes que as atualizações possam realmente ser aplicadas.
Criando um serviço Systemd
O mecanismo de atualização do Podman requer que seus contêineres sejam executados dentro dos serviços do systemd. Como o Podman não tem daemon, ele não possui um controlador central que possa iniciar e parar seus contêineres. Envolvê-los em um serviço systemd fornece recursos de gerenciamento de ciclo de vida e a capacidade de reiniciar em resposta a determinados eventos.
A CLI do Podman inclui um comando que cria uma definição de módulo systemd a partir de um contêiner:
$ podman generate systemd --name nginx-container > /etc/systemd/system/nginx-container.service
Os comandos acima criam um novo contêiner NGINX com um serviço systemd no local correto.
Em seguida, recarregue o systemd para registrar a definição do serviço, ative e inicie o serviço:
$ systemctl daemon-reload
$ systemctl habilita nginx-container.service
$ systemctl start nginx-container.service
Seu contêiner NGINX agora é um serviço systemd que inicia automaticamente quando seu host é inicializado. Você pode usar systemctl
comandos para iniciar e parar um contêiner em vez da CLI do Podman:
$ systemctl start nginx-container.service
$ systemctl stop nginx-container.service
Para remover o contêiner no futuro, você deve parar, desativar e excluir o arquivo do módulo de serviço. Depois disso, reinicie o systemd para aplicar totalmente as alterações.
$ systemctl stop nginx-container.service
$ systemctl desativar nginx-container.service
$ rm /etc/systemd/system/nginx-container.service
$ systemctl daemon-reload
Executando uma atualização
Agora tudo está configurado para uma atualização automática bem-sucedida do contêiner NGINX. Você pode executar uma verificação de atualização sob demanda usando o comando Podman auto-update
:
$ podman auto-update
Tentando puxar docker.io/library/nginx:latest…
Obtendo assinaturas de fonte de imagem
…
POLÍTICA DE IMAGEM DO RECIPIENTE DA UNIDADE ATUALIZADA
nginx-container.service 2de4ba96b09 docker.io/library/nginx:latest registry true
Isso atualiza os contêineres nos serviços systemd que estão disponíveis para o usuário que executa o comando. Você pode precisar usar sudo
para seguir o exemplo acima; se sim, execute auto-update
o comando também como root:
$ sudo podman auto-update
Neste registry
exemplo, uma estratégia de atualização foi usada, portanto, o Podman se conecta ao registro de imagem, verifica as alterações e, em seguida, obtém uma nova imagem, se aplicável. A saída do comando mostra se cada contêiner de serviço foi atualizado.
Como os contêineres são gerenciados pelo systemd, o Podman pode determinar se um novo contêiner foi iniciado com êxito. O Podman reverterá automaticamente para uma versão anterior da imagem se uma falha de atualização for detectada. Para que isso funcione de forma confiável, o aplicativo dentro do contêiner deve notificar o systemd de que foi iniciado com êxito. Isso pode ser feito executando systemd-notify --ready
.
verificando atualizações
Às vezes, você pode querer verificar se as atualizações estão disponíveis para sua frota de contêineres sem aplicá-las imediatamente. Use auto-update
o --dry-run
comando flag para obter uma lista de serviços em que a imagem atualizada é publicada:
$ podman auto-update --dry-run
…
POLÍTICA DE IMAGEM DO RECIPIENTE DA UNIDADE ATUALIZADA
nginx-container.service 2de4ba96b09 docker.io/library/nginx:latest registry pending
Os serviços mostrados pending
têm uma atualização disponível.
Aplicar atualizações em uma programação
Agora, configuramos com êxito as atualizações de contêiner sob demanda. Você não precisa extrair manualmente novas imagens ou reiniciar contêineres. A etapa final é configurar um agendamento para que o Podman aplique atualizações periodicamente sem executar um auto-update
comando.
A maioria das distribuições do Podman inclui um temporizador do sistema para essa finalidade. Você pode ativar o temporizador usando systemctl
:
$ systemctl enable podman-auto-update.timer
O cronômetro está configurado para verificar atualizações todos os dias. Você pode personalizar a programação abrindo o arquivo de timer usando systemctl edit
e alterando o valor do OnCalendar
campo :
$ systemctl edit podman-auto-update.timer
[Cronômetro]
OnCalendar=Fri *-*-* 18:00
A expressão de hora mostrada acima executará a verificação de atualização toda sexta-feira às 18:00. A sintaxe é descrita no manual do systemd .
Agora que o cronômetro está ativado, você pode começar a implantar seus io.containers.autoupdate
contêineres rotulados. Eles serão atualizados e reiniciados periodicamente, automatizando os procedimentos de manutenção.
Você não precisa usar o timer do sistema do Podman para agendar atualizações. Você pode executar podman auto-update
dentro do seu kit de ferramentas existente ou outro agendador de tarefas, como cron
.
Resumo
As atualizações automáticas do Podman permitem mover contêineres para novas versões de imagem sem reiniciá-los manualmente ou usar ferramentas externas. Isso pode ajudá-lo a manter sua frota de contêineres à medida que as imagens liberam correções de bugs e correções de segurança.
Embora as atualizações automáticas sejam uma ferramenta útil, elas não devem ser usadas sem o devido cuidado. Permitir atualizações automáticas pode levar a problemas próprios se uma imagem corrompida for liberada acidentalmente. Os contêineres que reiniciam sozinhos também podem causar tempo de inatividade ou interromper serviços dependentes.
Portanto, você deve avaliar a adequação de seu próprio aplicativo antes de implementar esta solução. Uma abordagem intermediária é auto-update --dry-run
executar periodicamente e enviar os resultados para o serviço de monitoramento. Isso informa sobre as atualizações disponíveis sem colocá-las em risco de serem aplicadas sem aprovação.
Deixe um comentário