Tengo un par de aplicaciones implementadas en instancias de contenedor azul a las que accedo a través de API de matraces, ahora estoy creando un controlador para iniciar / detener los contenedores, por ejemplo.

App1 está en container1, si recibo una solicitud a app1, mi flujo de trabajo es:

1) Start the contianer1 from a python subprocess using azure CLI comands 
2) Make the API call to app1
3) Get the result and stop the container 

Como puedo tener más de una solicitud a la vez, estoy manejando ese proceso en una función add is feed to redis queue como se muestra a continuación:

def make_call(arg1,arg2,arg3):


    start_container = 'az container start --name mycontainer  --resource-group mygroup'
    subprocess.call([start_container],shell=True)



    data = dict()
    data['query'] = {'query':"query"}
    #### 


    url = "http://api_url"
    resp = requests.post(url,data=json.dumps(data), headers=headers )
    print (resp)
    stop_container = 'az container stop --name mycontainer  --resource-group mygroup'
    subprocess.call([stop_container],shell=True)

    return resp

Entonces, cada vez que recibo una solicitud, se agrega una tarea a la cola:

r = redis.Redis()
q = Queue(connection=r,default_timeout=3600)
task = q.enqueue(make_call,args = (arg1,arg2,arg3),timeout=500)
print (q.jobs) 

Si hago solo una llamada, funciona bien, y puedo ver desde azul cómo se enciende y apaga el contenedor:

enter image description here

Pero, por supuesto, ese no es el propósito de la cola.Cuando agrego varios trabajos a la cola, el primero funciona bien pero el resto falla:

Traceback (most recent call last):
  File "/home/luis/anaconda3/lib/python3.7/site-packages/urllib3/connection.py", line 159, in _new_conn
    (self._dns_host, self.port), self.timeout, **extra_kw)
  File "/home/luis/anaconda3/lib/python3.7/site-packages/urllib3/util/connection.py", line 80, in create_connection
    raise err
  File "/home/luis/anaconda3/lib/python3.7/site-packages/urllib3/util/connection.py", line 70, in create_connection
    sock.connect(sa)
TimeoutError: [Errno 110] Connection timed out

Además, no estoy usando kubernetes para este caso, ya que solo tengo algunos servicios que se usarán una o dos veces a la semana.

** EDITAR: **

Encontré el error pero aún no sé cómo solucionarlo. Si elimino la línea para iniciar y detener el contenedor, funciona bien, por lo que el problema parece estar relacionado con que el contenedor no estaba listo cuando comienzo a hacer las solicitudes, ¿es la forma de asegurarme de que el contenedor esté en funcionamiento? antes de realizar la llamada a la API?

Editar2

Actualmente estoy creando los contenedores con el uso de CLI como:

az container create -g MyResourceGroup --name myapp --image myimage:latest --cpu 1 --memory 1

¿Es posible hacerlo desde allí o tengo que cambiarlo todo al archivo YML?

0
Luis Ramon Ramirez Rodriguez 3 oct. 2019 a las 07:59

1 respuesta

La mejor respuesta

Puede configurar sonda de vida para que cuando crea el contenedor, de modo que cuando se inicia, espera a que la sonda de actividad devuelva el éxito antes de reenviar el tráfico al contenedor.

apiVersion: 2018-06-01
location: eastus
name: livenesstest
properties:
  containers:
  - name: mycontainer
    properties:
      image: nginx
      ports: []
      resources:
        requests:
          cpu: 1.0
          memoryInGB: 1.5
      livenessProbe:
        exec:
          command:
          - "curl"
          - "http://localhost"
        periodSeconds: 5
  osType: Linux
  restartPolicy: Always
type: Microsoft.ContainerInstance/containerGroups

Algo por el estilo

0
4c74356b41 3 oct. 2019 a las 06:34