【问题标题】:How to check uwsgi with gevent at socket file in k8s readinessProbe and livenessProbe如何在 k8s readinessProbe 和 livenessProbe 的套接字文件中使用 gevent 检查 uwsgi
【发布时间】:2019-11-29 00:46:43
【问题描述】:

我有一个带有 uwsgi 和 gevent 的烧瓶应用程序。
这是我的app.ini 我如何在 kubernetes 上编写 readinessProbe 和 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

【问题讨论】:

  • 您可以执行任何 shell 命令来进行就绪和活跃度探测。您将如何在 bash 中实现目标?
  • @peedee 感谢您检查我的问题。坦白说,我不太了解uwsgi。所以我不知道如何检查 uwsgi 是否使用 shell 命令。
  • 那么这就是你需要弄清楚的。 readinessProbe 只会执行一个你必须编写的 shell 命令。

标签: kubernetes uwsgi gevent


【解决方案1】:

我认为您真正要问的是“如何对 uWSGI 应用程序进行健康检查”。有一些示例工具可以做到这一点。特别是:

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,但是看起来kubernetes不支持这个。
【解决方案2】:

您可以将uWSGI 配置为同时提供uwsgi-sockethttp-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

在这种情况下,您的服务可以通过您的k8s service 作为上游socket = /tmp/uwsgi.sock 访问,而k8s healthcheck 服务可以通过http-socket: 5050 访问您的容器。

【讨论】:

    【解决方案3】:

    我为 uwsgi 应用程序编写了一个简单的就绪检查:https://github.com/filipenf/uwsgi-readiness-check/

    它读取 uwsgi 的 stats socket 并检查队列大小。如果队列高于可配置的阈值,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
    

    希望它对您的用例有所帮助

    【讨论】:

      猜你喜欢
      • 2019-08-20
      • 1970-01-01
      • 1970-01-01
      • 2017-05-19
      • 2020-10-12
      • 1970-01-01
      • 2017-01-15
      • 2015-07-23
      • 1970-01-01
      相关资源
      最近更新 更多