背景

某项目采用微服务架构,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
#(略)

注意点

  1. 按 dubbo 官方文档的说法,telnet 中执行 status 返回的结果应该和 status -l 中 summary 的结果一致,实际测试并非如此,建议使用 status -l
  2. 频繁执行 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 存活探针配置的更多相关文章

  1. Kubernetes学习笔记(二):部署托管的Pod -- 存活探针、ReplicationController、ReplicaSet、DaemonSet、Job、CronJob

    存活探针 Kubernetes可以通过存活探针(liveness probe)检查容器是否存活.如果探测失败,Kubernetes将定期执行探针并重新启动容器. 官方文档请见:https://kube ...

  2. pod健康检查(liveness probe存活探针&&readiness probe 可读性探针)

    在Kubernetes集群当中,我们可以通过配置liveness probe(存活探针)和readiness probe(可读性探针)来影响容器的生存周期.参考文档:https://kubernete ...

  3. k8s 存活探针,滚动更新

    文章原文 存活探针 Kubelet使用liveness probe(存活探针)来确定何时重启容器.例如,当应用程序处于运行状态但无法做进一步操作,liveness探针将捕获到deadlock,重启处于 ...

  4. 记一次k8s pod频繁重启的优化之旅

    关键词:k8s.jvm.高可用 1.背景 最近有运维反馈某个微服务频繁重启,客户映像特别不好,需要我们尽快看一下. 听他说完我立马到监控平台去看这个服务的运行情况,确实重启了很多次.对于技术人员来说, ...

  5. 探针配置失误,线上容器应用异常死锁后,kubernetes集群未及时响应自愈重启容器?

    探针配置失误,线上容器应用异常死锁后,kubernetes集群未及时响应自愈重启容器? 探针配置失误,线上容器应用异常死锁后,kubernetes集群未及时响应自愈重启容器? 线上多个服务应用陷入了死 ...

  6. kubernets之存活探针

    一   存活探针存在的意义 1.1  kubernet通过存活探针(liveness probe)检查容器是否还在运行,可以为pod中的每个容器单独指定存活探针,如果探针执行失败,kubernets会 ...

  7. kubernetes的存活探针和就绪探针

    1.存活探针 使用Kubernetes的一个主要好处是,可以给Kubernetes-个容器列表来由其保持容器在集群中的运行.可以通过让Kubernetes创建pod资源,为其选择一个工作节点并在该节点 ...

  8. 4.2 K8S超级完整安装配置

    前言: 采坑 k8s有3种安装方式,如下所示: minikube:这是一个k8s集群模拟器,只有一个节点的集群,只为了测试使用,master和node都在一台机器上 直接使用带有容器功能的云平台安装: ...

  9. Dubbo协议与连接控制

    协议参考手册 (+) (#) 推荐使用Dubbo协议 性能测试报告各协议的性能情况,请参见:性能测试报告 (+) dubbo:// (+) (#) Dubbo缺省协议采用单一长连接和NIO异步通讯,适 ...

随机推荐

  1. PCB电路板元器件布局的一般原则*(转)

    PCB电路板元器件布局的一般原则: 设计人员在PCB电路板布局过程中需要遵循的一般原则如下. (1)元器件最好单面放置.如果需要双面放置元器件,在底层(Bottom Layer)放置插针式元器件, ) ...

  2. 单片机STM32在开发中常用库函数详解

    1.GPIO初始化函数 用法: voidGPIO_Configuration(void) { GPIO_InitTypeDefGPIO_InitStructure;//GPIO状态恢复默认参数 GPI ...

  3. DDR3 IP和CIC IP仿真问题解决记录

    1.更新vivado的仿真库(data/secureip和verilog和vhdl文件夹)至最新的vivado库和生成IP的版本匹配: 2.vcs编译脚本里面把仿真库地址指向匹配的仿真库版本: 3.v ...

  4. AtCoder Beginner Contest 220部分题(G,H)题解

    刚开始的时候被E题卡住了,不过发现是个数学题后就开始使劲推式子,幸运的是推出来了,之后的F题更是树形DP换根的模板吧,就草草的过了,看了一眼G,随便口胡了一下,赶紧打代码,毕竟时间不多了,最后也没打完 ...

  5. popStar机机对战数据生成器代码(C#)

    代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...

  6. 部署自己的gitlab服务器

    一.安装依赖环境,下载gitlab的rpm包,并且安装 yum install curl policycoreutils-python openssh-server postfix wget -ywg ...

  7. 反射的妙用:C#通过反射动态生成类型继承接口并实现

    起因 最近想自己鼓捣个RPC,想着简化RPC调用方式,直接申明接口,然后根据接口的属性去配置RPC调用的相关信息.有一种说法叫申明式调用. 简单来说就是,申明一个interface,动态继承并实例化, ...

  8. RabbitMQ保证消息的顺序性

    当我们的系统中引入了MQ之后,不得不考虑的一个问题是如何保证消息的顺序性,这是一个至关重要的事情,如果顺序错乱了,就会导致数据的不一致.       比如:业务场景是这样的:我们需要根据mysql的b ...

  9. eclipse调试时出现source not found怎么办

    调试时遇到source not found,可以点击下方的edit source lookup按钮,进行调试项目的增加 进入后点击ADD按钮 选择java project类型的项目,如图 选择需要调试 ...

  10. b站个人直播年报【大爽歌作】 介绍与演示

    大家好,我是大爽,一个b站UP主兼主播. 最近做了一个b站直播个人年报,该年报为代码文件生成. 且代码已打包到一个可视化工具中(exe)只需两步就可以获得自己的专属年报. 代码已上传到我的github ...