首页 > 解决方案 > NLP Flask 应用程序启动节点在 Google Kubernetes GKE 上超时

问题描述

我有一个烧瓶应用程序,其中包含一些 NLP 包,并且在启动服务器之前需要一段时间来初始构建一些向量。我过去在使用 Google App Engine 时注意到了这一点,并且我能够在 app.yaml 文件中设置最大超时来解决这个问题。

问题是当我使用这个应用程序在 Kubernetes 上启动我的集群时,我注意到工作人员在日志中不断超时。这是有道理的,因为我确定默认的时间量是不够的。但是,我不知道如何配置 GKE 以让工作人员有足够的时间在开始服务之前完成它需要做的所有事情。

如何增加工作人员在超时之前可以花费的时间?

我删除了旧实例,所以我现在无法获取日志,但如果有人想查看日志,我可以启动它。

是这样的:

I 2020-06-26T01:16:04.603060653Z Computing vectors for all products
E 2020-06-26T01:16:05.660331982Z 
95it [00:05, 17.84it/s][2020-06-26 01:16:05 +0000] [220] [INFO] Booting worker with pid: 220
E 2020-06-26T01:16:31.198002748Z [nltk_data] Downloading package stopwords to /root/nltk_data...
E 2020-06-26T01:16:31.198056691Z [nltk_data]   Package stopwords is already up-to-date!
100it 2020-06-26T01:16:35.696015992Z [CRITICAL] WORKER TIMEOUT (pid:220)
E 2020-06-26T01:16:35.696015992Z [2020-06-26 01:16:35 +0000] [220] [INFO] Worker exiting (pid: 220)

我也看到了这个:

The node was low on resource: memory. Container thoughtful-sha256-1 was using 1035416Ki, which exceeds its request of 0.

显然我不完全知道我在做什么。为什么它说我正在请求 0 内存,我可以为 Kubernetes 节点设置超时量吗?

谢谢您的帮助!

标签: flaskkubernetesgoogle-kubernetes-enginegke-networking

解决方案


您可以做的一件事是在GCP 实例的启动脚本中添加某种延迟。你可以尝试一个简单的:

#!/bin/bash

sleep <time-in-seconds>

您可以尝试的另一件事是在容器在 Kubernetes 节点中启动时添加某种延迟。例如,initContainer中的延迟

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: myapa:latest
  initContainers:
  - name: init-myservice
    image: busybox:1.28
    command: ['sh', '-c', "echo Waiting a bit && sleep 3600"]

此外,您可以尝试将StartupProbe与实际应用程序容器上的Probe参数相结合initialDelaySeconds,这样它实际上会等待一段时间,然后说:我将查看应用程序是否已启动。:

startupProbe:
  exec:
    command:
    - touch
    - /tmp/started
  initialDelaySeconds: 3600

推荐阅读