Como habilitar a atualização automática de contêineres Podman

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.autoupdateró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:latesto link mostrado acima é intencional, nginx:latestpois é 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 systemctlcomandos 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 sudopara seguir o exemplo acima; se sim, execute auto-updateo comando também como root:

$ sudo podman auto-update

Neste registryexemplo, 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-updateo --dry-runcomando 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 pendingtê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-updatecomando.

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 edite alterando o valor do OnCalendarcampo :

$ 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.autoupdatecontê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-updatedentro 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-runexecutar 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

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *