Atualizar contêiner do Docker sem tempo de inatividade

16

Digamos que eu tenha um contêiner do Docker com um servidor da Web (como o Apache 2). Agora eu quero atualizar o sistema operacional sob ele. Esta resposta SF diz que a melhor maneira é reconstruir a imagem base e a imagem do Apache. Mas a implantação da imagem significa tempo de inatividade, pois preciso excluir o contêiner antigo antes de poder criar o novo, portanto, há apenas um contêiner que está sendo vinculado à porta 80/443.

Mas como posso implementar essa atualização sem tempo de inatividade? Devo usar um balanceador de carga e usar comunicação entre contêineres? E como atualizo o balanceador de carga?

    
por das_j 29.12.2014 / 22:48

1 resposta

17

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.

  1. Retirar B dos back-ends qualificados para o balanceador de carga, para que ele não aceite mais tráfego.
  2. aguarde a exibição das solicitações atualmente em vigor e as conexões existentes estão fechadas.
  3. atualize o contêiner ou VM subjacente que serve B
  4. reinicie B, espere que ele seja carregado e comece a funcionar
  5. teste B para garantir que ele está atendendo a novas solicitações corretamente
  6. 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:

  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 diretamente para o balanceador de carga em vez do IP do contêiner
  3. adicione um back-end do 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 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:

      1. remova B da configuração de DNS
      2. aguarde até que a entrada B no DNS desapareça (ou seja, aguarde que TTL expire)
      3. 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:

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

    
por 03.01.2015 / 00:06