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 ...
随机推荐
- 提升jmeter自身性能
JMeter负载测试时使用GUI界面和较多的收集测试结果的监听器容易造成jmeter的性能瓶颈,远程测试时的控制台尤为明显.提升JMeter负载测试时性能的方法如下: 官方的解决办法:http://j ...
- MySQL : 数据库和表的基本操作总结
针对database和table的操作大致可分为三类:创建,查询,修改,删除 1. 创建 create ①创建数据库 create database db_name; ②创建表 create tabl ...
- lightgbm原理以及Python代码
原论文: http://papers.nips.cc/paper/6907-lightgbm-a-highly-efficient-gradient-boosting-decision-tree.pd ...
- hdwiki 参考资料改成可点击跳转的(默认不能点)
(1)首先在view这个文件夹找到viewdoc.htm文件.(2)在viewdoc.htm源码中搜索“<dd> <span>[{eval echo ($i+1)}]”找到下面 ...
- 解决 No Entity Framework provider found for the ADO.NET provider
方法很简单,添加下面的dll即可 EntityFramework.SqlServer.dll 疯吻IT
- hdu5449 Robot Dog (树形dp+倍增lca)
(警告:本篇博客包含大量人类本质内容) 先处理出来lca,然后就只需要知道从每个点到他的父亲.和从他的父亲到这个点的期望时间就可以了 我们设f[x]为x到他父亲的期望时间:g[x]为从x的父亲到x的期 ...
- zabbix监控的基础概念、工作原理及架构(一)
zabbix监控的基础概念.工作原理及架构 转载于网络 一.什么是zabbix及优缺点 Zabbix能监视各种网络参数,保证服务器系统的安全运营,并提供灵活的通知机制以让系统管理员快速定位/解决存在的 ...
- JAVA-Servlet高级应用
会话只是指一段指定的时间间隔. 会话跟踪是维护用户状态(数据)的一种方式.它也被称为servlet中的会话管理. Http协议是一个无状态的,所以我们需要使用会话跟踪技术来维护用户状态. 每次用户请求 ...
- centos 7 两台机器搭建三主三从 redis 集群
参考自:https://linux.cn/article-6719-1.htmlhttp://blog.csdn.net/xu470438000/article/details/42971091 ## ...
- html5 canvas文本处理
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...