dubbo 协议的 K8s pod 存活探针配置
背景
某项目采用微服务架构,dubbo 框架,K8s 方式部署。
其中 HTTP 协议由网关应用统一处理,大部分应用仅提供 dubbo 协议。
目标
应用某个实例(pod)状态异常时,尝试自动重启恢复。
解决
K8s 提供了3种存活探针(livenessProbe),以实现 pod 状态异常时重启。
HTTPGetAction 首先排除了,因为上文我们说了,HTTP 访问由网关统一处理,应用本身没有 HTTP 协议。
然后是 TCPSocketAction,该探针仅能确认 dubbo 端口是否为监听状态,无法实现应用状态的的拨测。
最后是 ExecAction,该探针执行命令返回0判断 pod 存活,非0则根据pod定义的重启策略进行后续操作。
dubbo 框架从2.0.5 版本开始,支持通过 telnet 命令交互,我们可以使用 status 命令获取应用本身即应用依赖的底层服务(注册中心、数据库等)的拨测结果。
我们只需要编写一个简单的 shell 脚本,抓取 dubbo 的 status 命令结果,如果是 OK 或 WARN 则返回0,否则返回1,就可以使用 ExecAction 了。
#!/bin/bash outputfile=/tmp/dubbo_health_check
dubbo_port=$1 (echo 'status -l'; sleep 1) | nc -w 3 127.0.0.1 ${dubbo_port} -o ${outputfile} > /dev/null result=`grep summary ${outputfile}| awk '{print $4}' ` if [[ "${result}" == "OK" ]] || [[ "${result}" == "WARN" ]]
then
exit 0
else
exit 1
fi
pod yaml文件中关于存活探针的部分如下所示
#(略)
livenessProbe:
exec:
command:
- /bin/bash
- /opt/dubbo_health_check.sh
- '20800'
initialDelaySeconds: 600
timeoutSeconds: 5
periodSeconds: 60
failureThreshold: 3
#(略)
注意点
- 按 dubbo 官方文档的说法,telnet 中执行 status 返回的结果应该和 status -l 中 summary 的结果一致,实际测试并非如此,建议使用 status -l
- 频繁执行 status -l 可能会有性能上的隐患,参考 https://www.jianshu.com/p/f6376c148f2c
总结
dubbo 官方提供了与 pod 探针对齐的方法(参见下文),但是在我们这个应用中因为网关和其他一些原因限制了 HTTP 协议,因此使用了上文这种替代方案。
每个项目/团队都会有一些自己的特殊需求,本文只是提供一种思路,如果有更好的解决方案,欢迎在评论区提出讨论(●ˇ∀ˇ●)
参考
容器探针
https://kubernetes.io/zh/docs/concepts/workloads/pods/pod-lifecycle/#container-probes
Dubbo 与 pod 探针对齐
https://dubbo.apache.org/zh/docs/references/lifecycle/brief/
Dubbo Telnet 命令
https://dubbo.apache.org/zh/docs/v3.0/references/telnet/#status
dubbo 协议的 K8s pod 存活探针配置的更多相关文章
- Kubernetes学习笔记(二):部署托管的Pod -- 存活探针、ReplicationController、ReplicaSet、DaemonSet、Job、CronJob
存活探针 Kubernetes可以通过存活探针(liveness probe)检查容器是否存活.如果探测失败,Kubernetes将定期执行探针并重新启动容器. 官方文档请见:https://kube ...
- pod健康检查(liveness probe存活探针&&readiness probe 可读性探针)
在Kubernetes集群当中,我们可以通过配置liveness probe(存活探针)和readiness probe(可读性探针)来影响容器的生存周期.参考文档:https://kubernete ...
- k8s 存活探针,滚动更新
文章原文 存活探针 Kubelet使用liveness probe(存活探针)来确定何时重启容器.例如,当应用程序处于运行状态但无法做进一步操作,liveness探针将捕获到deadlock,重启处于 ...
- 记一次k8s pod频繁重启的优化之旅
关键词:k8s.jvm.高可用 1.背景 最近有运维反馈某个微服务频繁重启,客户映像特别不好,需要我们尽快看一下. 听他说完我立马到监控平台去看这个服务的运行情况,确实重启了很多次.对于技术人员来说, ...
- 探针配置失误,线上容器应用异常死锁后,kubernetes集群未及时响应自愈重启容器?
探针配置失误,线上容器应用异常死锁后,kubernetes集群未及时响应自愈重启容器? 探针配置失误,线上容器应用异常死锁后,kubernetes集群未及时响应自愈重启容器? 线上多个服务应用陷入了死 ...
- kubernets之存活探针
一 存活探针存在的意义 1.1 kubernet通过存活探针(liveness probe)检查容器是否还在运行,可以为pod中的每个容器单独指定存活探针,如果探针执行失败,kubernets会 ...
- kubernetes的存活探针和就绪探针
1.存活探针 使用Kubernetes的一个主要好处是,可以给Kubernetes-个容器列表来由其保持容器在集群中的运行.可以通过让Kubernetes创建pod资源,为其选择一个工作节点并在该节点 ...
- 4.2 K8S超级完整安装配置
前言: 采坑 k8s有3种安装方式,如下所示: minikube:这是一个k8s集群模拟器,只有一个节点的集群,只为了测试使用,master和node都在一台机器上 直接使用带有容器功能的云平台安装: ...
- Dubbo协议与连接控制
协议参考手册 (+) (#) 推荐使用Dubbo协议 性能测试报告各协议的性能情况,请参见:性能测试报告 (+) dubbo:// (+) (#) Dubbo缺省协议采用单一长连接和NIO异步通讯,适 ...
随机推荐
- android tcp通讯
Andoird TCP通讯 前言 最近在写一个即时通讯的项目,有一些心得,写出来给大家分享指正一下. 简单描述一下这个项目: 实时查询车辆运行状态的项目,走TCP通迅. 接口采用GZIP压缩. 后台是 ...
- gcc中预定义的宏__GNUC__
转载:gcc中预定义的宏__GNUC__ - Cccarl - 博客园 (cnblogs.com) 今天在看Linux系统编程这本书的代码的时候看到了__GNUC__,不太清楚这个宏所以去查了一下,以 ...
- 解决boa网页操作出现502 Bad Gateway The CGI was not CGI/1.1 compliant的一种可能
最近在把一套网页操作的接口从原来Android5.0上移植到Android7.0上. 客户端连接验证的时候主页显示异常 502 Bad Gateway The CGI was not CGI/1.1 ...
- 正则表达式之grep
grep 的五个参数,基本的常用的: -a :将 binary 档案以 text 档案的方式搜寻数据 -c :计算找到 '搜寻字符串' 的次数 -i :忽略大小写的不同,所以大小写视为相同 -n :顺 ...
- hash 哈希表 缓存表
系统初始hash表为空,当外部命令执行时,默认会从 PATH路径下寻找该命令,找到后会将这条命令的路径记录到 hash表中,当再次使用该命令时,shell解释器首先会查看hash 表,存在将执行之,如 ...
- 一文搞懂js中的typeof用法
基础 typeof 运算符是 javascript 的基础知识点,尽管它存在一定的局限性(见下文),但在前端js的实际编码过程中,仍然是使用比较多的类型判断方式. 因此,掌握该运算符的特点,对于写出好 ...
- 【浏览器】聊聊DOM
[浏览器]聊聊DOM 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 作为前端开发,在以前的工作中大多是和DOM打交道,到 ...
- js 透明度轮播图
js 透明度轮播图 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- Android Thermal HAL 降龙十八掌
基本概念 参阅下面两篇文章,就可以大概了解一些概念的内容了 https://source.android.com/devices/architecture/hidl/thermal-mitigatio ...
- 『学了就忘』Linux软件包管理 — 46、yum命令详细介绍
目录 1.yum命令的查询操作 2.使用yum命令安装服务 3.使用yum命令升级服务 4.使用yum命令卸载服务 5.yum组管理命令 (1)查询可以安装的软件组 (2)查询软件组内包含的软件 (3 ...