如何在 k8s readinessProbe 和 livenessProbe 的套接字文件中使用 gevent 检查 uwsgi
How to check uwsgi with gevent at socket file in k8s readinessProbe and livenessProbe
我有一个带有 uwsgi 和 gevent 的烧瓶应用程序。
这是我的 app.ini
我如何在 kubernetes 上编写 readinessProbe 和 livenessProbe 来检查 flask 应用程序?
[uwsgi]
socket = /tmp/uwsgi.sock
chdir = /usr/src/app/
chmod-socket = 666
module = flasky
callable = app
master = false
processes = 1
vacuum = true
die-on-term = true
gevent = 1000
listen = 1024
我想你真正想问的是"How to health check a uWSGI application"。有一些示例工具可以执行此操作。特别是:
- https://github.com/andreif/uwsgi-tools
- https://github.com/che0/uwping
- https://github.com/m-messiah/uwget
uwsgi-tools
项目似乎在 https://github.com/andreif/uwsgi-tools/issues/2#issuecomment-345195583 处有最完整的示例。在 Kubernetes Pod 规范上下文中,这可能最终看起来像:
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: myapp
image: myimage
livenessProbe:
exec:
command:
- uwsgi_curl
- -H
- Host:host.name
- /path/to/unix/socket
- /health
initialDelaySeconds: 5
periodSeconds: 5
这还假设您的应用程序响应 /health
作为健康端点。
您可以将 uWSGI
配置为与 http-socket
同时服务 uwsgi-socket
,并且仅将 uwsgi-socket
公开给 k8s service
。
在这种情况下,您的 uwsgi.ini
看起来像:
[uwsgi]
socket = /tmp/uwsgi.sock
chdir = /usr/src/app/
chmod-socket = 666
module = flasky
callable = app
master = false
processes = 1
vacuum = true
die-on-term = true
gevent = 1000
listen = 1024
http-socket = 0.0.0.0:5050
假设您的应用程序中有 /health
端点,您的 k8s manifest
可能类似于:
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: myapp
image: myimage
livenessProbe:
httpGet:
path: /health
port: 5050
httpHeaders:
- name: Custom-Header
value: Awesome
initialDelaySeconds: 5
periodSeconds: 5
在这种情况下,您的服务将作为上游位于 socket = /tmp/uwsgi.sock
通过您的 k8s service
访问,并且 k8s healthcheck
服务可以到达您位于 http-socket: 5050
的容器。
我为 uwsgi 应用程序写了一个小的准备检查:https://github.com/filipenf/uwsgi-readiness-check/
它读取 uwsgi 的统计套接字并检查队列大小。如果队列高于可配置的阈值,Pod 将被标记为“未就绪”,直到其队列被排空并且它可以再次被标记为就绪。
将它安装到您的容器镜像中:
pip install uwsgi-readiness-check
然后 运行 检查类似:
readinessProbe:
exec:
command:
- uwsgi-is-ready
- --stats-socket
- /tmp/uwsgi-stats
- --queue-threshold
- 0.7
failureThreshold: 2
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 1
希望对您的用例有所帮助
我有一个带有 uwsgi 和 gevent 的烧瓶应用程序。
这是我的 app.ini
我如何在 kubernetes 上编写 readinessProbe 和 livenessProbe 来检查 flask 应用程序?
[uwsgi]
socket = /tmp/uwsgi.sock
chdir = /usr/src/app/
chmod-socket = 666
module = flasky
callable = app
master = false
processes = 1
vacuum = true
die-on-term = true
gevent = 1000
listen = 1024
我想你真正想问的是"How to health check a uWSGI application"。有一些示例工具可以执行此操作。特别是:
- https://github.com/andreif/uwsgi-tools
- https://github.com/che0/uwping
- https://github.com/m-messiah/uwget
uwsgi-tools
项目似乎在 https://github.com/andreif/uwsgi-tools/issues/2#issuecomment-345195583 处有最完整的示例。在 Kubernetes Pod 规范上下文中,这可能最终看起来像:
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: myapp
image: myimage
livenessProbe:
exec:
command:
- uwsgi_curl
- -H
- Host:host.name
- /path/to/unix/socket
- /health
initialDelaySeconds: 5
periodSeconds: 5
这还假设您的应用程序响应 /health
作为健康端点。
您可以将 uWSGI
配置为与 http-socket
同时服务 uwsgi-socket
,并且仅将 uwsgi-socket
公开给 k8s service
。
在这种情况下,您的 uwsgi.ini
看起来像:
[uwsgi]
socket = /tmp/uwsgi.sock
chdir = /usr/src/app/
chmod-socket = 666
module = flasky
callable = app
master = false
processes = 1
vacuum = true
die-on-term = true
gevent = 1000
listen = 1024
http-socket = 0.0.0.0:5050
假设您的应用程序中有 /health
端点,您的 k8s manifest
可能类似于:
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: myapp
image: myimage
livenessProbe:
httpGet:
path: /health
port: 5050
httpHeaders:
- name: Custom-Header
value: Awesome
initialDelaySeconds: 5
periodSeconds: 5
在这种情况下,您的服务将作为上游位于 socket = /tmp/uwsgi.sock
通过您的 k8s service
访问,并且 k8s healthcheck
服务可以到达您位于 http-socket: 5050
的容器。
我为 uwsgi 应用程序写了一个小的准备检查:https://github.com/filipenf/uwsgi-readiness-check/
它读取 uwsgi 的统计套接字并检查队列大小。如果队列高于可配置的阈值,Pod 将被标记为“未就绪”,直到其队列被排空并且它可以再次被标记为就绪。
将它安装到您的容器镜像中:
pip install uwsgi-readiness-check
然后 运行 检查类似:
readinessProbe:
exec:
command:
- uwsgi-is-ready
- --stats-socket
- /tmp/uwsgi-stats
- --queue-threshold
- 0.7
failureThreshold: 2
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 1
希望对您的用例有所帮助