Docker e nginx upstream zero downtime

1

Estou tendo alguns problemas estranhos tentando automatizar a implantação de contêineres docker usando a diretiva upstream do nginx. Por algum motivo, quando faço manualmente o seguinte, funciona, mas quando tento automatizá-lo, não obtenho resultados consistentes.

Basicamente eu puxo a imagem mais recente pare, remova o 1 de 2 contêineres em execução Então inicie o container Em seguida, atualize o arquivo conf upstream do nginx Recarregar configuração nginx. Repita para o segundo recipiente.

Parece simples, mas por algum motivo eu posso fazer isso funcionar em um script bash o tempo todo. Estou usando o cerco para carregar o teste do aplicativo.

siege -d1 -t75S -c25 http://192.168.49.4:8087

Meu script para automatizar a implantação As imagens mais recentes são obtidas antes de executar o script.

#! /bin/bash

appname=appnamexyz;
appport=8000;
host_ip=192.168.49.4;
registry=192.168.254.96;

echo "upstream api_servers {${nl}
  server $(docker port ${appname}-1 ${appport}) max_fails=2 fail_timeout=1s;${nl}
  server $(docker port ${appname}-2 ${appport}) max_fails=2 fail_timeout=1s;${nl}
}" > /etc/nginx/conf.d/api_upstream.conf

sed -i "s/server $(docker port $appname-1 $appport)/server xxx/g" /etc/nginx/conf.d/api_upstream.conf

docker stop $appname-1
docker rm -f $appname-1
docker run -d --name $appname-1 -p $host_ip::$appport $registry:5000/$appname -APIKey=e5e1c4b8e46d563c3 

sed -i "s/server xxx/server $(docker port $appname-1 $appport)/g" /etc/nginx/conf.d/api_upstream.conf
nginx -s reload



sleep 15s

sed -i "s/server $(docker port $appname-2 $appport)/server xxx/g" /etc/nginx/conf.d/api_upstream.conf

docker stop $appname-2
docker rm -f $appname-2
docker run -d --name $appname-2 -p $host_ip::$appport $registry:5000/$appname -APIKey=e5e1c4b8e46d563c350b7

sed -i "s/server xxx/server $(docker port $appname-2 $appport)/g" /etc/nginx/conf.d/api_upstream.conf
nginx -s reload
cat /etc/nginx/conf.d/api_upstream.conf

O aplicativo retornará 200s e, ao reiniciar o segundo contêiner, receberemos 500.502 erros. Aqui está o meu arquivo conf para o aplicativo.

server {
  listen 8087;
  server_name 192.168.49.4;

  location / {
    proxy_pass http://api_servers;
    proxy_next_upstream     error timeout invalid_header http_500 http_502 http_504;
    proxy_connect_timeout   1;
  }
}

O que devo fazer para remediar isso?

    
por user2108258 04.11.2014 / 00:10

2 respostas

0

Enquanto 502 corresponde ao tempo limite de back-end, 500 é um erro do servidor, indicando um erro de configuração. Você pode querer corrigir o seguinte em primeira mão:

Antes do sono, você substituiu a primeira linha de api_upstream.conf por

sed -i "s/server xxx/server $(docker port $appname-1 $appport)/g" /etc/nginx/conf.d/api_upstream.conf

(Você até faz duas vezes ... propósito? Copiar e colar?)

Mas o que você ainda não fez naquele momento está substituindo a segunda linha, que permanece sendo

server $(docker port ${appname}-2 ${appport}) max_fails=2 fail_timeout=1s;${nl}

Suponho que $appname e $appport estejam vazios, fazendo com que a subshell falhe / fique vazia, o que significa que essa linha é realmente interpretada como

server max_fails=2 fail_timeout=1s;

Quando o balanceamento de carga das solicitações com o round-robin padrão, o nginx pode enfrentar um problema lá ...

Você deve garantir que api_upstream.conf sempre contenha dados válidos assim que for usado. Você pode adicionar server s mais tarde, mas deixar um espaço reservado parcialmente escrito não produzirá nada de bom.

    
por 04.11.2014 / 09:02
1

Já tive algo do mesmo problema: os tempos de inicialização do contêiner não são os mesmos em toda a implantação da imagem ... Assim, reinicializar um contêiner de um contêiner nem sempre é tão rápido ... só que você teria que configurar algum tipo de verificação de consistência antes de girar o outro container ... Você pode até mesmo querer acertar o container do shell script para fazer um healthcheck ao invés de apenas esperar um 15sec arbitrário ...? / p>     

por 04.11.2014 / 12:53

Tags