python管理k8s叢集

q_7發表於2024-05-25

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、修改資源



相關文章