我有一个带有uwsgi和gevent的烧瓶应用程序。
这是我的app.ini
如何在 kubernetes 上编写 readyinessProbe 和 livenessProbe 以检查烧瓶应用程序?
[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
我认为您真正要问的是"如何对uWSGI应用程序进行健康检查"。有一些示例工具可以做到这一点。特别:
- 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
配置为同时提供两个uwsgi-socket
http-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 将被标记为"NotReady",直到其队列耗尽并且可以再次标记为就绪。
使用以下命令将其安装到容器映像中:
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
希望对您的用例有所帮助