背景

前段时间接手了一份维护老系统的任务。该系统使用了早期的 Spring Cloud 全家桶,其中有一个微服务随着时间运行会出现大量 CLOSE_WAIT 状态的 socket 连接以至于堵塞网关,检查后发现与 HttpClient 相关(可参考 解决:HttpClient导致应用出现过多Close_Wait的问题 这篇博文),但是由于没有完整的源码,无法通过博文里提到的方法解决。因此考虑通过外部手段检测并重启服务来恢复网关与服务的通讯,简单的检测手段是通过发起 HTTP 请求看超时情况:$ curl --connect-timeout 10 -m 10 :

配置 Kubernetes 存活探测

我们使用了 Kubernetes 作为部署环境,它使用存活探测器来知道什么时候要重启容器。存活探测器有三种类型:存活命令;

HTTP 存活探测,发起 HTTP GET 请求以探测容器是否存活;

TCP 存活探测,发起 socket 连接以探测容器是否存活。

由于我们需要检测的服务的问题是容器内存在大量的 CLOSE_WAIT 状态连接,此时新的 socket 连接已经无法连通,使用 HTTP 存活探测时其超时检查无法作用于 socket 超时,因此应该使用 TCP 存活探测。

参照 Kubernetes 官方文档提供的示例即可配置相关探测器:apiVersion: v1

kind: Pod

metadata:

name: goproxy

labels:

app: goproxy

spec:

containers:

- name: goproxy

image: k8s.gcr.io/goproxy:0.1

ports:

- containerPort: 8080

readinessProbe:

tcpSocket:

port: 8080

initialDelaySeconds: 5

periodSeconds: 10

livenessProbe:

tcpSocket:

port: 8080

initialDelaySeconds: 15

periodSeconds: 20

配置 cron 执行脚本以检查 K8s Pod 存活状态

经过一段的运行后,Kubernetes 自带的存活探测工作良好,但是客户希望能获悉服务实例重启的信息,即每当服务实例重启时发送消息至群聊。

一开始考虑使用 BOTKUBE 收集服务实例重启信息,但是有几个小问题:BOTKUBE 原生仅支持 Slack、Mattermost、Microsoft Teams、Elastic Search、Webhook 五种方式;

BOTKUBE 是被动收集指定负载的相关事件。

但是客户希望能在钉钉群里中获悉 “N 个实例中重启了 M 个” 信息以进行评估稳定性。

如果通过 Webhook 接入 BOTKUBE,则需要在一个短暂的周期内维护服务的总实例数与周期内重启实例数量。相关编码工作量太大,于是我们通过编写简单的脚本并配置 cron 定时任务来完成该需求。

脚本思路假定我们要检查的服务名称为 service 。export KUBECONFIG=/path/to/your/kubernetes.yaml

pods=""

total=`/usr/local/bin/kubectl --kubeconfig=$KUBECONFIG get pods -o wide | grep service | sed -n '$='` # 1

for pod in `/usr/local/bin/kubectl --kubeconfig=$KUBECONFIG get pods -o wide | grep service | awk '{print $1 "_" $6}'` # 2

do

name=`echo $pod | awk -F_ '{print $1}'`

ip=`echo $pod | awk -F_ '{print $2}'`

sname=`echo $name | awk -F- '{print $5}'`

curl -s --connect-timeout 10 -m 10 $ip:8672 > /dev/null # 3

if [ $? -ne 0 ]; then # 4

/usr/local/bin/kubectl delete pod $name

pods="$pods$sname ×, "

else

pods="$pods$sname √, "

fi

done

pods="${pods%??}" # 5

success=`echo $pods | awk -F"√" '{print NF-1}'` # 6

if [ $success -ne $total ]; then

# 7

curl 'https://oapi.dingtalk.com/robot/send?access_token=***' \

-H 'Content-Type: application/json' \

-d '{ "msgtype": "text", "text": { "content": "检查结果 ['"$success"'/'"$total"'] :\n'"${pods}"'" } }'

fi统计当前正在运行的容器实例数量

我们需要 pod 的名称以在必要的时候通过 kubectl delete 删除它,还需要 pod 的虚拟 ip 地址以通过 curl 测试连接情况;

我们不需要 curl 的连接状态信息和连接成功后的资源下载进度信息,因此通过 -s 参数和重定向到空设备来 静音 ;

当 curl 因 socket 连接超时返回非 0 值时删除该容器;

截断多余的 ,;

统计尚在正常运行的容器数量;

仅当删除了一个或以上的容器时,发送构造好的报告信息至钉钉机器人。

效果:检查结果 [11/12] :

wdqdd ×, 5xwpz √, rgmc7 √, 8cf4f √, spttn √, dvw2l √, tg9lw √, kzrc2 √, fpk9s √, 9plpt √, dpkpf √, gnhrl √

配置 cron 定时任务

我们使用的是 Ubuntu Server 18,通过 crontab -e 配置定时任务:*/10 8-22 * * * /path/to/your/script.sh

使用 cron 执行脚本需要注意几个问题:cron 与脚本的权限问题;

设置脚本的可执行权限(chmod +x script.sh);

cron 执行脚本时传递的是最小集环境变量,因此需要指定二进制执行文件的路径,推荐在脚本开头使用 export 指定路径,但我们内部使用且从简处理,选择直接指定绝对路径 /usr/local/bin/kubectl;

