Atualizar contêiner do Docker sem tempo de inatividade

17

Digamos que eu tenha um contêiner do Docker com um servidor da Web (como o Apache 2). Agora eu quero atualizar o SO nele. Esta resposta do SF diz que a melhor maneira é reconstruir a imagem base e a minha imagem Apache. Porém, implantar a imagem significa tempo de inatividade porque tenho que excluir o contêiner antigo antes de poder criar o novo, portanto, existe apenas um contêiner vinculado à porta 80/443.

Mas como implantar esta atualização com zero tempo de inatividade? Devo usar um balanceador de carga e usar a comunicação entre contêineres? E como atualizo o balanceador de carga?

das_j
fonte

Respostas:

18

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.

  1. tire B dos back-ends qualificados para o balanceador de carga, para que ele não aceite mais nenhum tráfego.
  2. aguarde até que as solicitações atualmente ativas sejam atendidas e as conexões existentes fechadas.
  3. atualizar o contêiner ou VM subjacente que serve B
  4. reinicie B, aguarde o carregamento e comece a trabalhar
  5. teste B para garantir que está atendendo a novas solicitações corretamente
  6. 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:

  1. crie um balanceador de carga em um novo IP e aponte-o para o contêiner existente como seu único back-end
  2. altere o DNS para apontar para o balanceador de carga em vez do IP do contêiner diretamente
  3. adicione um backend Apache idêntico com a mesma configuração de contêiner VM +
  4. 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:

  • crie um novo balanceador de carga B com a nova versão do software
  • adicione todas as instâncias de pool de back-end P1, P2 etc. ao nosso novo balanceador de carga B como back-end
  • adicione o endereço IP de B à resolução DNS juntamente com A

    • agora estamos efetivamente usando o DNS como um balanceador de carga
    • se as entradas de A e B não forem ponderadas, elas são efetivamente de 50 a 50
    • Agora observe para ver o desempenho de B, se há algum erro etc.
    • se algo estiver errado com B, desfaça o seguinte:

      1. remova B da configuração do DNS
      2. aguarde a entrada B no DNS desaparecer (ou seja, espere o TTL expirar)
      3. vire B
  • suponha que você tenha feito o teste "burn-in" para B e está tudo bem
  • atualizar a prioridade e o peso de B no DNS gradualmente
  • remover completamente A do DNS
  • aguarde o TTL do DNS expirar; A não deve mais receber solicitações
  • vire 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:

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

Misha Brukman
fonte
Mas quando o balanceador de carga também está em um contêiner (ao usar o CoreOS), como atualizo esse contêiner?
das_j
@das_j Editei a resposta para adicionar instruções sobre como atualizar um balanceador de carga. Dica: trata-se de outro nível de indireção. :-)
Misha Brukman
1
Em suma, isso parece como atualizar alguém servidores físicos e balanceadores de carga físicos também.
precisa saber é o seguinte
@StefanLasiewski, você está absolutamente certo e removi a nota "containers" em um dos títulos. Para um usuário externo, se um aplicativo ou balanceador de carga está sendo executado em bare metal, contêiner ou VM, é praticamente invisível.
precisa saber é o seguinte