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ê tem um balanceador de carga que atende ao seu site A. Os usuários se conectam apenas a ele como e só o conhecem como "A". O balanceador de carga sabe que existem dois ou mais backends (B, C, etc.), e se eles são VMs ou contêineres não importa.
Em seguida, você deseja atualizar os back-ends, que neste caso são instâncias do Apache.
- tire B dos back-ends elegíveis para o balanceador de carga para que ele não aceite mais nenhum tráfego.
- aguarde até que as solicitações atuais sejam atendidas e as conexões existentes sejam fechadas.
- atualize o contêiner ou VM subjacente que serve B
- reinicie B, espere que ele carregue e comece a trabalhar
- teste B para se certificar de que está atendendo a novas solicitações corretamente
- adicionar B de volta 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á um solicitação aberta para atualizações In-loco de contêineres 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 ao vivo existente
Presumivelmente, você está perguntando isso porque 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 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, 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 para o balanceador de carga em vez do IP do contêiner diretamente
- adicione um back-end Apache idêntico com a mesma configuração de contêiner VM +
- agora você tem um balanceador de carga com dois backends 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 de 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 é 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 supor o seguinte:
- que temos um nome de host resolvendo 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.
Procedemos da seguinte forma:
e acabaste.
Detalhes, diagramas e ferramentas
Veja esses write-ups e ferramentas que podem ajudá-lo a automatizar o processo, mas a ideia geral é a mesma:
moral
"Todos os problemas na ciência da computação podem ser resolvidos por outro nível de indireção, exceto, é claro, pelo problema de muitas indireções." — David Wheeler