在“ app” gunicorn中找不到应用程序对象“ app”

时间:2019-03-15 08:55:10

标签: python flask kubernetes gunicorn

我正在将烧瓶微服务与gunicorn一起使用,以请求托管在Google Kubernetes引擎上的服务。微服务已通过dockerized托管,并且也作为Pod托管在Google kubernetes引擎上。在本地对其进行测试之后,我对其进行了部署,但遇到了CrashLoopBackOff错误。我的吊舱的日志是:

[2019-03-15 08:41:13 +0000] [1] [INFO] Starting gunicorn 19.9.0
[2019-03-15 08:41:13 +0000] [1] [INFO] Listening at: http://0.0.0.0:8080 (1)
[2019-03-15 08:41:13 +0000] [1] [INFO] Using worker: threads
[2019-03-15 08:41:13 +0000] [12] [INFO] Booting worker with pid: 12
Failed to find application object 'app' in 'app'
[2019-03-15 08:41:13 +0000] [12] [INFO] Worker exiting (pid: 12)
[2019-03-15 08:41:13 +0000] [13] [INFO] Booting worker with pid: 13
Failed to find application object 'app' in 'app'
[2019-03-15 08:41:13 +0000] [13] [INFO] Worker exiting (pid: 13)
[2019-03-15 08:41:13 +0000] [1] [INFO] Shutting down: Master
[2019-03-15 08:41:13 +0000] [1] [INFO] Reason: App failed to load.

这似乎是 gunicorn 的错误。

我的文件夹结构是:

.
├── app.py
├── app.yaml
├── config.py
├── data
│   └── object_detection.pbtxt
├── Dockerfile
├── filename.jpg
├── helper.py
├── object_2.py
├── object_detection
│   ├── core
│   │   ├── anchor_generator.py

│       └── vrd_evaluation_test.py
├── object_detection_grpc_client.py

├── requirements.txt
└── tensorflow_serving
    ├── apis

       └── regression_pb2.py

app.py 代码为:

import logging

from flask import Flask, request, jsonify
from config import auth_secret_token, PORT, DEBUG_MODE
from helper import check_parameters
from object_detection_grpc_client import main


app = Flask(__name__)


def check_authorization(request):
    try:
        if not 'Auth-token' in request.headers:
            return jsonify({'error': 'unauthorized access'}), 401
        token = request.headers['Auth-token']
        if token != auth_secret_token:
            return jsonify({'error': 'unauthorized access'}), 401
        return "ok", 200
    except Exception as e:
        return jsonify({'error': 'unauthorized access'}), 401


@app.route("/", methods=['POST'])
def hello():
    info, status_code = check_authorization(request)

    if status_code != 200:
        return info, status_code
    else: 
        status, status_code = check_parameters(request.form)

    if status_code != 200:
        return status, status_code
    else:
        score = main()
        response = {"status": "success", "score": score, "customer_id":(request.form["cust_id"])}

        return jsonify(response), status_code


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT, debug=DEBUG_MODE)

config.py 代码为:

    from os import environ as env
    import multiprocessing

    PORT = int(env.get("PORT", 8080))
    DEBUG_MODE = int(env.get("DEBUG_MODE", 1))

    # Gunicorn config
    bind = ":" + str(PORT)
    workers = multiprocessing.cpu_count() * 2 + 1
    threads = 2 * multiprocessing.cpu_count()

    auth_secret_token = "token"
    server='A.B.C.D:9000'
    model_name="mymodel"
    input_image='filename.jpg'
    label_map="./data/object_detection.pbtxt"

Dockerfile 是:

    FROM python:3.5.2
    RUN apt update
    WORKDIR /app
    ADD requirements.txt /app/requirements.txt
    RUN pip install -r /app/requirements.txt
    ADD . /app
    ENV PORT 8080
    CMD ["gunicorn", "app:app", "--config=config.py"]

部署文件app.yaml:

 apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: mymodel-client
      labels:
        name: mymodel-client
    spec:
      replicas: 1
      selector:
        matchLabels:
          name: mymodel-client
      template:
        metadata:
          name: mymodel-client
          labels:
            name: mymodel-client
        spec:
          containers:
            - name: mymodel-client
              image: gcr.io/image-identification/mymodel-client:v1
              ports:
                - containerPort: 8080
              resources:
                requests:
                  memory: 256Mi
                limits:
                  memory: 512Mi
              env:
                - name: DEBUG_MODE
                  value: "1"

这是怎么了?

链接到我提到的教程https://medium.com/google-cloud/a-guide-to-deploy-flask-app-on-google-kubernetes-engine-bfbbee5c6fb

2 个答案:

答案 0 :(得分:0)

我认为问题可能与此类似。 https://stackoverflow.com/a/50157417/4229159

app文件夹(您在docker中创建的文件夹)和app文件具有相同的名称。您能再试一次重命名其中之一吗?

其余文件看起来都不错,这似乎只是gunicorn

的问题

答案 1 :(得分:0)

最有可能是内存问题。我删除了部署,并通过为其分配了更多资源将其再次推送,它开始运行,没有任何错误。