如何在 k8s readyinessProbe 和 livenessProbe 中的套接字文件中使用 gevent 检查



我有一个带有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

希望对您的用例有所帮助

最新更新