Como habilitar atualizações automáticas de contêiner Podman

0
40


O Podman é uma plataforma de conteinerização compatível com OCI que é frequentemente usada em vez do Docker. Seu modelo sem daemon e rico conjunto de recursos o tornam um bom candidato para uso em desenvolvimento e produção.

DML Y DDL comando basicos
DML Y DDL comando basicos

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 periodicamente para verificar atualizações, extrair a imagem mais recente e recriar os contêineres afetados usando sua configuração atual.

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 um ponto de apoio em seu aplicativo que é explorado horas após a descoberta.

As tecnologias de contêiner mais populares exigem que você atualize manualmente seus contêineres. Isso sobrecarrega as equipes de operações para assinar anúncios de lançamento e criar ferramentas que implementam novas alterações.

O sistema de atualização de contêiner integrado do Podman aborda esse desafio e mantém as cargas de trabalho atualizadas. Os contêineres podem ser atualizados rapidamente após o envio de novas versões de imagem, dando a você a tranquilidade de saber que suas implantações estão executando os patches e correções de bugs mais recentes.

Habilitando atualizações automáticas

As atualizações automáticas são ativadas para um contêiner definindo o io.containers.autoupdate etiqueta ao criá-la.

$ podman run -d -p 8080:80 
    --name nginx-container 
    --label io.containers.autoupdate=registry 
    docker.io/library/nginx:latest

A tag pode ter dois valores possíveis:

  • registry – Durante as verificações de atualização, o Podman entrará em contato com o registro de imagens para verificar se a tag utilizada pelo seu container possui uma nova versão disponível. A imagem será extraída e seu contêiner será reiniciado quando for o caso. As atualizações do registro só funcionam quando você usa um caminho de registro completo: o docker.io/library/nginx:latest referência mostrada acima é intencional, uma vez que nginx:latest é muito vago.
  • local – Este método de atualização restringe o Podman a examinar 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 em execução no contêiner. Isso pode ser útil ao reconstruir imagens durante o desenvolvimento.

A presença da tag torna este contêiner NGINX de amostra qualificado para atualizações automáticas. No entanto, é necessário mais trabalho antes que as atualizações possam ser aplicadas.

Criar 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 possui daemons, ele não possui um controlador central que possa iniciar e interromper seus contêineres. Envolvê-los em um serviço systemd fornece recursos de gerenciamento de ciclo de vida e a opção de reinicialização em resposta a eventos específicos.

A CLI do Podman inclui um comando que cria uma definição de unidade 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 enable nginx-container.service
$ systemctl start nginx-container.service

Seu contêiner NGINX agora é um serviço systemd que será iniciado automaticamente quando seu host for iniciado. Você pode usar systemctl comandos para iniciar e parar o 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, desabilitar e remover o arquivo de unidade do serviço. Reinicie o systemd depois para aplicar totalmente a alteração.

$ systemctl stop nginx-container.service
$ systemctl disable nginx-container.service
$ rm /etc/systemd/system/nginx-container.service
$ systemctl daemon-reload

Executando uma atualização

Agora tudo está configurado para atualizar automaticamente seu contêiner NGINX com sucesso. Você pode executar uma verificação de atualização sob demanda usando o Podman’s auto-update domínio:

$ podman auto-update
Trying to pull docker.io/library/nginx:latest...
Getting image source signatures
...
UNIT                     CONTAINER      IMAGE                               POLICY      UPDATED
nginx-container.service  2de4ba96b09    docker.io/library/nginx:latest      registry    true

Isso atualiza os contêineres nos serviços do systemd que podem ser acessados ​​pelo usuário que executa o comando. Você pode ter precisado usar sudo seguir o exemplo acima; se sim, execute o auto-update comando como root também:

$ sudo podman auto-update

a registry Neste exemplo, uma estratégia de atualização foi usada, então o Podman se conecta ao registro de imagem, verifica as alterações e, em seguida, extrai a nova imagem, se houver. A saída do comando indica se o contêiner de cada serviço foi atualizado.

Como o systemd gerencia contêineres, o Podman pode detectar se o novo contêiner foi iniciado com êxito. O Podman reverterá automaticamente para a versão anterior de uma imagem se um erro de atualização for detectado. Para que isso funcione de forma confiável, o aplicativo dentro do contêiner deve notificar o systemd quando for iniciado com sucesso. Você pode fazer isso executando systemd-notify --ready.

Verificando atualizações

Às vezes, pode ser necessário verificar se há atualizações disponíveis na sua frota de contêineres sem aplicá-las imediatamente. Use o auto-update comando com o --dry-run flag para obter uma lista de serviços onde uma imagem atualizada foi publicada:

$ podman auto-update --dry-run
...
UNIT                     CONTAINER      IMAGE                               POLICY      UPDATED
nginx-container.service  2de4ba96b09    docker.io/library/nginx:latest      registry    pending

Serviços mostrados como pending tem uma atualização disponível.

Aplicação de atualizações em um cronograma

Agora, configuramos com êxito as atualizações de contêiner sob demanda. Você não precisa extrair manualmente novas imagens ou reiniciar seus contêineres. A etapa final é configurar um cronograma para que o Podman aplique atualizações periodicamente, sem que você execute o auto-update domínio.

A maioria das distribuições do Podman inclui um timer systemd 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 OnCalendar campo:

$ systemctl edit podman-auto-update.timer

[Timer]
OnCalendar=Fri *-*-* 18:00

A expressão de tempo mostrada acima executará a verificação de atualização toda sexta-feira às 18h. A sintaxe está documentada no manual do systemd.

Agora que o cronômetro está ativado, você pode começar a implantar seus contêineres com o io.containers.autoupdate etiqueta. Eles serão atualizados e reiniciados regularmente, automatizando seus procedimentos de manutenção.

Você não precisa usar o timer systemd do Podman para criar um agendamento de atualização. você poderia correr podman auto-update dentro de sua ferramenta existente ou outro agendador de trabalho 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 patches de segurança.

Embora as atualizações automáticas sejam uma ferramenta útil, elas não devem ser usadas sem a devida consideração. Permitir atualizações automáticas pode apresentar seus próprios problemas se uma imagem quebrada for liberada acidentalmente. Os contêineres de reinicialização automática também podem causar tempo de inatividade ou interromper serviços dependentes.

Conseqüentemente, você deve avaliar a adequação de seu próprio aplicativo antes de implementar esta solução. Uma abordagem intermediária é executar auto-update --dry-run periodicamente e enviar os resultados para um serviço de monitoramento. Isso mantém você informado sobre as atualizações disponíveis sem incorrer nos riscos de aplicá-las sem aprovação.