python管理k8s集群
1、python怎么管理k8s
k8s最核心的组件就是api-server,大部分的组件都是监听这个端口的,因此只有有着api就能进行使用python来管理k8s了
2、操作
1、参数详细的介绍
#导入这些库
from kubernetes import client,config
from kubernetes.stream import stream
Api_Instance = client.CoreV1Api() #是一个python客户端中的一个类,提供对核心资源pods,service,configmaps,secrets等的访问,是k8s中集群管理和操作的基础
Api_Batch = client.BatchV1Api()
CoreV1Api
pods的相关操作
list_namespaced_pod(namespace)列出特定命名空间中的所有 Pod。
read_namespaced_pod(name, namespace) 获取特定命名空间中某个 Pod 的详细信息
create_namespaced_pod(namespace, body): 在特定命名空间中创建一个新的 Pod
delete_namespaced_pod(name, namespace): 删除特定命名空间中的某个 Pod
service相关的操作
list_namespaced_service(namespace): 列出特定命名空间中的所有 Service
read_namespaced_service(name, namespace): 获取特定命名空间中某个 Service 的详细信息
create_namespaced_service(namespace, body): 在特定命名空间中创建一个新的 Service
delete_namespaced_service(name, namespace): 删除特定命名空间中的某个 Service
ice。
delete_namespaced_service(name, namespace): 删除特定命名空间中的某个 Service。
ConfigMaps(ConfigMap 相关操作)
list_namespaced_config_map(namespace): 列出特定命名空间中的所有 ConfigMap。
read_namespaced_config_map(name, namespace): 获取特定命名空间中某个 ConfigMap 的详细信息。
create_namespaced_config_map(namespace, body): 在特定命名空间中创建一个新的 ConfigMap。
delete_namespaced_config_map(name, namespace): 删除特定命名空间中的某个 ConfigMap。
Secrets(Secret 相关操作)
list_namespaced_secret(namespace): 列出特定命名空间中的所有 Secret。
read_namespaced_secret(name, namespace): 获取特定命名空间中某个 Secret 的详细信息。
create_namespaced_secret(namespace, body): 在特定命名空间中创建一个新的 Secret。
delete_namespaced_secret(name, namespace): 删除特定命名空间中的某个 Secret。
BatchV1Api
提供批处理api资源(jobs和cronjobs)的访问,批处理api资源,通常用于管理批处理任务和定时的任务
主要方法
Jobs(Job 相关操作)
list_namespaced_job(namespace): 列出特定命名空间中的所有 Job。
read_namespaced_job(name, namespace): 获取特定命名空间中某个 Job 的详细信息。
create_namespaced_job(namespace, body): 在特定命名空间中创建一个新的 Job。
delete_namespaced_job(name, namespace): 删除特定命名空间中的某个 Job。
CronJobs(CronJob 相关操作)
list_namespaced_cron_job(namespace): 列出特定命名空间中的所有 CronJob。
read_namespaced_cron_job(name, namespace): 获取特定命名空间中某个 CronJob 的详细信息。
create_namespaced_cron_job(namespace, body): 在特定命名空间中创建一个新的 CronJob。
delete_namespaced_cron_job(name, namespace): 删除特定命名空间中的某个 CronJob
2、k8s节点
#获取所有的node节点
def list_node():
node_name=api_Instance.list_node()
data={}
for i in node_name.items: #获取的就是这个items的对应的列表
# print(i) 获取这个对象
data[i.metadata.name] = {
"name": i.metadata.name,
"status": i.status.conditions[-1].type if i.status.conditions[-1].status == "True" else "NotReady", #这个是三元运算符,第一个结果成立了,就为true,否则为NotReady
"ip": i.status.addresses[0].address,
"kubelet_version": i.status.node_info.os_image,
}
return data
allnode=list_node()
print(allnode)
#输出结果
{'master': {'name': 'master', 'status': 'Ready', 'ip': '192.168.109.100', 'kubelet_version': 'CentOS Linux 7 (Core)'}, 'node1': {'name': 'node1', 'status': 'Ready', 'ip': '192.168.109.101', 'kubelet_version': 'CentOS Linux 7 (Core)'}, 'node2': {'name': 'node2', 'status': 'Ready', 'ip': '192.168.109.102', 'kubelet_version': 'CentOS Linux 7 (Core)'}}
这样的话就能得到所有的node节点了
3、关于namespace的详细操作
#列出所有的名称空间
from kubernetes import client,config
config.kube_config.load_kube_config("D:/config") #获取相关的认证信息,
api_Instance = client.CoreV1Api()
for ns in api_Instance.list_namespace().items:
print(ns.metadata.name) #返回是是一个对象,然后items对应的是一个列表,然后打印里面metadata.name对应的值即可
#打印单个名称空间
nameapce_name="dev" #查看名称空间
namespace=api_Instance.read_namespace(name=nameapce_name) #查看单个名称空间
print(namespace.metadata.name) #打印名称空间的名字
for i in namespace.metadata.labels.keys(): #打印名称空间的标签
print(i)
print(namespace.metadata.uid) #打印名称空间的uid
#删除名称空间
del_namespace="dev"
api_Instance.delete_namespace(name=del_namespace)
print(f"{del_namespace} is delete")
#创建名称空间
nameapce=client.V1Namespace( #创建一个namespace对象
metadata=client.V1ObjectMeta( #用于标识k8s资源对象元数据类型,就是里面的属性
name= "dev",
labels={"app": "example-app"}
)
)
api_Instance.create_namespace(body=nameapce) #这个body字段接收的就是一些关于namespace一些属性,标签,注解等
4、pod的详细操作
1、展示pod
#使用的方法是list_pod_for_all_namespaces()
def list_pod():
data={}
for i in api_Instance.list_pod_for_all_namespaces().items:
data[i.metadata.name]={
"ip": i.status.pod_ip,
"namespace": i.metadata.namespace
}
return data
pod=list_pod()
print(pod)
#展示单个pod
pod_name="nginx-deployment-5cb65f68db-jnbft"
pod1_name=api_Instance.read_namespaced_pod(name=pod_name,namespace="dev")
print(f"{pod1_name.metadata.name}\n"
f"ip为{pod1_name.status.pod_ip}")
#展示名称空间下面的所有的pod
#列出名称空间下面所有的pod
pod_name=api_Instance.list_namespaced_pod(namespace="default")
print(pod_name)
2、删除Pod
for i in api_Instance.list_namespaced_pod(namespace="default").items:
pod_name=i.metadata.name
api_Instance.delete_namespaced_pod(name=pod_name,namespace="default")
print(f"{pod_name}删除成功")
3、创建pod
#yaml文件
apiVersion: v1
kind: Pod
metadata:
name: d3
namespace: default
spec:
containers:
- name: nginx
image: nginx:1.17.2
imagePullPolicy: IfNotPresent
import yaml
def pod_create(file,namespace="default"):
with open(file) as f:
dev =yaml.safe_load(f) #安全加载yaml格式数据
pod1=api_Instance.create_namespaced_pod(namespace,body=dev)
return pod1
pod=pod_create("pod.yaml")
print("res",pod)
4、修改pod内容
5、deployment的详细操作
1、查看控制器
qq=client.AppsV1Api() #查看deplyment,StatefulSet、DaemonSet控制器等资源
#查看命名空间下的deployment
deploy_name=qq.list_namespaced_deployment(namespace="default")
print(deploy_name)
#查看所有的deployment
dep=qq.list_deployment_for_all_namespaces().items
for i in dep:
print(i.metadata.name)
#查看单独的控制器
d1=qq.read_namespaced_deployment(namespace="default",name="nginx-deploy")
print(d1)
2、删除deployment
d4=qq.list_namespaced_deployment(namespace="default").items
for i in d4:
dea=i.metadata.name
d3=qq.delete_namespaced_deployment(namespace="default",name=dea)
print(f"{dea} is delete")
3、创建deployment
def creat_deployment(file,namespace="default"):
with open(file) as f:
dc1=yaml.safe_load(f) #yaml文件
ds=qq.create_namespaced_deployment(namespace,body=dc1)
return ds #返回这个rs
rs=creat_deployment("deployment.yaml")
print(f"{rs}")
4、修改deployment
6、service的详细操作
1、查看service
#查看所有的名称空间下的service
q1=api_instance.list_service_for_all_namespaces().items
for i in q1:
print(i.metadata.name)
#查看名称空间下的所有svc
q2=api_instance.list_namespaced_service(namespace="default").items
for i in q2:
print(i.metadata.name)
#查看单个svc
q2=api_instance.read_namespaced_service(namespace="default",name="nginx-svc")
print(q2)
2、删除service
d1=api_instance.delete_namespaced_service(namespace="default",name="nginx-svc")
print(f"删除成功")
3、创建service
def creat_service(file,namespace="default"):
with open(file) as f:
svc=yaml.safe_load(f)
s1=api_instance.create_namespaced_service(namespace,body=svc)
return s1
rs=creat_service("service.yaml")
print(f"{rs}")
4、修改service
7、job详细的操作
1、查看job
ww=client.BatchV1Api()
#查看所有的job
j1=ww.list_job_for_all_namespaces().items
for i in j1:
print(i.metadata.name)
#查看名称空间下面的所有job
j2=ww.list_namespaced_job(namespace="default")
for i in j2.items:
print(i.metadata.name)
#单独查看job
j3 = ww.read_namespaced_job(namespace="default",name="job-controller")
print(j3)
2、删除job
j3=ww.delete_namespaced_job(namespace="default",name="job-controller")
print("删除成功")
#删除job下面的pod
w1=api_instance.list_namespaced_pod(namespace="default")
# print(w1)
for i in w1.items: #根据标签来进行定义
if i.metadata.labels["app"] == "counter-pod":
pod_name=i.metadata.name #pod的名字
api_instance.delete_namespaced_pod(namespace="default",name=pod_name)
print(f"{pod_name} is delete")
3、创建job
def create_job(file,namespace="default"):
with open(file) as f:
dev=yaml.safe_load(f) #读取这个文件
j1=ww.create_namespaced_job(namespace,body=dev) #创建文件
return j1
rs=create_job("job.yaml")
print(f"{rs}")
4、修改job
3、总结
1、python管理k8s
python提供了很多的api接口来让我们调用k8s
core_api = client.CoreV1Api() # 管理核心资源(Pod, Service, ConfigMap 等)
apps_api = client.AppsV1Api() # 管理应用资源(Deployment, StatefulSet, DaemonSet 等)
batch_api = client.BatchV1Api() # 管理批处理任务资源(Job, CronJob)
rbac_api = client.RbacAuthorizationV1Api() # 管理角色和权限绑定资源
networking_api = client.NetworkingV1Api() # 管理网络资源(Ingress, NetworkPolicy)
custom_objects_api = client.CustomObjectsApi() # 管理自定义资源(CRD)
2、各种方法大同小异
1、列出的资源
#列出所有的资源
api.list_资源类型_for_all_namespace()
#展示名称空间下面的所有的资源
api.list_namespaced_资源类型(namespace=)
#展示单个资源
api.read_namespace_资源(namespace=,name=)
2、删除资源
api.delete_namespaced_资源(namespace=,name=)
3、创建资源
api.create_namespaced_资源(namespace=,body=)
4、修改资源