k8s上使用prometheus监控websocket服务
说明
我们当前k8s集群上使用prometheus做监控,由于开发同学有部分业务使用websocket
接口,也为了能有效对业务应用进行监控和报警,很有必要对websocket api
接口存活性进行探测和监管。具体方案、实施流程和测试详见下文。
部署简单 websocket service
我们定义一个简单的websocket service
用来监控报警测试,如下:
# 创建虚拟环境,也可以直接在宿主机上部署 mkvirtualenv -p /usr/bin/python3 websocket-server # 安装必要包 pip3 install websockets
# cat websocket-server.py import asyncio import websockets async def echo(websocket, path): async for message in websocket: message = "I got your message: {}".format(message) await websocket.send(message) # 定义的ip地址要能与k8s通信 asyncio.get_event_loop().run_until_complete(websockets.serve(echo, '192.168.128.6', 8765)) asyncio.get_event_loop().run_forever()
# 启动websocket服务 python websocket-server.py & # 查看服务 netstat -lnp|grep 8765
websocket-exports
这里我们定义一个deployment
用来将监控的多个websocket api
metrics对接到prometheus
,内容如下:
k8s websocket deployment
# cat websocket-kube-mon-prometheus.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app.kubernetes.io/name: wss app.kubernetes.io/version: v1.8.0 name: websocket-exporter namespace: kube-mon spec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: wss template: metadata: labels: app.kubernetes.io/name: wss app.kubernetes.io/version: v1.8.0 spec: containers: - image: registry.cn-shanghai.aliyuncs.com/ai-voice-test/wss-expoter:v0.0.1 env: - name: ENDPOINT #多个ws用逗号分开 value: ws://www.abc.com,ws://192.168.128.6:8765 name: websocket-exporter ports: - containerPort: 9189 name: wss-metrics
k8s websocket service
定义websocket service
用来被prometheus
监控,内容如下:
# cat service-websocket.yaml apiVersion: v1 kind: Service metadata: name: websocket namespace: kube-mon spec: # 暂使用nodeport的形式 type: NodePort ports: - port: 9189 targetPort: 9189 protocol: TCP nodePort: 32071 selector: app.kubernetes.io/name: wss
获取ip port
# 启动上面deploy和service kubectl apply -f websocket-kube-mon-prometheus.yaml kubectl apply -f service-websocket.yaml # 查看pod和service kubectl get pod -n kube-mon kubectl get svc -n kube-mon NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE websocket NodePort 192.168.237.56 <none> 9189:32071/TCP 1h
配置prometheus
配置prometheus监控
# vim sidecar/cm-kube-mon-sidecar.yaml //添加以下配置 - job_name: 'websocket' static_configs: - targets: ['192.168.237.56:9189']
# 重载 kubectl apply -f sidecar/cm-kube-mon-sidecar.yaml # prometheus reload: curl -X POST http://prometheus-pod-ip:9090/-/reload
配置告警规则
# vim sidecar/rules-cm-kube-mon-sidecar.yaml //添加以下配置 - alert: websocket 接口探测到异常 expr: websocket{job="websocket"} < 1 for: 30s labels: severity: 紧急 annotations: #summary: "接口{{ $labels.url }} 探测异常" description: "websocket地址: {{ $labels.url }} 探测异常 , 状态为: down ."
# 重载,prometheus有热更新,稍等待1分钟左右即可 kubectl apply -f sidecar/rules-cm-kube-mon-sidecar.yaml
报警测试
关闭测试websocket service
# 查看进程号 netstat -lnp|grep 8765 # 杀掉进程 kill you-id
我们可以终端请求直接看到接口监控状态,如下:
curl 192.168.237.56:9189/metrics # HELP websocket websocket_help # TYPE websocket gauge websocket{url="ws://192.168.128.6:8765"} 0
稍等待一会儿,报警信息报出,内容如下:
重新运行websocket service
python websocket-server.py &
curl 192.168.237.56:9189/metrics # HELP websocket websocket_help # TYPE websocket gauge websocket{url="ws://192.168.128.6:8765"} 1
稍等待一会儿,恢复信息报出,内容如下:
参考库

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
优秀程序员都在注意的十个点
1. 多走半里路 很多事情并不难,只是缺乏多走半里路的习惯! 反例 public boolean isInValid(String str) { if (str == null || str.trim().length() == 0) { return true; } return false; } 多走一步,海阔天空 public boolean isInValid(String str) { return (str == null) || (str.trim().length() == 0); } 是个程序员都知道哪个更好! 还有一种见过很多次的代码: public boolean isEmptyName() { return StringUtils.isEmpty(name)? true: false; } 难道不感觉到多余吗? 再走半步,山清水秀 public boolean isEmptyName() { return StringUtils.isEmpty(name); } 2. 空对象 NullPointException,让我们防不胜防;尤其是使用第三方API,如果抛出...
- 下一篇
C++ 继承 详解
@[toc] 一、什么是继承? 1.1、概念 **继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。 1.2、定义 下面我们看到Person是父类,也称作基类。Student是子类,也称作派生类 1.2.1、继承关系和访问限定符 1.2.2、继承基类成员访问方式的变化 // 实例演示三种继承关系下基类成员的各类型成员访问关系的变化 class Person { public : void Print () { cout<<_name <<endl; } protected : string _name ; // 姓名 private : int _age ; // 年龄 }; //三种继承方式,对应上面图表 //class Student : protected Person //class Student : private Person class Student : public Person { protected : int _stunum...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS关闭SELinux安全模块
- Linux系统CentOS6、CentOS7手动修改IP地址
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS8安装Docker,最新的服务器搭配容器使用