如何在 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"。有一些示例工具可以执行此操作。特别是:

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

希望对您的用例有所帮助