Browse Source

同步删除pod

root 2 years ago
parent
commit
fe7501e2f2

+ 0 - 2
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/consumer/ProjectConsumer.java

@@ -29,8 +29,6 @@ public class ProjectConsumer {
 
 
     @Value("${scheduler.minio-path.project-result}")
     @Value("${scheduler.minio-path.project-result}")
     String resultPathMinio;
     String resultPathMinio;
-
-
     @Value("${scheduler.host.hostname}")
     @Value("${scheduler.host.hostname}")
     String hostname;
     String hostname;
     @Value("${scheduler.host.username}")
     @Value("${scheduler.host.username}")

+ 2 - 18
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/manager/TaskManager.java

@@ -146,7 +146,7 @@ public class TaskManager {
                         projectUtil.deletePod(podName);
                         projectUtil.deletePod(podName);
                         projectUtil.addOneParallelismToNode(nodeName);
                         projectUtil.addOneParallelismToNode(nodeName);
                     } else {
                     } else {
-                        createNextPod(projectId, nodeName, podName);  // 删除上一个 pod,并启动下一个 pod
+                        projectUtil.createNextPod(projectId, nodeName, podName);  // 删除上一个 pod,并启动下一个 pod
                     }
                     }
                     return false;
                     return false;
                 }
                 }
@@ -157,23 +157,7 @@ public class TaskManager {
         }
         }
     }
     }
 
 
