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异步通讯,适 ...
随机推荐
- HTML基础强化
1.如何理解HTML? HTML类似于一份word"文档" 描述文档的"结构" 有区块和大纲 2.对WEB标准的理解? Web标准是由一系列标准组合而成.一个网 ...
- 20191310李烨龙作业:MySort
作业:MySort 任务详情 1. 用man sort 查看sort的帮助文档 2. sort常用选项有哪些,都有什么功能?提交相关使用的截图 3. 如果让你编写sort,你怎么实现?写出伪代码和相关 ...
- lvs 四层负载相关
都打开 /etc/sysctl.conf 中的 net.ip4.ip_forward=1.开启路由转发功能. 分发器 : eth0:192.168.1.66 (VIP) eth1:192.168.2. ...
- anaconda无法launch应用(无法l打开任何应用)的问题解决 (点击应用无反应)
遇到了anaconda 无法launch 任何应用. 重装也不行. 先说我最终的解决方法(在官方文档中找到): 1. 启动 anaconda prompt , 输入 conda remove anac ...
- adb 安装与使用(一)
一.ADB简介 1. 什么是adb? adb(Android Debug Bridage)是Android sdk的一个工具: adb 是用来连接安卓手机和PC端的桥梁,要有adb作为二者之间的维系, ...
- vue+elementUI中单选框el-radio设置默认值和唯一标识某个单选框
vue+elementUI中单选框el-radio设置默认值 如果后台返回的单选框的值是number:单选框的lable需要设置成 :lable='0';如下: <el-form-item la ...
- idea Mark Directory as 的几种文件类型
1. Source roots (or source folders) 源文件夹 通过为该类别分配文件夹,可以告诉IntelliJ IDEA该文件夹及其子文件夹包含应在构建过程中进行编译的源代码. 2 ...
- django improperly configured
ImproperlyConfigured: You must either define the environment variable DJANGO_SETTINGS_MODULE or call ...
- OAuth 2.0 扩展协议之 PKCE
前言 阅读本文前需要了解 OAuth 2.0 授权协议的相关内容, 可以参考我的上一篇文章 OAuth 2.0 的探险之旅. PKCE 全称是 Proof Key for Code Exchange, ...
- 菜鸡的Java笔记 第十八 - java 代码块
代码块 code block content (内容) 在程序结构之中使用"{}"定义的内容就称为代码块,但是会根据其声明的位置以及关 ...