python过滤 Kubernetes api数据
一、需求分析
Kubernetes endpoints api地址
http://ip地址:端口/api/v1/namespaces/default/endpoints
services api地址
http://ip地址:端口/api/v1/namespaces/default/services
下面主要展示 endpoints api的部分数据
{
"kind": "EndpointsList",
"apiVersion": "v1",
"metadata": {
"selfLink": "/api/v1/namespaces/default/endpoints",
"resourceVersion": ""
},
"items": [{
"metadata": {
"name": "voucher-center-master",
"namespace": "default",
"selfLink": "/api/v1/namespaces/default/endpoints/voucher-center-master",
"uid": "8fd980bf-0507-11e9-a3b3-005056bb4630",
"resourceVersion": "",
"creationTimestamp": "2018-12-21T10:02:44Z"
},
"subsets": [
{
"addresses": [
{
"ip": "192.169.167.105",
"nodeName": "job-node149",
"targetRef": {
"kind": "Pod",
"namespace": "default",
"name": "voucher-center-rc-p20kk",
"uid": "76dd6355-1269-11e9-95a3-005056bb4630",
"resourceVersion": ""
}
},
{
"ip": "192.169.183.26",
"nodeName": "job-node137",
"targetRef": {
"kind": "Pod",
"namespace": "default",
"name": "voucher-center-rc-vknkt",
"uid": "7751e013-1269-11e9-95a3-005056bb4630",
"resourceVersion": ""
}
},
{
"ip": "192.169.242.29",
"nodeName": "job-node145",
"targetRef": {
"kind": "Pod",
"namespace": "default",
"name": "voucher-center-rc-0x482",
"uid": "7790169d-1269-11e9-95a3-005056bb4630",
"resourceVersion": ""
}
},
{
"ip": "192.169.76.159",
"nodeName": "job-node151",
"targetRef": {
"kind": "Pod",
"namespace": "default",
"name": "voucher-center-rc-xtxfb",
"uid": "771842c8-1269-11e9-95a3-005056bb4630",
"resourceVersion": ""
}
},
{
"ip": "192.169.98.159",
"nodeName": "job-node147",
"targetRef": {
"kind": "Pod",
"namespace": "default",
"name": "voucher-center-rc-n9wkl",
"uid": "77cb9ffc-1269-11e9-95a3-005056bb4630",
"resourceVersion": ""
}
}
],
"ports": [
{
"name": "beejob-3011",
"port": ,
"protocol": "TCP"
},
{
"name": "server-30012",
"port": ,
"protocol": "TCP"
}
]
}
]
}, ]
}
需要提取以下数据
items-->metadata-->name
items-->subsets-->addresses-->ip
items-->subsets-->addresses-->nodeName
items-->subsets-->addresses-->targetRef-->name
items-->subsets-->ports-->port
items-->subsets-->ports-->port
在应用的yaml文件中,定义了2个端口
apiVersion: v1
kind: Service
metadata:
name: voucher-center-master
namespace: xx
spec:
type: NodePort
ports:
- port:
targetPort:
protocol: TCP
nodePort:
name: server-
- port:
targetPort:
protocol: TCP
name: beejob-
selector:
name: voucher-center
一个是server-port,一个是beejob-port
我需要对server-port和beejob-port做健康检测!
二、数据结构
上面的api需要提取6个字段信息,最终的数据结构如下:
{
"voucher-center-master":[
{
"ip":"192.169.167.105",
"nodeName":"job-node149",
"pod_name":"voucher-center-rc-p20kk",
"server_port":"",
"beejob_port":"",
},
{
"ip":"192.169.183.26",
"nodeName":"job-node137",
"pod_name":"voucher-center-rc-vknkt",
"server_port":"",
"beejob_port":"",
},
...
],
}
其中 pod_name 对应 items-->subsets-->addresses-->targetRef-->name
server_port 对应 items-->subsets-->ports-->port 注意:ports里面的name必须是以server开头的
beejob_port 对应 items-->subsets-->ports-->port 注意:ports里面的name必须是以beejob开头的
三、正式代码
#!/usr/bin/env python3
# coding: utf-
import sys
import json
import socket
import ipaddress
import requests """
要求的数据格式
beejob_port是动态的,存在即有
{
"voucher-center-master":[
{
"ip":"192.169.167.105",
"nodeName":"job-node149",
"pod_name":"voucher-center-rc-p20kk",
"server_port":"",
"beejob_port":"",
},
{
"ip":"192.169.183.26",
"nodeName":"job-node137",
"pod_name":"voucher-center-rc-vknkt",
"server_port":"",
"beejob_port":"",
},
...
],
}
""" class Endpoints(object):
def __init__(self, ip, port):
self.ip = ip
self.port = port def check_tcp(self, ip, port, timeout=):
"""
检测tcp端口
:param ip: ip地址
:param port: 端口号
:param timeout: 超时时间
:return: bool
"""
flag = False
try:
socket.setdefaulttimeout(timeout) # 整个socket层设置超时时间
cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = (str(ip), int(port))
status = cs.connect_ex((address)) # 开始连接
cs.settimeout(timeout) if not status:
flag = True return flag
except Exception as e:
print("error:%s" % e)
return flag def valid_ip(self, ip):
"""
验证ip是否有效,比如192.168.1.256是一个不存在的ip
:return: bool
"""
try:
# 判断 python 版本
if sys.version_info[] == :
ipaddress.ip_address(ip.strip().decode("utf-8"))
elif sys.version_info[] == :
# ipaddress.ip_address(bytes(ip.strip().encode("utf-8")))
ipaddress.ip_address(ip) return True
except Exception as e:
print(e)
return False def main(self):
"""
主程序
:return: json
"""
valid_ip = self.valid_ip(self.ip)
if not valid_ip:
return "%s ip不合法" % self.ip check_tcp = self.check_tcp(self.ip,self.port)
if not check_tcp:
return "%s 端口不可达" % self.port # 需要访问的url
url = "http://{}:{}/api/v1/namespaces/default/endpoints".format(self.ip, self.port) response = requests.get(url, ) # get请求地址
content = (response.content).decode('utf-8') # 二进制转换为字符串
dic = json.loads(content) # 反序列化成字典
# print(dic,type(dic)) filter_dic = {} # 筛选结果 for i in dic['items']:
if not filter_dic.get(i['metadata']['name']): # 判断name是否存在
filter_dic[i['metadata']['name']] = [] # 初始化列表 if i.get('subsets'): # 判断subsets是否存在
for j in i['subsets']:
for k in j['addresses']: # 遍历字典
filter_dic[i['metadata']['name']].append({}) # 添加空字典
for m in filter_dic[i['metadata']['name']]: # 遍历列表
if not m.get('ip'):
# print("-->ip:",k['ip'])
# 设置ip地址
m['ip'] = k['ip'] if k.get('nodeName'):
# print("-->nodeName:", k['nodeName'])
if not m.get('nodeName'):
# 设置nodeName
m['nodeName'] = k['nodeName'] if k.get('targetRef'):
if not m.get('pod_name'):
# 设置pod_name
m['pod_name'] = k['targetRef']['name'] for ports in j['ports']:
if ports.get('name'): # 判断键值存在时
# 遍历字典
for m in filter_dic[i['metadata']['name']]:
# 判断name值以server开头时
if ports['name'].startswith('server'):
if not m.get('server_port'):
# 增加键值对
m['server_port'] = ports['port']
if ports['name'].startswith('beejob'):
if not m.get('beejob_port'):
m['beejob_port'] = ports['port'] # print(filter_dic)
# print(json.dumps(filter_dic))
return json.dumps(filter_dic) if __name__ == '__main__':
# 参数个数,由于sys.argv[]就是脚本名,所以要减1
num = len(sys.argv) -
if num < or num > :
print("参数错误,必须传2个参数,分别是ip和端口")
print("比如:python endpoints_v1.py 192.168.1.1 8080")
exit() ip = sys.argv[] # ip
port = sys.argv[] # 端口 # ip = "192.168.1.1"
# port = ""
res = Endpoints(ip, port).main()
print(res)
执行输出:
{"voucher-center-master":[{"server_port":8012,"ip":"192.169.167.105","pod_name":"voucher-center-rc-p20kk","nodeName":"job-node149","beejob_port":3011},{"server_port":8012,"ip":"192.169.183. 26","pod_name":"voucher-center-rc-vknkt","nodeName":"job-node137","beejob_port":3011},{"server_port":8012,"ip":"192.169.242.29","pod_name":"voucher-center-rc-0x482","nodeName":"job-node145","beejob_port":3011},{"server_port":8012,"ip":"192.169.76.159","pod_name":"voucher-center-rc-xtxfb","nodeName":"job-node151","beejob_port":3011},{"server_port":8012,"ip":"192.169.98.159","pod_name":"voucher-center-rc-n9wkl","nodeName":"job-node147","beejob_port":3011}]}
使用json格式化工具,效果如下:

