最近有个需求是获取kubernetes中间的域名ingress列表
使用的python版本是3.10
C:\Users\kaikai>python
Python 3.10.0 (tags/v3.10.0:b494f59, Oct 4 2021, 19:00:18) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
使用的kubernetes版本:1.22.10-aliyun.1
在网上搜索的教程都是使用下面的方式获取ingress内容
# 获取ingress内容
# 参数说明:
# config_path:k8s集群token文件路径
# namespace:k8s namespace
# name:ingress名称
def get_ingress_content(config_path, namespace, name):
# load k8s集群token信息
config.load_kube_config(config_path)
v1 = client.ExtensionsV1beta1Api() # 注意,ingress的api不一样
# 读取ingress
ret = v1.read_namespaced_ingress(namespace=namespace, name=name)
报错
module 'kubernetes.client' has no attribute 'ExtensionsV1beta1Api'
但是在我使用的kubernetes:23.6.0的版本下面没有ExtensionsV1beta1Api这个函数,然后通过查看
官网的示例https://github.com/kubernetes-client/python/tree/master/kubernetes
新的写法是
from kubernetes import client, config
def get_namespace():
apps_api = client.CoreV1Api()
namespace_list=[]
for namespace in apps_api.list_namespace().items:
if namespace.metadata.name not in ["arms-prom","kube-node-lease","kube-public","kube-system"]:
# print(namespace.metadata.name)
namespace_list.append(namespace.metadata.name)
return namespace_list
def list_ingress(namespace_list):
v1=client.NetworkingV1Api()
# 获取ingress列表
ingress_list = []
for namespace in namespace_list:
ret = v1.list_namespaced_ingress(namespace=namespace)
print(ret)
# ret._items[0]._spec['rules']
for item in ret._items:
# print(type(item.metadata))
for rule in item._spec.rules:
ingress_list.append(rule.host)
return ingress_list
if __name__ == '__main__':
config.load_kube_config(r'/root/.kube/config') # 加载config文件,用于访问k8s
namespace_list=get_namespace()
#获取所有Ingress域名
ingress_list=list_ingress(namespace_list)
上面只是我针对这个问题的解决方案,原则上不仅仅只是可以获取域名,所有的ingress的信息都可以获取,如果有更方便的解决方式可以与我联系,一起讨论一下,与君共勉!