系统的时区设置,如果修改了时区,需要重启 cron 服务。

k8s每天报告服务器状态信息,[工作随笔] 配置 cron 检查 K8s Pod 存活状态以推送钉钉消息...相关推荐

  1. 微信公众号-java上传图片素材到微信服务器基于事件推送两条消息

    微信公众号-java上传图片素材到微信服务器&基于事件推送两条消息 场景:基于微信扫码登录/关注事件,向用户推送两条消息. 分析:翻阅了微信开发者文档和一些其他资料发现,公众号针对用户关注/扫 ...

  2. 微信公众号/微信小程序获取用户信息以及推送微信模版消息_MQ

    微信公众号/微信小程序获取用户信息以及推送微信模版消息_MQ 一.获取用户信息 1.首先我们需要了解什么是微信用户的OpenID 在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密 ...

  3. 服务器 主动 推送 客户端浏览器 消息***

    前言 通常情况下,无论是web浏览器还是移动app,我们与服务器之间的交互都是主动的,客户端向服务器端发出请求,然后服务器端返回数据给客户端,客户端浏览器再将信息呈现,客户端与服务端对应的模式是: 客 ...

  4. 钉钉 php 推送,微信模板推送,钉钉信息推送

    上午的时候看到有朋友需要微信推送,正好我也需要,之前一直用 Server 酱的,但是最近用不了,想找一个替代品,一开始准备选择钉钉,除了打卡,我很少使用钉钉,邮件提醒是备用方案,其实和 Server ...

  5. 一加消息推送服务器,华为、荣耀、OPPO、realme、一加完成统一推送服务开发

    这意味着,符合联盟标准的统一推送服务,将覆盖华为.荣耀.OPPO.realme.一加五个品牌的手机. 具体来讲,华为.荣耀将首先在EMUI 10正式版中支持统一推送,华为和荣耀新发布机型全部支持,现有 ...

  6. ocsp服务器的证书状态如何查询,站点ocsp stapling检查、检查https 站点ocsp stapling配置、检查站点证书吊销状态信息...

    https://www.bing.com检测结果 ocsp stapling:支持 原始信息 OCSP Response Status: successful (0x0) Response Type: ...

  7. python通过SNMP协议收集服务器监控信息(安装、配置、示例)

    安装snmp和启用python模块 [root@test ~]# wget http://nchc.dl.sourceforge.net/project/net-snmp/net-snmp/5.7.3 ...

  8. ionic 服务器消息推送,Ionic3 本地消息推送

    项目上有一个消息推送的功能,一开始想使用极光推送,在安卓上测试比较顺利,但是IOS上需要什么证书,没有开发者账号,感觉好麻烦.后面就想在每次启动app的时候,本地推送一次消息,碰巧官网上发现了这个插件 ...

  9. 小米8系统推送服务器,小米8终于要升级MIUI10稳定版了,你收到推送了吗?

    原标题:小米8终于要升级MIUI10稳定版了,你收到推送了吗? 伴随着小米8的发布,小米也同时在5月31日正式发布了MIUI10系统,但是很多网友却反映一直没有收到稳定版本的系统推送,感到十分的不爽! ...

最新文章

  1. python 列表生成器 获取文件列表
  2. java 隐藏标题栏_两种方法一句代码隐藏Activity的标题栏
  3. mysql校对规则_MYSQL校对规则
  4. 几个国内外远程工作平台
  5. python怎么读取csv文件-python如何读取csv数据
  6. 088 菱形继承问题
  7. paip.java 开发中web server的选择jboss resin tomcat比较..
  8. 视频一键识别生成字幕
  9. pc模仿移动端滚动条样式,好看就对了
  10. 《大话数据结构(C实现)》(Yanlz+VR云游戏+Unity+SteamVR+云技术+5G+AI+软件架构设计+框架编程+数据结构+链表+栈+队列+二叉树+冒泡排序+KMP模式+立钻哥哥+==)
  11. 物联网嵌入式学习路线
  12. MIT oracle ma 信号线,美国 MIT Oracle MA-X Phono唱臂线 独家Multipole技术
  13. python制作搜索工具,深挖电脑里的小九九
  14. 微信视频号如何流量变现赚钱呢?
  15. 敞开肚皮深入理解-抽象类和接口
  16. Excel 使用ODBC直接访问
  17. Hystrix之四种触发fallback情况
  18. Element UI 及 Element Plus框架
  19. 【力扣刷题——字符串】附力扣链接、题目描述、解题方法及代码(344、541、剑指Offer05、151、剑指 Offer58、28、459)后续再补充
  20. 跨年呈献:HP-Socket for Linux 1.0 震撼发布

热门文章

  1. 汽油的90#、93#、97#有什么区别的?
  2. 如何在不安装应用程序的情况下旋转iPhone视频
  3. 委外采购申请或委外订单收货完成后,造成的MRP异常处理
  4. 蓝牙核心规范(V5.2)5.1-深入详解之基带规范
  5. 基于SSM框架的图片分享及评价网站设计与实现 毕业设计-附源码201524
  6. 【安装软件】 win10安装iTunes报错:“此Windows Installer软件包有一个问题。完成此安装需要......”的解决方式
  7. iOS逆向学习之 Mac 登录到 iPhone
  8. codevs 1373 射命丸文(矩阵前缀和)
  9. 服务器设置密码修改导致的后果
  10. C语言:递归实现N的阶乘