1.31 k8s开发

This commit is contained in:
dengqichen 2025-12-15 14:54:22 +08:00
parent 7e9587c6e7
commit 828461d46b

View File

@ -0,0 +1,159 @@
package com.qqchen.deploy.backend.framework.utils;
import lombok.extern.slf4j.Slf4j;
/**
* K8s资源工具类
* 用于解析和格式化K8s资源CPU内存
*/
@Slf4j
public class K8sResourceUtils {
private K8sResourceUtils() {
// 工具类禁止实例化
}
/**
* 解析CPU资源字符串为毫核millicores
* 支持格式
* - "2" -> 2000m (2核)
* - "2000m" -> 2000m
* - "0.5" -> 500m
*
* @param cpuStr CPU资源字符串
* @return 毫核数
*/
public static long parseCpuToMillicores(String cpuStr) {
if (cpuStr == null || cpuStr.isEmpty()) {
return 0;
}
try {
if (cpuStr.endsWith("m")) {
// 已经是毫核格式"2000m"
return Long.parseLong(cpuStr.substring(0, cpuStr.length() - 1));
} else {
// 核数格式"2""0.5"转换为毫核
return (long) (Double.parseDouble(cpuStr) * 1000);
}
} catch (NumberFormatException e) {
log.warn("解析CPU资源失败: {}", cpuStr, e);
return 0;
}
}
/**
* 解析内存资源字符串为字节数
* 支持格式
* - "4Gi" -> 4 * 1024 * 1024 * 1024 bytes
* - "512Mi" -> 512 * 1024 * 1024 bytes
* - "1024Ki" -> 1024 * 1024 bytes
* - "4G" -> 4 * 1000 * 1000 * 1000 bytes
* - "512M" -> 512 * 1000 * 1000 bytes
* - "1024K" -> 1024 * 1000 bytes
* - "1000000" -> 1000000 bytes
*
* @param memoryStr 内存资源字符串
* @return 字节数
*/
public static long parseMemoryToBytes(String memoryStr) {
if (memoryStr == null || memoryStr.isEmpty()) {
return 0;
}
try {
// 二进制单位1024进制
if (memoryStr.endsWith("Gi")) {
return Long.parseLong(memoryStr.substring(0, memoryStr.length() - 2)) * 1024L * 1024L * 1024L;
} else if (memoryStr.endsWith("Mi")) {
return Long.parseLong(memoryStr.substring(0, memoryStr.length() - 2)) * 1024L * 1024L;
} else if (memoryStr.endsWith("Ki")) {
return Long.parseLong(memoryStr.substring(0, memoryStr.length() - 2)) * 1024L;
}
// 十进制单位1000进制
else if (memoryStr.endsWith("G")) {
return Long.parseLong(memoryStr.substring(0, memoryStr.length() - 1)) * 1000L * 1000L * 1000L;
} else if (memoryStr.endsWith("M")) {
return Long.parseLong(memoryStr.substring(0, memoryStr.length() - 1)) * 1000L * 1000L;
} else if (memoryStr.endsWith("K")) {
return Long.parseLong(memoryStr.substring(0, memoryStr.length() - 1)) * 1000L;
} else {
// 纯数字单位为字节
return Long.parseLong(memoryStr);
}
} catch (NumberFormatException e) {
log.warn("解析内存资源失败: {}", memoryStr, e);
return 0;
}
}
/**
* 格式化CPU资源为K8s格式字符串
* 优先使用整数核如果不能整除则使用毫核或保留小数
*
* @param millicores 毫核数
* @return K8s格式字符串"2""2.5""500m"
*/
public static String formatCpuResource(long millicores) {
if (millicores == 0) {
return "0";
}
if (millicores % 1000 == 0) {
// 整数核如2000m -> "2"
return String.valueOf(millicores / 1000);
} else if (millicores >= 1000) {
// 大于1核但不能整除使用小数表示如2500m -> "2.5"
double cores = millicores / 1000.0;
// 如果小数部分为0显示整数否则保留1位小数
if (cores == Math.floor(cores)) {
return String.valueOf((long) cores);
} else {
return String.format("%.1f", cores);
}
} else {
// 小于1核使用毫核格式"500m"
return millicores + "m";
}
}
/**
* 格式化内存资源为K8s格式字符串使用二进制单位
* 优先使用能整除的最大单位如果都不能整除则选择最接近的单位并保留1位小数
*
* @param bytes 字节数
* @return K8s格式字符串"4Gi""15.6Gi""512Mi"
*/
public static String formatMemoryResource(long bytes) {
if (bytes == 0) {
return "0";
}
long gi = 1024L * 1024L * 1024L;
long mi = 1024L * 1024L;
long ki = 1024L;
// 优先尝试整除转换
if (bytes >= gi && bytes % gi == 0) {
return (bytes / gi) + "Gi";
} else if (bytes >= mi && bytes % mi == 0) {
return (bytes / mi) + "Mi";
} else if (bytes >= ki && bytes % ki == 0) {
return (bytes / ki) + "Ki";
}
// 如果不能整除选择最接近的单位并保留1位小数
if (bytes >= gi) {
double value = bytes / (double) gi;
return String.format("%.1fGi", value);
} else if (bytes >= mi) {
double value = bytes / (double) mi;
return String.format("%.1fMi", value);
} else if (bytes >= ki) {
double value = bytes / (double) ki;
return String.format("%.1fKi", value);
} else {
return String.valueOf(bytes);
}
}
}