线上有一套k8s集群,部署了很多应用。现在需要对一些基础服务做一些常规检测,比如:
- 系统时间,要求:k8s的每一个节点的时间,差值上下不超过2秒
- k8s版本,要求:k8s的每一个节点的版本必须一致
- redis集群,要求:1. 查看cluster nodes状态 2. AOF状态
- etcd,要求:访问etcd的api,能获取到版本信息, 说明etcd服务正常
- mysql,要求:获取mysql运行统计时间,能获取说明mysql服务正常
- ceph,要求:使用ceph osd tree命令查看ceph节点信息
- kafka,要求:使用生产者模式写入一个消息,消费者模式能得到同样的消息,则kafka服务正常
上面这么多要求,有一大部分,都需要远程执行命令。那么如何使用python来执行远程命令呢?
使用paramiko模块即可!
paramiko
安装paramiko模块
使用paramiko
这里,我封装了一个函数ssh2,代码如下:
执行此函数,会返回一个列表。因为是使用readlines,将结果转换为列表了!
如果执行时,输出:
原因
paramiko 2.4.2 依赖 cryptography,而最新的cryptography==2.5里有一些弃用的API。
解决
删掉cryptography,安装2.4.2,就不会报错了。
我们需要获取多台服务器的时间,并且还需要对比时间差。那么最简单办法,就是获取时间戳,它是一段数字,那么数字之间,就可以做减法了!
使用 date +%s
怎么去对比,每一天服务器的时间戳呢?上面已经获取到时间戳了,关键问题是,如何对比?
构造字典
这里需要构造一个数据字典,将每一台服务器的ip以及时间戳存储一下,数据格式如下:
对比数据
首先从字典里面取出第一个值,由于python 3.5是无需的,所以取出的数据,每次可能不一样。不过没有关系,取出之后,再删除即可!
然后将取出的第一个值,和字典中的其他值,做对比即可!注意:时间戳要转换为int类型才行!
ntp.py
View Code
执行脚本,输出如下:
查看k8s版本,使用命令 kubectl version
那么要获取到 "v1.11.2" ,还需要进一步过滤
使用上面的ssh2函数之后,输出的值,是这样的
这里会有一个换行符,为了避免这种问题,使用 json.loads() 反序列一下,就可以还原为 v1.11.2,连双引号也没有了!
kube_v.py
View Code
执行输出:
查看cluster nodes信息,使用命令
请确保服务器,已经安装了redis,可以执行redis-cli命令
执行输出:
从上面的输出信息,可以看出,有3个master节点,3个slave节点。其中紫色部分,如果id一致,表示这是一组服务器!
请确保这一组服务器不能同时挂掉,否则会造成数据丢失!
默认redis集群要求至少6个节点,当redis集群中的master节点,挂掉一半时,集群不可用。
也就是说,目前有3个master节点,最多允许1台mater节点挂掉!
判断依据
还有一点,当有任意一个节点状态为fail时,也表示集群不正常!说明:mater节点已经挂掉了一半!
因此,使用python来判断集群是否状态的关键点,就是判断状态中是否有fail即可!
在redis.conf配置文件中, 有一个参数 appendonly ,表示是否开启aof,默认是关闭的。
那么使用redis-cli可以获取它的状态
执行输出:
上面这段输出,表示 没有开启aof
redis.py
View Code
执行程序,输出:
判断etcd工作是否正常,只需要能访问到api地址,就说明正常,url如下:
etcd.py
View Code
执行输出:
查看mysql的运行统计时间,使用命令
View Code
执行输出:
查看节点信息,需要在 主节点操作
View Code
执行输出:
手动创建名为test的topic
因为python中的kakfa包无法直接创建 topic,所以需要手动创建
由于线上kafka启动了ACL,那么请确保相关用户设置了ACL规则,关于acl的配置,请参考链接:
为了方便,这里直接使用超级用户。注意:超级用户是不需要设置ACL规则的,拥有所有权限
View Code
执行程序,输出:
注意:第一次执行时,会卡住1分钟。多执行几次就会很快了,至于什么原因,不知道!
就是在执行这一行代码时,会卡住