O cenário de destino ideal
Sim, você deve usar um balanceador de carga e atualizar uma instância por vez. Não tenho certeza de onde entra a comunicação entre contêineres.
Como exemplo, imagine que você tenha um balanceador de carga que atenda ao seu site A. Os usuários só se conectam a ele como e o conhecem apenas como "A". O balanceador de carga sabe que há dois ou mais back-ends (B, C, etc.) e se eles são VMs ou contêineres não importam.
Em seguida, você deseja atualizar os back-ends, que neste caso são instâncias do Apache.
- Retirar B dos back-ends qualificados para o balanceador de carga, para que ele não aceite mais tráfego.
- aguarde a exibição das solicitações atualmente em vigor e as conexões existentes estão fechadas.
- atualize o contêiner ou VM subjacente que serve B
- reinicie B, espere que ele seja carregado e comece a funcionar
- teste B para garantir que ele está atendendo a novas solicitações corretamente
- adicione B de volta ao pool de back-ends do balanceador de carga para reativar o tráfego
Em seguida, faça o mesmo processo para C, D, etc.
Observe que há uma solicitação aberta para atualizações in-loco de contêineres do Docker , a partir de novembro de 2013, mas não parece ter muito progresso, então a solução acima é o que você deve fazer nesse meio tempo.
O que fazer para um site ativo existente
Presumivelmente, você está perguntando isso porque você já está executando um site ao vivo neste modelo e gostaria de atualizá-lo sem tempo de inatividade. Então, precisamos chegar ao estado alvo ideal acima, mas incrementalmente.
Vamos supor que:
- você tem um nome DNS apontando para seu contêiner
- seu contêiner é executado em algum endereço IP
- seus usuários não sabem o endereço IP do contêiner e não estão codificados em nenhum lugar
Se essas suposições forem falsas, você deve primeiro corrigi-las de forma que isso esteja correto.
Em seguida, siga estas etapas:
- crie um balanceador de carga em um novo IP e aponte-o para o contêiner existente como seu único back-end
- altere o DNS para apontar diretamente para o balanceador de carga em vez do IP do contêiner
- adicione um back-end do Apache idêntico com a mesma configuração de contêiner VM +
- agora você tem um balanceador de carga com dois back-ends B e C, então siga as instruções na seção "cenário de destino ideal" para atualizá-los um por vez
Como atualizar um balanceador de carga
A maneira fácil (hospedada)
A opção mais fácil é não executar seu próprio balanceador. Por exemplo, se você estiver usando uma plataforma de nuvem que fornece balanceamento de carga como um serviço, considere usá-la e, em seguida, a manutenção e a atualização do balanceador de carga não são um problema.
O caminho manual
Se você estiver executando seu próprio balanceador de carga, adicionar outra camada de indireto (por exemplo, DNS) ajudará. Vamos supor o seguinte:
- que temos um nome de host resolvido para o IP do nosso balanceador de carga A que gostaríamos de atualizar
- nosso balanceador de carga tem um pool de back-end de P1, P2, etc.
Procederemos da seguinte forma:
- crie um novo balanceador de carga B com a nova versão do software
- adicione todas as instâncias do pool de back-end P1, P2, etc. ao nosso novo balanceador de carga B como backends
-
adicione o endereço IP de B à resolução de DNS juntamente com A
- agora estamos usando efetivamente o DNS como um balanceador de carga
- se as entradas de A e B não forem ponderadas, elas serão efetivamente de 50 a 50
- agora assista para ver como o B se comporta, se há algum erro, etc.
-
se algo estiver errado com B, desfaça o seguinte:
- remova B da configuração de DNS
- aguarde até que a entrada B no DNS desapareça (ou seja, aguarde que TTL expire)
- recusar B
- suponha que você tenha feito o teste de "burn-in" para B e está tudo bem
- atualize a prioridade e peso para B no DNS gradualmente
- remova totalmente o A do DNS
- aguarde que o DNS TTL expire; A não deveria estar recebendo mais solicitações
- recusar A
e pronto.
Detalhes, diagramas e ferramentas
Veja estes artigos e ferramentas que podem ajudá-lo a automatizar o processo, mas a ideia geral é a mesma:
- Quay: implantações com tempo de inatividade zero
- Zero Downtime Frontend implementa com o Vulcand no CoreOS
A moral
"Todos os problemas em ciência da computação podem ser resolvidos por outro nível de indireção, exceto, é claro, pelo problema de muitas indirecções." - David Wheeler