一、需求分析

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. PowerExchange实时抽取架构介绍

    工作原理 准实时抽取架构图: 以上共有核心业务系统数据库服务器.ETL服务器.BI数据库服务器[目标数据库服务器],三台服务器和ETL客户端(PowerCenter客户端).其中核心业务系统上有核心系 ...

  2. pgm7

    和 Koller 的 video 最大的不同莫过于书上讲 LBP 的角度不是 procedural 的,而是原理性的.我们先看个 procedural 的,在一般的 cluster graph 上的 ...

  3. 【题解】 bzoj2460: [BeiJing2011]元素 (线性基)

    bzoj2460,戳我戳我 Solution: 线性基板子,没啥好说的,注意long long 就好了 Code: //It is coded by Ning_Mew on 5.29 #include ...

  4. luogu1525 [NOIp2011]关押罪犯 (并查集)

    先从大到小排序,看到哪个的时候安排不开了 给每个人拆成两个,如果x和y有矛盾,就给x和y‘.y和x’连边:如果a和b(或a'和b')在同一个集合里,说明他们一定要在同一个监狱里. #include&l ...

  5. 修改docker镜像和容器的存放路径

    默认情况下,镜像和容器存放的路径是/var/lib/docker. 要修改这个设置很简单,把指定的目录软链到这个目录,或者将一个单独的分区挂载到这个目录,或者直接修改docker启动参数. 查看使用帮 ...

  6. c++中的 Stl 算法(很乱别看)

    #include <iostream> #include <vector> #include <functional> #include <algorithm ...

  7. python---基础知识回顾(二)(闭包函数和装饰器)

    一.闭包函数: 闭包函数: 1.在一个外函数中定义了一个内函数 2.内函数里运用了外函数的临时变量,而不是全局变量 3.并且外函数的返回值是内函数的引用.(函数名,内存块地址,函数名指针..) 正确形 ...

  8. VS2010 设置main函数输入参数

    main函数的argc.argv参数. 英文版:菜单Project -> Properties -> Configuration Properties -> Debugging在Co ...

  9. 实现vue2.0响应式的基本思路

    最近看了vue2.0源码关于响应式的实现,以下博文将通过简单的代码还原vue2.0关于响应式的实现思路. 注意,这里只是实现思路的还原,对于里面各种细节的实现,比如说数组里面数据的操作的监听,以及对象 ...

  10. scrapy 简单防封

    设置爬取间隔 setting.py from random import random DOWNLOAD_DELAY = random()* ps:此次的爬取间隔,在读取seeting文件确定,并非每 ...