我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python过滤 Kubernetes api数据

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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": "9715086"
    },
    "items": [{
        "metadata": {
            "name": "voucher-center-master",
            "namespace": "default",
            "selfLink": "/api/v1/namespaces/default/endpoints/voucher-center-master",
            "uid": "8fd980bf-0507-11e9-a3b3-005056bb4630",
            "resourceVersion": "9051672",
            "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": "9051584"
                        }
                    },
                    {
                        "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": "9051604"
                        }
                    },
                    {
                        "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": "9051627"
                        }
                    },
                    {
                        "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": "9051577"
                        }
                    },
                    {
                        "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": "9051637"
                        }
                    }
                ],
                "ports": [
                    {
                        "name": "beejob-3011",
                        "port": 3011,
                        "protocol": "TCP"
                    },
                    {
                        "name": "server-30012",
                        "port": 8012,
                        "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: 8012
      targetPort: 8012
      protocol: TCP
      nodePort: 31012
      name: server-31012
    - port: 3011
      targetPort: 3011
      protocol: TCP
      name: beejob-3011
  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":"8012",
            "beejob_port":"3101",
        },
        {
            "ip":"192.169.183.26",
            "nodeName":"job-node137",
            "pod_name":"voucher-center-rc-vknkt",
            "server_port":"8012",
            "beejob_port":"3101",
        },
        ...
    ],
}

 

其中 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-8
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":"8012",
            "beejob_port":"3101",
        },
        {
            "ip":"192.169.183.26",
            "nodeName":"job-node137",
            "pod_name":"voucher-center-rc-vknkt",
            "server_port":"8012",
            "beejob_port":"3101",
        },
        ...
    ],
}
"""


class Endpoints(object):
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port

    def check_tcp(self, ip, port, timeout=1):
        """
        检测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[0] == 2:
                ipaddress.ip_address(ip.strip().decode("utf-8"))
            elif sys.version_info[0] == 3:
                # 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[0]就是脚本名,所以要减1
    num = len(sys.argv) - 1
    if num < 2 or num > 2:
        print("参数错误,必须传2个参数,分别是ip和端口")
        print("比如:python endpoints_v1.py 192.168.1.1 8080")
        exit()

    ip = sys.argv[1]  # ip
    port = sys.argv[2]  # 端口

    # ip = "192.168.1.1"
    # port = "8080"
    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格式化工具,效果如下:

1.png

 

那么有了这些数据,就可以做端口的健康检测了!

 


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python过滤 Kubernetes api数据

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python过滤 Kubernetes api数据

Kubernetesendpoints api地址http://ip地址:端口/api/v1/namespaces/default/endpointsservices api地址http://ip地址:端口/api/v1/namespace
2023-01-31

python怎么过滤出想要的数据

在Python中,可以使用多种方法来过滤出想要的数据。下面是一些常用的方法:1. 使用列表推导式:列表推导式是一种简洁的方式来生成列表,可以结合条件语句来过滤出满足条件的数据。例如:```pythondata = [1, 2, 3, 4,
2023-09-29

PHP数据过滤函数详解:filter_var、filter_input、filter_has_var等函数的数据过滤技巧

PHP数据过滤函数详解:filter_var、filter_input、filter_has_var等函数的数据过滤技巧,需要具体代码示例在 Web 开发中,数据过滤是非常重要的一环。过滤用户输入的数据可以保护我们的应用程序免受潜在的安全威
PHP数据过滤函数详解:filter_var、filter_input、filter_has_var等函数的数据过滤技巧
2023-11-18

python 数据清洗之数据合并、转换、过滤、排序

前面我们用pandas做了一些基本的操作,接下来进一步了解数据的操作, 数据清洗一直是数据分析中极为重要的一个环节。 数据合并 在pandas中可以通过merge对数据进行合并操作。import numpy as np import pan
2022-06-04

MySQL怎么过滤重复数据

本篇内容主要讲解“MySQL怎么过滤重复数据”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL怎么过滤重复数据”吧!方法1:加关键字 DISTINCT在mysql中,可以利用“SELECT
2023-07-06

PHP数据过滤拯救世界:从过滤脏数据开始,让世界更美好!

数据过滤是Web开发中必不可少的安全机制,它可以防止恶意用户提交的脏数据危害网站。本文将介绍PHP中常用的数据过滤技术,并演示如何使用这些技术来保护网站。
PHP数据过滤拯救世界:从过滤脏数据开始,让世界更美好!
2024-02-04

Java整合mybatis实现过滤数据

这篇文章主要介绍了Java整合mybatis实现过滤数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
2023-01-14

PHP中怎么实现数据过滤

本篇文章给大家分享的是有关PHP中怎么实现数据过滤,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。PHP数据过滤调度方法这种方法是用一个单一的PHP脚本调度(通过 URL)。其他
2023-06-17

python如何使用Filter()过滤函数

小编给大家分享一下python如何使用Filter()过滤函数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! Filter()过滤函数filter()函数使用指定
2023-06-27

Python匿名函数/排序函数/过滤函数

一. lamda匿名函数   为了解决一些简单的需求而设计的一句话函数# 计算n的n次方def func(n): return n**nprint(func(10))f = lambda n: n**nprint(f(10))  la
2023-01-31

PHP数据过滤的黑魔法:揭秘安全过滤的奥秘,保护数据免遭污染!

了解数据过滤技术并掌握其技巧,可以有效防止恶意代码的入侵,保护网站数据和用户隐私。
PHP数据过滤的黑魔法:揭秘安全过滤的奥秘,保护数据免遭污染!
2024-02-05

python如何使用filter函数过滤值

这篇文章主要介绍了python如何使用filter函数过滤值,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用filter函数过滤值filter函数用于过滤可迭代对象中的某些
2023-06-27

perl如何过滤文件中的数据

在Perl中,可以使用正则表达式或者内置的字符串函数来过滤文件中的数据。以下是两种常见的方法:1. 使用正则表达式过滤数据:```perlopen(my $fh, 'while (my $line = ) {if ($line =~ /pa
2023-10-07

wireshark怎么过滤udp协议的数据

要过滤UDP协议的数据,在Wireshark的过滤表达式中使用"udp"关键字即可。以下是一些在Wireshark中过滤UDP数据的示例:1. 过滤所有UDP流量:```udp```2. 过滤源端口号为12345的UDP流量:```udp.
2023-09-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录