最近我们遇到了一些问题,我们的 php-fpm 进程失控并导致站点无响应。有一些明显的 php-fpm 配置工具需要完成,但我还想为 php-fpm 容器实现合理的 livenessProbe 健康检查,当探测失败时,它将重新启动容器。
我已经挖掘了一些关于如何ping 服务器作为健康检查的资源(例如https://easyengine.io/tutorials/php/fpm-status-page/),但我还没有找到关于什么的好答案需要注意。如果服务器实际上已死,/ping 路由是否会返回“pong”以外的其他内容?它会超时吗?假设是后者,合理的超时限制是多少?
运行我自己的一些测试,我注意到一个健康的 php-fpm 服务器将快速返回“pong”响应:
# time curl localhost/ping
pong
real 0m0.040s
user 0m0.006s
sys 0m0.001s
Run Code Online (Sandbox Code Playgroud)
我模拟了重负载,确实需要 1-3 秒的“乒乓”响应时间,而这恰逢站点变得无响应。基于此,我草拟了一个 livenessProbe 的草稿,如果 liveness 探针脚本在 2 个连续的探针上花费的时间超过 2 秒,它将失败并重新启动容器:
livenessProbe:
exec:
command:
- sh
- -c
- timeout 2 /var/www/livenessprobe.sh
initialDelaySeconds: 15
periodSeconds: 3
successThreshold: 1
failureThreshold: 2
Run Code Online (Sandbox Code Playgroud)
探针脚本就是这样(有一些原因,为什么这需要是一个 shell 脚本,而不是来自 livenessProbe 的直接 httpGet,我不会进入):
#!/bin/bash
curl -s localhost/ping
Run Code Online (Sandbox Code Playgroud)
现在我不知道是我太激进还是太保守了。我将运行金丝雀部署来测试这一点,但与此同时,我想从其他人那里获得一些反馈,这些人已经在 php-fpm 服务器上实施了健康检查,如果它在 Kubernetes 上下文中,则可以获得奖励积分。
我在Grafana仪表板中查看Prometheus指标,但我对一些面板感到困惑,这些面板根据我不熟悉的ID显示指标。我假设这/kubepods/burstable/pod99b2fe2a-104d-11e8-baa7-06145aa73a4c指向一个单一的pod,并且假定/kubepods/burstable/pod99b2fe2a-104d-11e8-baa7-06145aa73a4c/<another-long-string>解析为pod中的一个容器,但是如何将这个ID解析为pod名称和一个容器,即如何将该ID映射到见到的pod名称我跑kubectl get pods?
我已经尝试过跑步,kubectl describe pods --all-namespaces | grep "99b2fe2a-104d-11e8-baa7-06145aa73a4c"但是没有任何反应。
此外,中还有多个子路径/kubepods,例如/kubepods/burstable和/kubepods/besteffort。这些是什么意思,给定的吊舱如何落入这些子路径中的一个或另一个?
最后,我在哪里可以了解有关什么管理的更多信息/kubepods?
普罗米修斯查询:
sum (container_memory_working_set_bytes{id!="/",kubernetes_io_hostname=~"^$Node$"}) by (id)
Run Code Online (Sandbox Code Playgroud)
谢谢阅读。
埃里克
List API 对象和三重破折号 (--- ) 均可用于表示单个 YAML 文件中的多个对象。因此,当三个破折号以更清晰的方式完成相同的事情(在我看来)时,为什么会存在列表?在任何情况下,列表比三重破折号更受欢迎,还是这纯粹是一种风格选择?
例如,这两个 YAML 文件都生成相同的两个ServiceAccount对象(为简洁起见选择):
我的serviceaccounts1.yaml
apiVersion: v1
kind: List
metadata: {}
items:
- apiVersion: v1
kind: ServiceAccount
metadata:
name: my-app
- apiVersion: v1
kind: ServiceAccount
metadata:
name: my-other-app
Run Code Online (Sandbox Code Playgroud)
我的serviceaccounts2.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-app
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-other-app
Run Code Online (Sandbox Code Playgroud)