那么有了这些数据,就可以做端口的健康检测了!
python过滤 Kubernetes api数据的更多相关文章
- Python使用 Kubernetes API 访问集群
通过将身份认证令牌直接传给 API 服务器,可以避免使用 kubectl 代理,像这样:使用 grep/cut 方式: 通过将身份认证令牌直接传给 API 服务器,可以避免使用 kubectl 代理, ...
- 使用Python调用Flickr API抓取图片数据
Flickr是雅虎旗下的图片分享网站,上面有全世界网友分享的大量精彩图片,被认为是专业的图片网站.其API也很友好,可以实现多种功能.这里我使用了Python调用其API获得了大量的照片数据.需要注意 ...
- python爬虫的页面数据解析和提取/xpath/bs4/jsonpath/正则(1)
一.数据类型及解析方式 一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值.内容一般分为两部分,非结构化的数据 和 结构化的数据. 非结构化数据:先有数据,再有结构, 结构化数 ...
- python爬取拉勾网数据并进行数据可视化
爬取拉勾网关于python职位相关的数据信息,并将爬取的数据已csv各式存入文件,然后对csv文件相关字段的数据进行清洗,并对数据可视化展示,包括柱状图展示.直方图展示.词云展示等并根据可视化的数据做 ...
- 模拟提交API数据Pyqt版
其实这个模拟提交数据之前已经写过篇: Python requests模拟登录 因为现在在做的项目中需要一个debug请求调试API,用PHP的CURL写了一个,又因Pyqt更能直观灵活的显示请求的参数 ...
- 利用python进行数据分析之数据加载存储与文件格式
在开始学习之前,我们需要安装pandas模块.由于我安装的python的版本是2.7,故我们在https://pypi.python.org/pypi/pandas/0.16.2/#downloads ...
- Python读取SQLite文件数据
近日在做项目时,意外听说有一种SQLite的数据库,相比自己之前使用的SQL Service甚是轻便,在对数据完整性.并发性要求不高的场景下可以尝试! 1.SQLite简介: SQLite是一个进程内 ...
- Python 操作 GA API 指南
因为需要写一个 Blog Feature 的缘故,所以接触了下 GA 的 Python API,发现 G 家的 API 不是那么直观,比较绕,但是,在使用过程中发现其实 G 家的 API 设计挺有意思 ...
- TensorLayer官方中文文档1.7.4:API – 数据预处理
所属分类:TensorLayer API - 数据预处理¶ 我们提供大量的数据增强及处理方法,使用 Numpy, Scipy, Threading 和 Queue. 不过,我们建议你直接使用 Tens ...
随机推荐
- Vue项目框架
Vue项目框架 基本组件的使用: new Vue({ el, //要绑定的DOM element data, //要绑定的资料 props, //可用来接收父原件资料的属性 template, //要 ...
- iOS RSA的加密和签名
1.RSA加密使用服务端给的公钥.pem,RSA签名使用客户端的私钥.pem. 参考文章:http://www.jianshu.com/p/4580bee4f62f 把文件夹导入项目中,然后配置这两个 ...
- 学习Spring Boot:(十一) 自定义装配参数
前言 SpringMVC 中 Controller 中方法的参数非常灵活,得益于它的强大自动装配,这次将根据上次遗留下的问题,将研究下装配参数. 正文 SpringMVC中使用了两个接口来处理参数: ...
- 今天GG
刚开考: 这里锅了,那里锅了,还被D了QAQ. 然后\(YL\)说,\(T2\)不是傻逼题吗. 于是萝卜秒掉了\(T1\). 于是\(gsy\)秒掉了\(T3\). \(lalaxu,FlashHu\ ...
- 前端学习 -- Html&Css -- 相对定位 绝对定位 固定定位
相对定位 - 定位指的就是将指定的元素摆放到页面的任意位置,通过定位可以任意的摆放元素. - 通过position属性来设置元素的定位. -可选值: static:默认值,元素没有开启定位: rela ...
- ssm controller层 junit单元测试
原文链接:https://www.cnblogs.com/oucbl/p/5943743.html springmvc controller junit 测试 作者:blouc@qq.com本文为作者 ...
- Centos7搭建SS以及加速配置的操作记录
部署 Shadowsocks之前,对它做了一个简单的了解,下面先介绍下.一道隐形的墙众所周知,天朝局域网通过 GFW (中国防火墙长城:英文名称Great Firewall of China,简写为G ...
- SQL Server 一些查询技巧
--1.[行列转换] --列转行 USE tempdb GO IF (OBJECT_ID('DEPT') IS NOT NULL) DROP TABLE DEPT CREATE TABLE DEPT( ...
- Python 文件解压缩
shutil对压缩包的处理是通过调用zipFile和tarFile两个模块来进行的. import zipfile # zipfile压缩 z = zipfile.ZipFile('ss.zip', ...
- MySQL初始化以及客户端工具的使用
MySQL初始化以及客户端工具的使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是关系型数据库 关系型数据库通常是把所有的数据都组织成二维关系.之所以称为关系型数据库是 ...