pcapi/wwwroot/api/v1/resource_enough.dspy
2025-07-16 14:46:24 +08:00

92 lines
3.3 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- 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