一、需求分析

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数据的更多相关文章

  1. Python使用 Kubernetes API 访问集群

    通过将身份认证令牌直接传给 API 服务器,可以避免使用 kubectl 代理,像这样:使用 grep/cut 方式: 通过将身份认证令牌直接传给 API 服务器,可以避免使用 kubectl 代理, ...

  2. 使用Python调用Flickr API抓取图片数据

    Flickr是雅虎旗下的图片分享网站,上面有全世界网友分享的大量精彩图片,被认为是专业的图片网站.其API也很友好,可以实现多种功能.这里我使用了Python调用其API获得了大量的照片数据.需要注意 ...

  3. python爬虫的页面数据解析和提取/xpath/bs4/jsonpath/正则(1)

    一.数据类型及解析方式 一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值.内容一般分为两部分,非结构化的数据 和 结构化的数据. 非结构化数据:先有数据,再有结构, 结构化数 ...

  4. python爬取拉勾网数据并进行数据可视化

    爬取拉勾网关于python职位相关的数据信息,并将爬取的数据已csv各式存入文件,然后对csv文件相关字段的数据进行清洗,并对数据可视化展示,包括柱状图展示.直方图展示.词云展示等并根据可视化的数据做 ...

  5. 模拟提交API数据Pyqt版

    其实这个模拟提交数据之前已经写过篇: Python requests模拟登录 因为现在在做的项目中需要一个debug请求调试API,用PHP的CURL写了一个,又因Pyqt更能直观灵活的显示请求的参数 ...

  6. 利用python进行数据分析之数据加载存储与文件格式

    在开始学习之前,我们需要安装pandas模块.由于我安装的python的版本是2.7,故我们在https://pypi.python.org/pypi/pandas/0.16.2/#downloads ...

  7. Python读取SQLite文件数据

    近日在做项目时,意外听说有一种SQLite的数据库,相比自己之前使用的SQL Service甚是轻便,在对数据完整性.并发性要求不高的场景下可以尝试! 1.SQLite简介: SQLite是一个进程内 ...

  8. Python 操作 GA API 指南

    因为需要写一个 Blog Feature 的缘故,所以接触了下 GA 的 Python API,发现 G 家的 API 不是那么直观,比较绕,但是,在使用过程中发现其实 G 家的 API 设计挺有意思 ...

  9. TensorLayer官方中文文档1.7.4:API – 数据预处理

    所属分类:TensorLayer API - 数据预处理¶ 我们提供大量的数据增强及处理方法,使用 Numpy, Scipy, Threading 和 Queue. 不过,我们建议你直接使用 Tens ...

随机推荐

  1. 解决sublime text3下中文无法输入的问题(Ubuntu)

    sublime-text-imfix,非常无脑.就喜欢这样的.

  2. C#小技巧

    1.将字符串转换成大写ToUpper string a="zxc"; a.ToUpper()  输出结果ZXC; a.ToUpper().Contains("Z" ...

  3. Codeforces Round #485 Div. 1 vp记

    A:对每种商品多源bfs一下每个点到该商品的最近距离,对每个点sort一下取前s个即可. #include<iostream> #include<cstdio> #includ ...

  4. hdu 5274 Dylans loves tree (树链剖分 + 线段树 异或)

    Dylans loves tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  5. SQL问题(面试题)

    面试完后在本地mysql数据库中重现了该问题 数据表stuscore信息如下: 1.计算每个人的总成绩,并且排名(要求显示字段 学号 姓名 总成绩)SELECT stuid AS 学号,NAME AS ...

  6. caffe多任务、多标签

    解决的目标问题:多分类问题,比如车辆的外形和颜色,苹果的大小和颜色:多任务:车牌角点的定位和车牌的颜色.定位在技术上属于回归,车牌颜色判断则属于分类. 技术点 caffe默认是单输入任务单标签的,也就 ...

  7. Burpsuit分块传输插件绕WAF原理和技巧(转)

      0x00 原理 给服务器发送payload数据包,使得waf无法识别出payload,当apache,tomcat等web容器能正常解析其内容.如图一所示 0x02  实验环境 本机win10+x ...

  8. 造成ORA-01843 无效的月份 的一些原因

    1) 当我们在一个中文环境的客户端使用如下sql语句INSERT INTO "temptable" ( DELIVER_DATE ) VALUES (TO_DATE('27-Jun ...

  9. 前端学习 -- Css -- overflow

    子元素默认是存在于父元素的内容区中,理论上讲子元素的最大可以等于父元素内容区大小.如果子元素的大小超过了父元素的内容区,则超过的大小会在父元素以外的位置显示,超出父元素的内容,我们称为溢出的内容.父元 ...

  10. zabbix server安装(二)

    https://mp.weixin.qq.com/s/ogaqiX4vhtGLepuNf-1ItA zabbix依赖LNMP或LAMP,下面讲解LNMP安装到zabbix web页面的访问. 一.ng ...