NLP Flask 应用程序启动节点在 Google Kubernetes GKE 上超时
NLP Flask app startup nodes timing out on Google Kubernetes GKE
我有一个 Flask 应用程序,其中包含一些 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 节点设置超时量吗?
感谢您的帮助!
您可以做的一件事是在 startup script 中为您的 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 combined with the Probe 参数 initialDelaySeconds
这样它实际上会等待一段时间然后说: 我要看看是否应用程序已启动.:
startupProbe:
exec:
command:
- touch
- /tmp/started
initialDelaySeconds: 3600
我有一个 Flask 应用程序,其中包含一些 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 节点设置超时量吗?
感谢您的帮助!
您可以做的一件事是在 startup script 中为您的 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 combined with the Probe 参数 initialDelaySeconds
这样它实际上会等待一段时间然后说: 我要看看是否应用程序已启动.:
startupProbe:
exec:
command:
- touch
- /tmp/started
initialDelaySeconds: 3600