From cfeca85f6d51981d237f96733ad1c2f8bc1e3b81 Mon Sep 17 00:00:00 2001 From: chenzhihang <709011834@qq.com> Date: Wed, 28 Aug 2024 14:27:19 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E8=AE=BE=E7=BD=AE=E5=90=AF=E5=8A=A8p?= =?UTF-8?q?od=E4=BA=B2=E5=92=8C=E6=80=A7=E5=8F=8D=E4=BA=B2=E5=92=8C?= =?UTF-8?q?=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/image/ImageController.java | 2 +- .../ruoyi/platform/utils/K8sClientUtil.java | 41 ++++++++++++++++++- .../java/com/ruoyi/platform/vo/ImageVo.java | 9 ++-- 3 files changed, 45 insertions(+), 7 deletions(-) diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/image/ImageController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/image/ImageController.java index d389bad8..1af9c983 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/image/ImageController.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/image/ImageController.java @@ -151,7 +151,7 @@ public class ImageController extends BaseController { @PostMapping("/saveImage") @ApiOperation(value = "保存环境为镜像", notes = "docker commit方式保存,并推送到horbor") - public GenericsAjaxResult saveImage(ImageVo imageVo){ + public GenericsAjaxResult saveImage(@RequestBody ImageVo imageVo){ return genericsSuccess(this.imageService.saveImage(imageVo)); } } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/K8sClientUtil.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/K8sClientUtil.java index 519a5038..06e40622 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/K8sClientUtil.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/K8sClientUtil.java @@ -377,12 +377,48 @@ public class K8sClientUtil { // 创建配置好的Pod public Integer createConfiguredPod(String podName, String namespace, Integer port, String mountPath, V1PersistentVolumeClaim pvc, String image, String dataPvcName, String datasetPath, String modelPath) { - Map selector = new LinkedHashMap<>(); - selector.put("k8s-jupyter", podName); + //设置选择节点,pod反亲和性 + Map selector = new LinkedHashMap<>(); + selector.put("k8s-jupyter", "CPU-GPU"); Map nodeSelector = new LinkedHashMap<>(); nodeSelector.put("resource-type", "CPU-GPU"); + V1LabelSelectorRequirement labelSelectorRequirement = new V1LabelSelectorRequirement() + .key("k8s-jupyter").operator("NotIn").values(Collections.singletonList("CPU-GPU")); + + V1LabelSelector labelSelector = new V1LabelSelector() + .matchExpressions(Collections.singletonList(labelSelectorRequirement)); + + V1PodAffinityTerm podAffinityTerm = new V1PodAffinityTerm() + .labelSelector(labelSelector) + .namespaces(Collections.singletonList(namespace)) + .topologyKey("kubernetes.io/hostname"); + + V1PodAffinity podAffinity = new V1PodAffinity() + .requiredDuringSchedulingIgnoredDuringExecution(Collections.singletonList(podAffinityTerm)); + + V1LabelSelectorRequirement antiLabelSelectorRequirement = new V1LabelSelectorRequirement() + .key("k8s-jupyter").operator("In").values(Collections.singletonList("CPU-GPU")); + + V1LabelSelector antiLabelSelector = new V1LabelSelector() + .matchExpressions(Collections.singletonList(antiLabelSelectorRequirement)); + + V1PodAffinityTerm antiPodAffinityTerm = new V1PodAffinityTerm() + .labelSelector(antiLabelSelector) + .namespaces(Collections.singletonList(namespace)) + .topologyKey("kubernetes.io/hostname"); + +// V1WeightedPodAffinityTerm weightedPodAffinityTerm = new V1WeightedPodAffinityTerm().weight(100).podAffinityTerm(podAffinityTerm); + + V1PodAntiAffinity podAntiAffinity = new V1PodAntiAffinity() + .requiredDuringSchedulingIgnoredDuringExecution(Collections.singletonList(antiPodAffinityTerm)); + + V1Affinity v1Affinity = new V1Affinity() + .podAffinity(podAffinity) + .podAntiAffinity(podAntiAffinity); + + // 创建Pod CoreV1Api api = new CoreV1Api(apiClient); V1PodList v1PodList = null; try { @@ -427,6 +463,7 @@ public class K8sClientUtil { .endContainer() .withVolumes(volumes) .withNodeSelector(nodeSelector) + .withAffinity(v1Affinity) .endSpec() .build(); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/vo/ImageVo.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/vo/ImageVo.java index 4dabab23..8345f214 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/vo/ImageVo.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/vo/ImageVo.java @@ -24,7 +24,7 @@ public class ImageVo implements Serializable { * 镜像类型 */ - @ApiModelProperty(name = "imageType") + @ApiModelProperty(name = "image_type") private Integer imageType; @@ -43,7 +43,7 @@ public class ImageVo implements Serializable { /** * 镜像tag名称 */ - @ApiModelProperty(name = "tagName") + @ApiModelProperty(name = "tag_name") private String tagName; /** @@ -57,15 +57,16 @@ public class ImageVo implements Serializable { @ApiModelProperty(name = "status") private String status; - @ApiModelProperty(value = "上传方式, 基于公网上传0,基于本地上传1") + @ApiModelProperty(name = "upload_type", value = "上传方式, 基于公网上传0,基于本地上传1") private Integer uploadType; @ApiModelProperty(value = "镜像上传路径") private String path; - @ApiModelProperty(value = "环境id") + @ApiModelProperty(name = "dev_environment_id", value = "环境id") private Integer devEnvironmentId; + // public Integer getId() { // return id; // }