Python使用Kubernetes API访问集群


Posted in Python onMay 30, 2021

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

# 查看所有的集群,因为你的 .kubeconfig 文件中可能包含多个上下文
kubectl config view -o jsonpath='{"Cluster name\tServer\n"}{range .clusters[*]}{.name}{"\t"}{.cluster.server}{"\n"}{end}'

# 从上述命令输出中选择你要与之交互的集群的名称
export CLUSTER_NAME="some_server_name"

# 指向引用该集群名称的 API 服务器
APISERVER=$(kubectl config view -o jsonpath="{.clusters[?(@.name==\"$CLUSTER_NAME\")].cluster.server}")

# 获得令牌
TOKEN=$(kubectl get secrets -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='default')].data.token}"|base64 -d)

# 使用令牌玩转 API
curl -X GET $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure

客户端库:https://kubernetes.io/zh/docs/reference/using-api/client-libraries/

python举例:

目录结构

Python使用Kubernetes API访问集群

配置文件两种方式

1、将集群中的~/.kube/config,重命名为kubeconfig.yaml
代码:

from kubernetes import  client,config
from kubernetes.stream import stream
import yaml
config_file = r"D:\Users\JackHe\PycharmProjects\JJ\k8s\auth\kubeconfig.yaml"
config.kube_config.load_kube_config(config_file=config_file)
Api_Instance = client.CoreV1Api()
Api_Batch = client.BatchV1Api()

#列出所有的namesapce
for ns in Api_Instance.list_namespace().items:
    print(ns.metadata.name)

#列出所有的nodes
def list_node():
    api_response = Api_Instance.list_node()
    data = {}
    for i in api_response.items:
        data[i.metadata.name] = {"name": i.metadata.name,
                                "status": i.status.conditions[-1].type if i.status.conditions[-1].status == "True" else "NotReady",
                                "ip": i.status.addresses[0].address,
                                "kubelet_version": i.status.node_info.kubelet_version,
                                "os_image": i.status.node_info.os_image,
                                 }
    return data
nodes = list_node()
print(nodes)

2、使用token形式,获取命令上文所示。
代码:

# -*- coding: utf-8 -*-
from kubernetes.client import api_client
from kubernetes.client.apis import core_v1_api
from kubernetes import client,config


class KubernetesTools(object):
    def __init__(self):
        self.k8s_url = 'https://192.168.1.56:6443'

    def get_token(self):
        """
        获取token
        :return:
        """
        with open(r'D:\Users\JackHe\PycharmProjects\JJ\k8s\auth\token', 'r') as file:
            Token = file.read().strip('\n')
            return Token

    def get_api(self):
        """
        获取API的CoreV1Api版本对象
        :return:
        """
        configuration = client.Configuration()
        configuration.host = self.k8s_url
        configuration.verify_ssl = False
        configuration.api_key = {"authorization": "Bearer " + self.get_token()}
        client1 = api_client.ApiClient(configuration=configuration)
        api = core_v1_api.CoreV1Api(client1)
        return api

    def get_namespace_list(self):
        """
        获取命名空间列表
        :return:
        """
        api = self.get_api()
        namespace_list = []
        for ns in api.list_namespace().items:
            # print(ns.metadata.name)
            namespace_list.append(ns.metadata.name)

        return namespace_list

    def get_pod_list(self):
       api = self.get_api()
       print("Listing pods with their IPs:")
       ret = api.list_pod_for_all_namespaces(watch=False)
       for i in ret.items:
           print("%s\t%s\t%s" % (i.status.pod_ip, i.metadata.namespace, i.metadata.name))

    def get_service_list(self):
        api = self.get_api()
        ret = api.list_service_for_all_namespaces(watch=False)
        for i in ret.items:
            print("%s \t%s \t%s \t%s \t%s \n" %(i.kind,i.metadata.namespace,i.metadata.name,i.spec.cluster_ip,i.spec.ports))

if __name__ == '__main__':
    namespace_list = KubernetesTools().get_namespace_list()
    pod_list = KubernetesTools().get_pod_list()
    service = KubernetesTools().get_service_list()
    print(namespace_list)
    print(pod_list)
    print(service)

到此这篇关于Python使用Kubernetes API访问集群的文章就介绍到这了,更多相关Python Kubernetes API访问集群内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
压缩包密码破解示例分享(类似典破解)
Jan 17 Python
python之yield表达式学习
Sep 02 Python
Python网络编程 Python套接字编程
Sep 13 Python
Python3模拟登录操作实例分析
Mar 12 Python
Python环境Pillow( PIL )图像处理工具使用解析
Sep 12 Python
python2.7使用scapy发送syn实例
May 05 Python
k-means 聚类算法与Python实现代码
Jun 01 Python
keras model.fit 解决validation_spilt=num 的问题
Jun 19 Python
通过实例了解python__slots__使用方法
Sep 14 Python
解决python 执行shell命令无法获取返回值的问题
Dec 05 Python
python 实现百度网盘非会员上传超过500个文件的方法
Jan 07 Python
Python matplotlib安装以及实现简单曲线的绘制
Apr 26 Python
如何利用pygame实现打飞机小游戏
Python中requests做接口测试的方法
python关于集合的知识案例详解
May 30 #Python
教你漂亮打印Pandas DataFrames和Series
pytorch 实现多个Dataloader同时训练
python 如何做一个识别率百分百的OCR
基于PyTorch实现一个简单的CNN图像分类器
May 29 #Python
You might like
PHP将DateTime对象转化为友好时间显示的实现代码
2011/09/20 PHP
简单实现限定phpmyadmin访问ip的方法
2013/03/05 PHP
Smarty模板学习笔记之Smarty简介
2014/05/20 PHP
PHP学习笔记(一) 简单了解PHP
2014/08/04 PHP
php自动提交表单的方法(基于fsockopen与curl)
2016/05/09 PHP
PHP+MySQL实现消息队列的方法分析
2018/05/09 PHP
PHP自动载入类文件函数__autoload的使用方法
2019/03/25 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
ScrollDown的基本操作示例
2013/06/09 Javascript
JavaScript给input的value赋值引发的关于基本类型值和引用类型值问题
2015/12/07 Javascript
基于jQuery实现以手风琴方式展开和折叠导航菜单
2016/01/28 Javascript
Jquery判断form表单数据是否变化
2016/03/30 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
2016/04/29 Javascript
深入理解MVC中的时间js格式化
2016/05/19 Javascript
jquery实现网页定位导航
2016/08/23 Javascript
微信小程序 本地存储及登录页面处理实例详解
2017/01/11 Javascript
bootstrap table使用入门基本用法
2017/05/24 Javascript
weex slider实现滑动底部导航功能
2017/08/28 Javascript
jQuery实现下拉菜单动态添加数据点击滑出收起其他功能
2018/06/14 jQuery
Vue.js递归组件实现组织架构树和选人功能
2019/07/04 Javascript
微信小程序实现同时上传多张图片
2020/02/03 Javascript
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
vue实现井字棋游戏
2020/09/29 Javascript
python实现用户答题功能
2018/01/17 Python
基于python分析你的上网行为 看看你平时上网都在干嘛
2019/08/13 Python
python如何实现不用装饰器实现登陆器小程序
2019/12/14 Python
python装饰器代替set get方法实例
2019/12/19 Python
Sunglasses Shop瑞典:欧洲领先的太阳镜网上商店
2018/04/22 全球购物
酒店门卫岗位职责
2013/12/29 职场文书
冰淇淋店的创业计划书
2014/02/07 职场文书
片区教研活动总结
2014/07/02 职场文书
财务管理专业自荐书
2014/09/02 职场文书
个人股份合作协议书
2014/10/24 职场文书
MYSQL优化之数据表碎片整理详解
2022/04/03 MySQL
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技
在虚拟机中安装windows server 2008的图文教程
2022/06/28 Servers