92 lines
3.3 KiB
Plaintext
92 lines
3.3 KiB
Plaintext
# -*- coding: utf-8 -*-
|
||
# @Time: 2024/12/5 17:07
|
||
|
||
import kubernetes.client
|
||
from kubernetes.client.rest import ApiException
|
||
from kubernetes import config
|
||
|
||
# 加载 Kubernetes 配置(如果在集群内运行则可以忽略)
|
||
config.load_kube_config()
|
||
|
||
|
||
def check_resource_availability(cpu_request, memory_request, storage_request, gpu_request):
|
||
"""
|
||
检查集群是否有足够资源来创建 Pod。
|
||
:param cpu_request: 请求的 CPU 核数
|
||
:param memory_request: 请求的内存(单位为MiB)
|
||
:param storage_request: 请求的存储(单位为GiB)
|
||
:param gpu_request: 请求的 GPU 数量
|
||
:return: 是否有足够资源
|
||
"""
|
||
v1 = kubernetes.client.CoreV1Api()
|
||
|
||
# 获取所有节点的信息
|
||
nodes = v1.list_node()
|
||
|
||
for node in nodes.items:
|
||
cpu_capacity = node.status.capacity['cpu']
|
||
memory_capacity = node.status.capacity['memory']
|
||
storage_capacity = node.status.capacity.get('ephemeral-storage', '0Gi') # 有些节点存储没有显示
|
||
gpu_capacity = 0 # 默认无 GPU
|
||
if 'nvidia.com/gpu' in node.status.capacity:
|
||
gpu_capacity = node.status.capacity['nvidia.com/gpu']
|
||
|
||
# 将单位转换成整数进行比较
|
||
cpu_capacity = int(cpu_capacity)
|
||
memory_capacity = int(memory_capacity[:-2]) # 去掉最后的Mi
|
||
storage_capacity = int(storage_capacity[:-2]) # 去掉最后的Gi
|
||
gpu_capacity = int(gpu_capacity)
|
||
|
||
# 判断该节点是否满足资源请求
|
||
if (cpu_capacity >= cpu_request and
|
||
memory_capacity >= memory_request and
|
||
storage_capacity >= storage_request and
|
||
gpu_capacity >= gpu_request):
|
||
print(f"Node {node.metadata.name} has enough resources.")
|
||
return True
|
||
return False
|
||
|
||
|
||
def create_pod(cpu_request, memory_request, storage_request, gpu_request):
|
||
"""创建 Pod,先检查资源是否足够"""
|
||
if not check_resource_availability(cpu_request, memory_request, storage_request, gpu_request):
|
||
print("No node has enough resources to fulfill the request.")
|
||
return
|
||
|
||
# 如果资源足够,则创建 Pod
|
||
v1 = kubernetes.client.CoreV1Api()
|
||
pod_manifest = {
|
||
"apiVersion": "v1",
|
||
"kind": "Pod",
|
||
"metadata": {"name": "my-pod"},
|
||
"spec": {
|
||
"containers": [{
|
||
"name": "my-container",
|
||
"image": "nginx", # 可替换为需要的镜像
|
||
"resources": {
|
||
"requests": {
|
||
"cpu": f"{cpu_request}m", # 单位是millicpu
|
||
"memory": f"{memory_request}Mi", # 单位是Mi
|
||
"ephemeral-storage": f"{storage_request}Gi", # 单位是Gi
|
||
},
|
||
"limits": {
|
||
"cpu": f"{cpu_request}m",
|
||
"memory": f"{memory_request}Mi",
|
||
"ephemeral-storage": f"{storage_request}Gi",
|
||
}
|
||
}
|
||
}]
|
||
}
|
||
}
|
||
|
||
try:
|
||
# 创建 Pod
|
||
v1.create_namespaced_pod(namespace="default", body=pod_manifest)
|
||
print("Pod created successfully.")
|
||
except ApiException as e:
|
||
print(f"Error creating pod: {e}")
|
||
|
||
|
||
# 示例使用:请求 1 CPU、2G 内存、30G 存储、0 GPU
|
||
create_pod(1000, 2048, 30, 0) # 1000m CPU, 2048Mi 内存, 30Gi 存储, 0 GPU
|