-    /**
-     * 更改一个名字继续启动
-     *
-     * @param projectId   项目 id
-     * @param nodeName    运行 pod 的节点名称
-     * @param lastPodName 即将删除的 pod 名称
-     */
-    @SneakyThrows
-    public void createNextPod(String projectId, String nodeName, String lastPodName) {
-        //1 删除上一个 pod 和 redis 键值对
-        projectUtil.deletePod(lastPodName);
-        String lastPodString = FileUtil.read(podYamlDirectory + lastPodName + ".yaml");
-        String nextPodName = projectUtil.getRandomPodName(projectId);
-        String nextPodString = lastPodString.replace(lastPodName, nextPodName); // pod 名称包括 projectId 和 随机字符串
-        log.info("TaskManager--createNextPod 创建项目 " + projectId + " 的下一个 pod。");
-        projectUtil.createPod(nodeName, nextPodName, nextPodString);
-    }
+
 
 
     public void prepareScore(String projectRunningKey) {
     public void prepareScore(String projectRunningKey) {
         stringRedisTemplate.delete(projectRunningKey);
         stringRedisTemplate.delete(projectRunningKey);

+ 43 - 5
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/util/KubernetesUtil.java

@@ -40,13 +40,14 @@ public class KubernetesUtil {
 
 
     /**
     /**
      * 执行 yaml
      * 执行 yaml
+     *
      * @param hostname 主机名
      * @param hostname 主机名
      * @param username 用户名
      * @param username 用户名
      * @param password 密码
      * @param password 密码
      * @param yamlPath yaml 文件路径
      * @param yamlPath yaml 文件路径
      */
      */
     @SneakyThrows
     @SneakyThrows
-    public static void applyYaml(String hostname, String username, String password, String yamlPath){
+    public static void applyYaml(String hostname, String username, String password, String yamlPath) {
         SshClient client = SshUtil.getClient();
         SshClient client = SshUtil.getClient();
         ClientSession session = SshUtil.getSession(client, hostname, username, password);
         ClientSession session = SshUtil.getSession(client, hostname, username, password);
         SshUtil.execute(session, "kubectl apply -f " + yamlPath);
         SshUtil.execute(session, "kubectl apply -f " + yamlPath);
@@ -57,8 +58,8 @@ public class KubernetesUtil {
     /**
     /**
      * 创建 namespace 命名空间
      * 创建 namespace 命名空间
      *
      *
-     * @param apiClient     客户端
-     * @param nsName 命名空间名称
+     * @param apiClient 客户端
+     * @param nsName    命名空间名称
      * @return 命名空间对象
      * @return 命名空间对象
      */
      */
     @SneakyThrows
     @SneakyThrows
@@ -201,13 +202,50 @@ public class KubernetesUtil {
 
 
     /**
     /**
      * 删除 pod
      * 删除 pod
+     * 异步删除会等待 pod 完全删除完毕,即资源释放完全
+     *
+     * @param apiClient     api 客户端
+     * @param namespaceName namespace 名称
+     * @param podName       pod 名称
+     */
+    @SneakyThrows
+    public static void deletePod(ApiClient apiClient, String namespaceName, String podName) {
+        deletePodSync(apiClient, namespaceName, podName);
+    }
+
+    /**
+     * 删除 pod
+     * 异步删除会等待 pod 完全删除完毕,即资源释放完全
      *
      *
      * @param apiClient     api 客户端
      * @param apiClient     api 客户端
      * @param namespaceName namespace 名称
      * @param namespaceName namespace 名称
      * @param podName       pod 名称
      * @param podName       pod 名称
-     * @throws ApiException 异常
      */
      */
-    public static void deletePod(ApiClient apiClient, String namespaceName, String podName) throws ApiException {
+    @SneakyThrows
+    public static void deletePodSync(ApiClient apiClient, String namespaceName, String podName) {
+        log.info("KubernetesUtil--deletePod 删除 " + namespaceName + ":" + podName);
+        CoreV1Api coreV1Api = new CoreV1Api(apiClient);
+        coreV1Api.deleteNamespacedPod(podName, namespaceName, null, null, null, null, null, null);
+        // 检查是否删除完毕
+        while (true) {
+            Thread.sleep(5000L);
+            List<String> podNameList = getPod(apiClient, namespaceName);
+            if (!podNameList.contains(podName)) {
+                return;
+            }
+        }
+    }
+
+    /**
+     * 删除 pod
+     * 异步删除不会等待 pod 完全删除完毕,即资源还没有释放
+     *
+     * @param apiClient     api 客户端
+     * @param namespaceName namespace 名称
+     * @param podName       pod 名称
+     */
+    @SneakyThrows
+    public static void deletePodAsync(ApiClient apiClient, String namespaceName, String podName) {
         log.info("KubernetesUtil--deletePod 删除 " + namespaceName + ":" + podName);
         log.info("KubernetesUtil--deletePod 删除 " + namespaceName + ":" + podName);
         CoreV1Api coreV1Api = new CoreV1Api(apiClient);
         CoreV1Api coreV1Api = new CoreV1Api(apiClient);
         coreV1Api.deleteNamespacedPod(podName, namespaceName, null, null, null, null, null, null);
         coreV1Api.deleteNamespacedPod(podName, namespaceName, null, null, null, null, null, null);

+ 18 - 0
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/util/ProjectUtil.java

@@ -127,6 +127,24 @@ public class ProjectUtil {
 //        KubernetesUtil.createPod(apiClient, kubernetesNamespace, v1Pod);
 //        KubernetesUtil.createPod(apiClient, kubernetesNamespace, v1Pod);
     }
     }
 
 
+    /**
+     * 更改一个名字继续启动
+     *
+     * @param projectId   项目 id
+     * @param nodeName    运行 pod 的节点名称
+     * @param lastPodName 即将删除的 pod 名称
+     */
+    @SneakyThrows
+    public void createNextPod(String projectId, String nodeName, String lastPodName) {
+        //1 删除上一个 pod 和 redis 键值对
+        deletePod(lastPodName);
+        String lastPodString = FileUtil.read(podYamlDirectory + lastPodName + ".yaml");
+        String nextPodName = getRandomPodName(projectId);
+        String nextPodString = lastPodString.replace(lastPodName, nextPodName); // pod 名称包括 projectId 和 随机字符串
+        log.info("TaskManager--createNextPod 创建项目 " + projectId + " 的下一个 pod。");
+        createPod(nodeName, nextPodName, nextPodString);
+    }
+
 
 
     public String getProjectTypeByProjectId(String projectId) {
     public String getProjectTypeByProjectId(String projectId) {
         String projectType = null;
         String projectType = null;

+ 5 - 0
simulation-resource-scheduler/src/main/resources/kubernetes/template/pod/pod-template.yaml

@@ -7,6 +7,11 @@ metadata:
     user: CICV
     user: CICV
 spec:
 spec:
   nodeName: node-name
   nodeName: node-name
+  dnsPolicy: None
+  dnsConfig:
+    nameservers:
+      - 223.6.6.6
+      - 8.8.8.8
   hostAliases:
   hostAliases:
     - ip: 172.17.0.184
     - ip: 172.17.0.184
       hostnames:
       hostnames: