O cenário alvo 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 serve ao site A. Os usuários só se conectam a ele como e o conhecem como "A". O balanceador de carga sabe que existem dois ou mais back-end (B, C etc.) e se são VMs ou contêineres não importa.
Em seguida, você deseja atualizar os back-end, que neste caso são instâncias do Apache.
- tire B dos back-ends qualificados para o balanceador de carga, para que ele não aceite mais nenhum tráfego.
- aguarde até que as solicitações atualmente ativas sejam atendidas e as conexões existentes fechadas.
- atualizar o contêiner ou VM subjacente que serve B
- reinicie B, aguarde o carregamento e comece a trabalhar
- teste B para garantir que está atendendo a novas solicitações corretamente
- adicione B ao pool de back-end 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 ele não parece ter muito progresso; portanto, 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 já está executando um site ativo neste modelo e gostaria de atualizá-lo sem tempo de inatividade. Portanto, precisamos chegar ao estado-alvo ideal acima, mas de forma incremental.
Vamos supor que:
- você tem um nome DNS apontando para o 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 é codificado em nenhum lugar
Se essas suposições forem falsas, primeiro você deve corrigi-lo para 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 para o balanceador de carga em vez do IP do contêiner diretamente
- adicione um backend 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 de cada 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 em nuvem que fornece balanceamento de carga como um serviço, considere usá-lo e, em seguida, a manutenção e atualização do balanceador de carga não serão um problema.
A maneira manual
Se você estiver executando seu próprio balanceador de carga, adicionar outra camada de indireção (ou seja, DNS) ajudará. Vamos assumir o seguinte:
- que temos um nome de host resolvendo o IP do nosso balanceador de carga A que gostaríamos de atualizar
- nosso balanceador de carga possui um pool de back-end de P1, P2 etc.
Nós procedemos da seguinte forma:
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:
A moral
"Todos os problemas em ciência da computação podem ser resolvidos por outro nível de indireção, exceto, é claro, o problema de muitos indireções". - David Wheeler