This is an automated email from the ASF dual-hosted git repository.

caishunfeng pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git


The following commit(s) were added to refs/heads/dev by this push:
     new 1e48bbc5c6 [Feature-10629][Improvement] Support multi cluster 
environments - namespace use cluster (#10650)
1e48bbc5c6 is described below

commit 1e48bbc5c6606c9f6fd1fe748d6d3fd839670ef6
Author: qianli2022 <[email protected]>
AuthorDate: Thu Jul 7 16:05:52 2022 +0800

    [Feature-10629][Improvement] Support multi cluster environments - namespace 
use cluster (#10650)
    
    * server code
    
    * namespace ui
    
    * fix dao test
    
    * fix test
    
    * fix
    
    * docs and image update
    
    Co-authored-by: qianl4 <[email protected]>
---
 docs/docs/en/guide/security.md                     |   2 +-
 docs/docs/zh/guide/security.md                     |   2 +-
 docs/img/new_ui/dev/security/create-namespace.png  | Bin 716511 -> 771019 bytes
 .../api/controller/K8sNamespaceController.java     |  64 +++---
 .../apache/dolphinscheduler/api/enums/Status.java  |   1 +
 .../dolphinscheduler/api/k8s/K8sClientService.java |  29 +--
 .../dolphinscheduler/api/k8s/K8sManager.java       |  90 ++++++---
 .../api/service/K8sNamespaceService.java           |  15 +-
 .../api/service/impl/ClusterServiceImpl.java       |  29 +++
 .../api/service/impl/K8SNamespaceServiceImpl.java  | 102 ++++++----
 .../api/controller/ClusterControllerTest.java      |   2 +-
 .../api/controller/K8sNamespaceControllerTest.java |  14 +-
 .../dolphinscheduler/api/k8s/K8sManagerTest.java   |  34 ++--
 .../api/service/ClusterServiceTest.java            |   5 +
 .../api/service/K8SNamespaceServiceTest.java       |  55 +++---
 .../apache/dolphinscheduler/common/Constants.java  |   4 +-
 .../dolphinscheduler/dao/entity/K8sNamespace.java  |  49 +++--
 .../dao/mapper/K8sNamespaceMapper.java             |  16 +-
 .../dao/mapper/K8sNamespaceMapper.xml              |  28 ++-
 .../src/main/resources/sql/dolphinscheduler_h2.sql |  21 +-
 .../main/resources/sql/dolphinscheduler_mysql.sql  |   6 +-
 .../resources/sql/dolphinscheduler_postgresql.sql  |   7 +-
 .../3.0.0_schema/mysql/dolphinscheduler_ddl.sql    |   6 +-
 .../postgresql/dolphinscheduler_ddl.sql            |   6 +-
 .../dao/mapper/K8sNamespaceMapperTest.java         |   6 +-
 dolphinscheduler-ui/src/locales/en_US/security.ts  |   2 -
 dolphinscheduler-ui/src/locales/zh_CN/security.ts  |   2 -
 .../src/service/modules/k8s-namespace/types.ts     |   4 +-
 .../components/k8s-namespace-modal.tsx             | 215 ++++++++++-----------
 .../k8s-namespace-manage/components/use-modal.ts   |  56 ++++--
 .../security/k8s-namespace-manage/use-table.ts     | 147 +++++++-------
 31 files changed, 590 insertions(+), 429 deletions(-)

diff --git a/docs/docs/en/guide/security.md b/docs/docs/en/guide/security.md
index d4449c49a1..92302183c4 100644
--- a/docs/docs/en/guide/security.md
+++ b/docs/docs/en/guide/security.md
@@ -162,7 +162,7 @@ worker.groups=default,test
 
 > Add or update k8s cluster
 
-- First enter the configuration of the k8s cluster connection into the table 
`t_ds_k8s` in the database, which will be configured later by the web page.
+- First enter the configuration of the k8s cluster connection into the table 
`t_ds_k8s` in the database for batch job and will removed later, the creation 
of the namespace now selects the cluster by drop-down options.
 
 > Add or update namespace
 
diff --git a/docs/docs/zh/guide/security.md b/docs/docs/zh/guide/security.md
index ee8973773f..80417b39dc 100644
--- a/docs/docs/zh/guide/security.md
+++ b/docs/docs/zh/guide/security.md
@@ -165,7 +165,7 @@ worker.groups=default,test
 
 > 创建/更新 k8s集群
 
-- 先把k8s集群连接的配置录入 database 的表 `t_ds_k8s`,后续会通过页面配置.
+- 先把k8s集群连接的配置录入 database 的表 `t_ds_k8s`给批次使用后续移除,namespace的创建现在通过下拉选择集群.
 
 > 创建/更新 namespace
 
diff --git a/docs/img/new_ui/dev/security/create-namespace.png 
b/docs/img/new_ui/dev/security/create-namespace.png
index aac7cdf79a..c7a7632629 100644
Binary files a/docs/img/new_ui/dev/security/create-namespace.png and 
b/docs/img/new_ui/dev/security/create-namespace.png differ
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/K8sNamespaceController.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/K8sNamespaceController.java
index ac2e29534d..7f331774bc 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/K8sNamespaceController.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/K8sNamespaceController.java
@@ -20,7 +20,7 @@ package org.apache.dolphinscheduler.api.controller;
 import static 
org.apache.dolphinscheduler.api.enums.Status.CREATE_K8S_NAMESPACE_ERROR;
 import static 
org.apache.dolphinscheduler.api.enums.Status.DELETE_K8S_NAMESPACE_BY_ID_ERROR;
 import static 
org.apache.dolphinscheduler.api.enums.Status.QUERY_AUTHORIZED_NAMESPACE_ERROR;
-import static 
org.apache.dolphinscheduler.api.enums.Status.QUERY_CAN_USE_K8S_CLUSTER_ERROR;
+import static 
org.apache.dolphinscheduler.api.enums.Status.QUERY_CAN_USE_K8S_NAMESPACE_ERROR;
 import static 
org.apache.dolphinscheduler.api.enums.Status.QUERY_K8S_NAMESPACE_LIST_PAGING_ERROR;
 import static 
org.apache.dolphinscheduler.api.enums.Status.QUERY_UNAUTHORIZED_NAMESPACE_ERROR;
 import static 
org.apache.dolphinscheduler.api.enums.Status.UPDATE_K8S_NAMESPACE_ERROR;
@@ -78,18 +78,18 @@ public class K8sNamespaceController extends BaseController {
      */
     @ApiOperation(value = "queryNamespaceListPaging", notes = 
"QUERY_NAMESPACE_LIST_PAGING_NOTES")
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "searchVal", value = "SEARCH_VAL", 
dataType = "String"),
-            @ApiImplicitParam(name = "pageSize", value = "PAGE_SIZE", required 
= true, dataType = "Int", example = "10"),
-            @ApiImplicitParam(name = "pageNo", value = "PAGE_NO", required = 
true, dataType = "Int", example = "1")
+        @ApiImplicitParam(name = "searchVal", value = "SEARCH_VAL", dataType = 
"String"),
+        @ApiImplicitParam(name = "pageSize", value = "PAGE_SIZE", required = 
true, dataType = "Int", example = "10"),
+        @ApiImplicitParam(name = "pageNo", value = "PAGE_NO", required = true, 
dataType = "Int", example = "1")
     })
     @GetMapping()
     @ResponseStatus(HttpStatus.OK)
     @ApiException(QUERY_K8S_NAMESPACE_LIST_PAGING_ERROR)
     @AccessLogAnnotation(ignoreRequestArgs = "loginUser")
-    public Result queryProjectListPaging(@ApiIgnore @RequestAttribute(value = 
Constants.SESSION_USER) User loginUser,
-                                         @RequestParam(value = "searchVal", 
required = false) String searchVal,
-                                         @RequestParam("pageSize") Integer 
pageSize,
-                                         @RequestParam("pageNo") Integer pageNo
+    public Result queryNamespaceListPaging(@ApiIgnore @RequestAttribute(value 
= Constants.SESSION_USER) User loginUser,
+                                           @RequestParam(value = "searchVal", 
required = false) String searchVal,
+                                           @RequestParam("pageSize") Integer 
pageSize,
+                                           @RequestParam("pageNo") Integer 
pageNo
     ) {
 
         Result result = checkPageParams(pageNo, pageSize);
@@ -107,17 +107,17 @@ public class K8sNamespaceController extends 
BaseController {
      *
      * @param loginUser
      * @param namespace    k8s namespace
-     * @param k8s          k8s name
+     * @param clusterCode  clusterCode
      * @param limitsCpu    max cpu
      * @param limitsMemory max memory
      * @return
      */
     @ApiOperation(value = "createK8sNamespace", notes = 
"CREATE_NAMESPACE_NOTES")
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "namespace", value = "NAMESPACE", 
required = true, dataType = "String"),
-            @ApiImplicitParam(name = "k8s", value = "K8S", required = true, 
dataType = "String"),
-            @ApiImplicitParam(name = "limits_cpu", value = "LIMITS_CPU", 
required = false, dataType = "Double"),
-            @ApiImplicitParam(name = "limits_memory", value = "LIMITS_MEMORY", 
required = false, dataType = "Integer")
+        @ApiImplicitParam(name = "namespace", value = "NAMESPACE", required = 
true, dataType = "String"),
+        @ApiImplicitParam(name = "clusterCode", value = "CLUSTER_CODE", 
required = true, dataType = "Long"),
+        @ApiImplicitParam(name = "limits_cpu", value = "LIMITS_CPU", required 
= false, dataType = "Double"),
+        @ApiImplicitParam(name = "limits_memory", value = "LIMITS_MEMORY", 
required = false, dataType = "Integer")
     })
     @PostMapping()
     @ResponseStatus(HttpStatus.CREATED)
@@ -125,11 +125,11 @@ public class K8sNamespaceController extends 
BaseController {
     @AccessLogAnnotation(ignoreRequestArgs = "loginUser")
     public Result createNamespace(@ApiIgnore @RequestAttribute(value = 
Constants.SESSION_USER) User loginUser,
                                   @RequestParam(value = "namespace") String 
namespace,
-                                  @RequestParam(value = "k8s") String k8s,
+                                  @RequestParam(value = "clusterCode") Long 
clusterCode,
                                   @RequestParam(value = "limitsCpu", required 
= false) Double limitsCpu,
                                   @RequestParam(value = "limitsMemory", 
required = false) Integer limitsMemory
     ) {
-        Map<String, Object> result =  
k8sNamespaceService.createK8sNamespace(loginUser, namespace, k8s, limitsCpu, 
limitsMemory);
+        Map<String, Object> result = 
k8sNamespaceService.createK8sNamespace(loginUser, namespace, clusterCode, 
limitsCpu, limitsMemory);
         return returnDataList(result);
     }
 
@@ -137,17 +137,17 @@ public class K8sNamespaceController extends 
BaseController {
      * update namespace,namespace and k8s not allowed update, because may 
create on k8s,can delete and create new instead
      *
      * @param loginUser
-     * @param userName        owner
+     * @param userName     owner
      * @param limitsCpu    max cpu
      * @param limitsMemory max memory
      * @return
      */
     @ApiOperation(value = "updateK8sNamespace", notes = 
"UPDATE_NAMESPACE_NOTES")
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "id", value = "K8S_NAMESPACE_ID", 
required = true, dataType = "Int", example = "100"),
-            @ApiImplicitParam(name = "userName", value = "OWNER", required = 
false, dataType = "String"),
-            @ApiImplicitParam(name = "limitsCpu", value = "LIMITS_CPU", 
required = false, dataType = "Double"),
-            @ApiImplicitParam(name = "limitsMemory", value = "LIMITS_MEMORY", 
required = false, dataType = "Integer")})
+        @ApiImplicitParam(name = "id", value = "K8S_NAMESPACE_ID", required = 
true, dataType = "Int", example = "100"),
+        @ApiImplicitParam(name = "userName", value = "OWNER", required = 
false, dataType = "String"),
+        @ApiImplicitParam(name = "limitsCpu", value = "LIMITS_CPU", required = 
false, dataType = "Double"),
+        @ApiImplicitParam(name = "limitsMemory", value = "LIMITS_MEMORY", 
required = false, dataType = "Integer")})
     @PutMapping(value = "/{id}")
     @ResponseStatus(HttpStatus.CREATED)
     @ApiException(UPDATE_K8S_NAMESPACE_ERROR)
@@ -165,15 +165,15 @@ public class K8sNamespaceController extends 
BaseController {
     /**
      * verify namespace and k8s,one k8s namespace is unique
      *
-     * @param loginUser login user
-     * @param namespace namespace
-     * @param k8s       k8s
+     * @param loginUser   login user
+     * @param namespace   namespace
+     * @param clusterCode cluster code
      * @return true if the k8s and namespace not exists, otherwise return false
      */
     @ApiOperation(value = "verifyNamespaceK8s", notes = 
"VERIFY_NAMESPACE_K8S_NOTES")
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "namespace", value = "NAMESPACE", 
required = true, dataType = "String"),
-            @ApiImplicitParam(name = "k8s", value = "K8S", required = true, 
dataType = "String")
+        @ApiImplicitParam(name = "namespace", value = "NAMESPACE", required = 
true, dataType = "String"),
+        @ApiImplicitParam(name = "clusterCode", value = "CLUSTER_CODE", 
required = true, dataType = "Long"),
     })
     @PostMapping(value = "/verify")
     @ResponseStatus(HttpStatus.OK)
@@ -181,10 +181,10 @@ public class K8sNamespaceController extends 
BaseController {
     @AccessLogAnnotation(ignoreRequestArgs = "loginUser")
     public Result verifyNamespace(@ApiIgnore @RequestAttribute(value = 
Constants.SESSION_USER) User loginUser,
                                   @RequestParam(value = "namespace") String 
namespace,
-                                  @RequestParam(value = "k8s") String k8s
+                                  @RequestParam(value = "clusterCode") Long 
clusterCode
     ) {
 
-        return k8sNamespaceService.verifyNamespaceK8s(namespace, k8s);
+        return k8sNamespaceService.verifyNamespaceK8s(namespace, clusterCode);
     }
 
 
@@ -197,7 +197,7 @@ public class K8sNamespaceController extends BaseController {
      */
     @ApiOperation(value = "delNamespaceById", notes = 
"DELETE_NAMESPACE_BY_ID_NOTES")
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "id", value = "NAMESPACE_ID", required = 
true, dataType = "Int", example = "100")
+        @ApiImplicitParam(name = "id", value = "NAMESPACE_ID", required = 
true, dataType = "Int", example = "100")
     })
     @PostMapping(value = "/delete")
     @ResponseStatus(HttpStatus.OK)
@@ -213,7 +213,7 @@ public class K8sNamespaceController extends BaseController {
      * query unauthorized namespace
      *
      * @param loginUser login user
-     * @param userId user id
+     * @param userId    user id
      * @return the namespaces which user have not permission to see
      */
     @ApiOperation(value = "queryUnauthorizedNamespace", notes = 
"QUERY_UNAUTHORIZED_NAMESPACE_NOTES")
@@ -234,7 +234,7 @@ public class K8sNamespaceController extends BaseController {
      * query unauthorized namespace
      *
      * @param loginUser login user
-     * @param userId user id
+     * @param userId    user id
      * @return namespaces which the user have permission to see
      */
     @ApiOperation(value = "queryAuthorizedNamespace", notes = 
"QUERY_AUTHORIZED_NAMESPACE_NOTES")
@@ -260,10 +260,10 @@ public class K8sNamespaceController extends 
BaseController {
     @ApiOperation(value = "queryAvailableNamespaceList", notes = 
"QUERY_AVAILABLE_NAMESPACE_LIST_NOTES")
     @GetMapping(value = "/available-list")
     @ResponseStatus(HttpStatus.OK)
-    @ApiException(QUERY_CAN_USE_K8S_CLUSTER_ERROR)
+    @ApiException(QUERY_CAN_USE_K8S_NAMESPACE_ERROR)
     @AccessLogAnnotation(ignoreRequestArgs = "loginUser")
     public Result queryAvailableNamespaceList(@ApiIgnore 
@RequestAttribute(value = Constants.SESSION_USER) User loginUser) {
         List<K8sNamespace> result = 
k8sNamespaceService.queryNamespaceAvailable(loginUser);
         return success(result);
     }
-}
+}
\ No newline at end of file
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
index a04d994440..7918f5502c 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
@@ -423,6 +423,7 @@ public enum Status {
     RESOURCE_FULL_NAME_TOO_LONG_ERROR(1300015, "resource's fullname is too 
long error", "资源文件名过长"),
     TENANT_FULL_NAME_TOO_LONG_ERROR(1300016, "tenant's fullname is too long 
error", "租户名过长"),
     USER_PASSWORD_LENGTH_ERROR(1300017, "user's password length error", 
"用户密码长度错误"),
+    QUERY_CAN_USE_K8S_NAMESPACE_ERROR(1300018, "login user query can used 
namespace list error", "查询可用命名空间错误"),
 
     NO_CURRENT_OPERATING_PERMISSION(1400001, "The current user does not have 
this permission.", "当前用户无此权限"),
     FUNCTION_DISABLED(1400002, "The current feature is disabled.", "当前功能已被禁用"),
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/k8s/K8sClientService.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/k8s/K8sClientService.java
index b8f07c5ae5..dcfc6e734a 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/k8s/K8sClientService.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/k8s/K8sClientService.java
@@ -18,6 +18,7 @@
 package org.apache.dolphinscheduler.api.k8s;
 
 import org.apache.dolphinscheduler.dao.entity.K8sNamespace;
+import org.apache.dolphinscheduler.remote.exceptions.RemotingException;
 
 import java.util.Optional;
 
@@ -41,15 +42,15 @@ public class K8sClientService {
     @Autowired
     private K8sManager k8sManager;
 
-    public ResourceQuota upsertNamespaceAndResourceToK8s(K8sNamespace 
k8sNamespace, String yamlStr) {
-        upsertNamespaceToK8s(k8sNamespace.getNamespace(), 
k8sNamespace.getK8s());
+    public ResourceQuota upsertNamespaceAndResourceToK8s(K8sNamespace 
k8sNamespace, String yamlStr) throws RemotingException {
+        upsertNamespaceToK8s(k8sNamespace.getNamespace(), 
k8sNamespace.getClusterCode());
         return upsertNamespacedResourceToK8s(k8sNamespace, yamlStr);
     }
 
-    public Optional<Namespace> deleteNamespaceToK8s(String name, String k8s) {
-        Optional<Namespace> result = getNamespaceFromK8s(name, k8s);
+    public Optional<Namespace> deleteNamespaceToK8s(String name, Long 
clusterCode) throws RemotingException {
+        Optional<Namespace> result = getNamespaceFromK8s(name, clusterCode);
         if (result.isPresent()) {
-            KubernetesClient client = k8sManager.getK8sClient(k8s);
+            KubernetesClient client = k8sManager.getK8sClient(clusterCode);
             Namespace body = new Namespace();
             ObjectMeta meta = new ObjectMeta();
             meta.setNamespace(name);
@@ -57,12 +58,12 @@ public class K8sClientService {
             body.setMetadata(meta);
             client.namespaces().delete(body);
         }
-        return getNamespaceFromK8s(name, k8s);
+        return getNamespaceFromK8s(name, clusterCode);
     }
 
-    private ResourceQuota upsertNamespacedResourceToK8s(K8sNamespace 
k8sNamespace, String yamlStr) {
+    private ResourceQuota upsertNamespacedResourceToK8s(K8sNamespace 
k8sNamespace, String yamlStr) throws RemotingException {
 
-        KubernetesClient client = 
k8sManager.getK8sClient(k8sNamespace.getK8s());
+        KubernetesClient client = 
k8sManager.getK8sClient(k8sNamespace.getClusterCode());
 
         //创建资源
         ResourceQuota queryExist = client.resourceQuotas()
@@ -86,9 +87,9 @@ public class K8sClientService {
             .createOrReplace(body);
     }
 
-    private Optional<Namespace> getNamespaceFromK8s(String name, String k8s) {
+    private Optional<Namespace> getNamespaceFromK8s(String name, Long 
clusterCode) throws RemotingException {
         NamespaceList listNamespace =
-            k8sManager.getK8sClient(k8s).namespaces().list();
+            k8sManager.getK8sClient(clusterCode).namespaces().list();
 
         Optional<Namespace> list =
             listNamespace.getItems().stream()
@@ -99,11 +100,11 @@ public class K8sClientService {
         return list;
     }
 
-    private Namespace upsertNamespaceToK8s(String name, String k8s) {
-        Optional<Namespace> result = getNamespaceFromK8s(name, k8s);
+    private Namespace upsertNamespaceToK8s(String name, Long clusterCode) 
throws RemotingException {
+        Optional<Namespace> result = getNamespaceFromK8s(name, clusterCode);
         //if not exist create
         if (!result.isPresent()) {
-            KubernetesClient client = k8sManager.getK8sClient(k8s);
+            KubernetesClient client = k8sManager.getK8sClient(clusterCode);
             Namespace body = new Namespace();
             ObjectMeta meta = new ObjectMeta();
             meta.setNamespace(name);
@@ -114,4 +115,4 @@ public class K8sClientService {
         return result.get();
     }
 
-}
+}
\ No newline at end of file
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/k8s/K8sManager.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/k8s/K8sManager.java
index 4c98ddb617..52b7123cd8 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/k8s/K8sManager.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/k8s/K8sManager.java
@@ -17,29 +17,25 @@
 
 package org.apache.dolphinscheduler.api.k8s;
 
-import org.apache.dolphinscheduler.dao.entity.K8s;
-import org.apache.dolphinscheduler.dao.mapper.K8sMapper;
+import org.apache.dolphinscheduler.common.utils.ClusterConfUtils;
+import org.apache.dolphinscheduler.dao.entity.Cluster;
+import org.apache.dolphinscheduler.dao.mapper.ClusterMapper;
 import org.apache.dolphinscheduler.remote.exceptions.RemotingException;
 
 import java.util.Hashtable;
-import java.util.List;
 import java.util.Map;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.context.event.ApplicationReadyEvent;
-import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Component;
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-
 import io.fabric8.kubernetes.client.Config;
 import io.fabric8.kubernetes.client.DefaultKubernetesClient;
 import io.fabric8.kubernetes.client.KubernetesClient;
 
 /**
- * A separate class, because then wait for multiple environment feature, 
currently using db configuration, later unified
+ * use multiple environment feature
  */
 @Component
 public class K8sManager {
@@ -48,27 +44,76 @@ public class K8sManager {
     /**
      * cache k8s client
      */
-    private static Map<String, KubernetesClient> clientMap = new Hashtable<>();
+    private static Map<Long, KubernetesClient> clientMap = new Hashtable<>();
 
     @Autowired
-    private K8sMapper k8sMapper;
+    private ClusterMapper clusterMapper;
 
-    public KubernetesClient getK8sClient(String k8sName) {
-        if (null == k8sName) {
+    /**
+     * get k8s client for api use
+     *
+     * @param clusterCode
+     * @return
+     */
+    public synchronized KubernetesClient getK8sClient(Long clusterCode) throws 
RemotingException {
+        if (null == clusterCode) {
             return null;
         }
-        return clientMap.get(k8sName);
+
+        return getAndUpdateK8sClient(clusterCode, false);
+    }
+
+    /**
+     * @param clusterCode
+     * @return new client if need updated
+     */
+    public synchronized KubernetesClient getAndUpdateK8sClient(Long 
clusterCode, boolean update) throws RemotingException {
+        if (null == clusterCode) {
+            return null;
+        }
+
+        if (update) {
+            deleteK8sClientInner(clusterCode);
+        }
+
+        if (clientMap.containsKey(clusterCode)) {
+            return clientMap.get(clusterCode);
+        } else {
+            createK8sClientInner(clusterCode);
+        }
+        return clientMap.get(clusterCode);
     }
 
-    @EventListener
-    public void buildApiClientAll(ApplicationReadyEvent readyEvent) throws 
RemotingException {
-        QueryWrapper<K8s> nodeWrapper = new QueryWrapper<>();
-        List<K8s> k8sList = k8sMapper.selectList(nodeWrapper);
 
-        if (k8sList != null) {
-            for (K8s k8s : k8sList) {
-                DefaultKubernetesClient client = getClient(k8s.getK8sConfig());
-                clientMap.put(k8s.getK8sName(), client);
+    private void deleteK8sClientInner(Long clusterCode) {
+        if (clusterCode == null) {
+            return;
+        }
+        Cluster cluster = clusterMapper.queryByClusterCode(clusterCode);
+        if (cluster == null) {
+            return;
+        }
+        KubernetesClient client = clientMap.get(clusterCode);
+        if (client != null) {
+            client.close();
+        }
+    }
+
+    private void createK8sClientInner(Long clusterCode) throws 
RemotingException {
+        Cluster cluster = clusterMapper.queryByClusterCode(clusterCode);
+        if (cluster == null) {
+            return;
+        }
+
+        String k8sConfig = ClusterConfUtils.getK8sConfig(cluster.getConfig());
+        if (k8sConfig != null) {
+            DefaultKubernetesClient client = null;
+            try {
+                client = getClient(k8sConfig);
+                clientMap.put(clusterCode, client);
+            } catch (RemotingException e) {
+                logger.error("cluster code ={},fail to get k8s ApiClient:  
{}", clusterCode, e.getMessage());
+                throw new RemotingException("fail to get k8s ApiClient:" + 
e.getMessage());
             }
         }
     }
@@ -82,4 +127,5 @@ public class K8sManager {
             throw new RemotingException("fail to get k8s ApiClient:" + 
e.getMessage());
         }
     }
-}
+
+}
\ No newline at end of file
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/K8sNamespaceService.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/K8sNamespaceService.java
index d56c8ab537..d3f15a4dd6 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/K8sNamespaceService.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/K8sNamespaceService.java
@@ -28,6 +28,7 @@ import java.util.Map;
  * k8s namespace service impl
  */
 public interface K8sNamespaceService {
+
     /**
      * query namespace list paging
      *
@@ -39,19 +40,17 @@ public interface K8sNamespaceService {
      */
     Result queryListPaging(User loginUser, String searchVal, Integer pageNo, 
Integer pageSize);
 
-
     /**
      * create namespace,if not exist on k8s,will create,if exist only register 
in db
      *
      * @param loginUser    login user
      * @param namespace    namespace
-     * @param k8s          k8s not null
+     * @param clusterCode  k8s not null
      * @param limitsCpu    limits cpu, can null means not limit
      * @param limitsMemory limits memory, can null means not limit
      * @return
      */
-    Map<String, Object> createK8sNamespace(User loginUser, String namespace, 
String k8s, Double limitsCpu, Integer limitsMemory);
-
+    Map<String, Object> createK8sNamespace(User loginUser, String namespace, 
Long clusterCode, Double limitsCpu, Integer limitsMemory);
 
     /**
      * update K8s Namespace tag and resource limit
@@ -67,11 +66,11 @@ public interface K8sNamespaceService {
     /**
      * verify namespace and k8s
      *
-     * @param namespace namespace
-     * @param k8s       k8s
+     * @param namespace   namespace
+     * @param clusterCode cluster code
      * @return true if the k8s and namespace not exists, otherwise return false
      */
-    Result<Object> verifyNamespaceK8s(String namespace, String k8s);
+    Result<Object> verifyNamespaceK8s(String namespace, Long clusterCode);
 
     /**
      * delete namespace by id
@@ -107,4 +106,4 @@ public interface K8sNamespaceService {
      * @return namespace list
      */
     List<K8sNamespace> queryNamespaceAvailable(User loginUser);
-}
+}
\ No newline at end of file
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ClusterServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ClusterServiceImpl.java
index e069d0611f..38f1a0ff8a 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ClusterServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ClusterServiceImpl.java
@@ -19,15 +19,20 @@ package org.apache.dolphinscheduler.api.service.impl;
 
 import org.apache.dolphinscheduler.api.dto.ClusterDto;
 import org.apache.dolphinscheduler.api.enums.Status;
+import org.apache.dolphinscheduler.api.k8s.K8sManager;
 import org.apache.dolphinscheduler.api.service.ClusterService;
 import org.apache.dolphinscheduler.api.utils.PageInfo;
 import org.apache.dolphinscheduler.api.utils.Result;
 import org.apache.dolphinscheduler.common.Constants;
+import org.apache.dolphinscheduler.common.utils.ClusterConfUtils;
 import org.apache.dolphinscheduler.common.utils.CodeGenerateUtils;
 import 
org.apache.dolphinscheduler.common.utils.CodeGenerateUtils.CodeGenerateException;
 import org.apache.dolphinscheduler.dao.entity.Cluster;
+import org.apache.dolphinscheduler.dao.entity.K8sNamespace;
 import org.apache.dolphinscheduler.dao.entity.User;
 import org.apache.dolphinscheduler.dao.mapper.ClusterMapper;
+import org.apache.dolphinscheduler.dao.mapper.K8sNamespaceMapper;
+import org.apache.dolphinscheduler.remote.exceptions.RemotingException;
 
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
@@ -46,6 +51,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 
@@ -60,6 +66,11 @@ public class ClusterServiceImpl extends BaseServiceImpl 
implements ClusterServic
     @Autowired
     private ClusterMapper clusterMapper;
 
+    @Autowired
+    private K8sManager k8sManager;
+
+    @Autowired
+    private K8sNamespaceMapper k8sNamespaceMapper;
     /**
      * create cluster
      *
@@ -237,6 +248,14 @@ public class ClusterServiceImpl extends BaseServiceImpl 
implements ClusterServic
             return result;
         }
 
+        Integer relatedNamespaceNumber = k8sNamespaceMapper
+            .selectCount(new 
QueryWrapper<K8sNamespace>().lambda().eq(K8sNamespace::getClusterCode, code));
+
+        if (relatedNamespaceNumber > 0) {
+            putMsg(result, Status.DELETE_CLUSTER_RELATED_NAMESPACE_EXISTS);
+            return result;
+        }
+
         int delete = clusterMapper.deleteByCode(code);
         if (delete > 0) {
             putMsg(result, Status.SUCCESS);
@@ -281,6 +300,16 @@ public class ClusterServiceImpl extends BaseServiceImpl 
implements ClusterServic
             return result;
         }
 
+        if 
(!Constants.K8S_LOCAL_TEST_CLUSTER_CODE.equals(clusterExist.getCode())
+            && 
!config.equals(ClusterConfUtils.getK8sConfig(clusterExist.getConfig()))) {
+            try {
+                k8sManager.getAndUpdateK8sClient(code, true);
+            } catch (RemotingException e) {
+                putMsg(result, Status.K8S_CLIENT_OPS_ERROR, name);
+                return result;
+            }
+        }
+
         //update cluster
         clusterExist.setConfig(config);
         clusterExist.setName(name);
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/K8SNamespaceServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/K8SNamespaceServiceImpl.java
index 91d66b2c00..ed903348e8 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/K8SNamespaceServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/K8SNamespaceServiceImpl.java
@@ -22,13 +22,16 @@ import 
org.apache.dolphinscheduler.api.service.K8sNamespaceService;
 import org.apache.dolphinscheduler.api.utils.PageInfo;
 import org.apache.dolphinscheduler.api.utils.Result;
 import org.apache.dolphinscheduler.common.Constants;
-import org.apache.dolphinscheduler.common.enums.AuthorizationType;
+import org.apache.dolphinscheduler.common.utils.CodeGenerateUtils;
+import org.apache.dolphinscheduler.dao.entity.Cluster;
 import org.apache.dolphinscheduler.dao.entity.K8sNamespace;
 import org.apache.dolphinscheduler.dao.entity.User;
+import org.apache.dolphinscheduler.dao.mapper.ClusterMapper;
 import org.apache.dolphinscheduler.dao.mapper.K8sNamespaceMapper;
+import org.apache.dolphinscheduler.remote.exceptions.RemotingException;
 import org.apache.dolphinscheduler.api.k8s.K8sClientService;
 
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang.StringUtils;
 
 import java.util.ArrayList;
 import java.util.Date;
@@ -63,11 +66,16 @@ public class K8SNamespaceServiceImpl extends 
BaseServiceImpl implements K8sNames
         + "  hard:\n"
         + "    ${limitCpu}\n"
         + "    ${limitMemory}\n";
+
     @Autowired
     private K8sNamespaceMapper k8sNamespaceMapper;
+
     @Autowired
     private K8sClientService k8sClientService;
 
+    @Autowired
+    private ClusterMapper clusterMapper;
+
     /**
      * query namespace list paging
      *
@@ -80,6 +88,11 @@ public class K8SNamespaceServiceImpl extends BaseServiceImpl 
implements K8sNames
     @Override
     public Result queryListPaging(User loginUser, String searchVal, Integer 
pageNo, Integer pageSize) {
         Result result = new Result();
+        if (!isAdmin(loginUser)) {
+            putMsg(result, Status.USER_NO_OPERATION_PERM);
+            return result;
+        }
+
         Page<K8sNamespace> page = new Page<>(pageNo, pageSize);
 
         IPage<K8sNamespace> k8sNamespaceList = 
k8sNamespaceMapper.queryK8sNamespacePaging(page, searchVal);
@@ -99,16 +112,15 @@ public class K8SNamespaceServiceImpl extends 
BaseServiceImpl implements K8sNames
      *
      * @param loginUser    login user
      * @param namespace    namespace
-     * @param k8s          k8s not null
+     * @param clusterCode  k8s not null
      * @param limitsCpu    limits cpu, can null means not limit
      * @param limitsMemory limits memory, can null means not limit
      * @return
      */
     @Override
-    public Map<String, Object> createK8sNamespace(User loginUser, String 
namespace, String k8s, Double limitsCpu, Integer limitsMemory) {
+    public Map<String, Object> createK8sNamespace(User loginUser, String 
namespace, Long clusterCode, Double limitsCpu, Integer limitsMemory) {
         Map<String, Object> result = new HashMap<>();
-        if (!canOperatorPermissions(loginUser, 
null,AuthorizationType.K8S_NAMESPACE,null)) {
-            putMsg(result, Status.USER_NO_OPERATION_PERM);
+        if (isNotAdmin(loginUser, result)) {
             return result;
         }
 
@@ -117,8 +129,8 @@ public class K8SNamespaceServiceImpl extends 
BaseServiceImpl implements K8sNames
             return result;
         }
 
-        if (StringUtils.isEmpty(k8s)) {
-            putMsg(result, Status.REQUEST_PARAMS_NOT_VALID_ERROR, 
Constants.K8S);
+        if (clusterCode == null) {
+            putMsg(result, Status.REQUEST_PARAMS_NOT_VALID_ERROR, 
Constants.CLUSTER);
             return result;
         }
 
@@ -132,27 +144,45 @@ public class K8SNamespaceServiceImpl extends 
BaseServiceImpl implements K8sNames
             return result;
         }
 
-        if (checkNamespaceExistInDb(namespace, k8s)) {
-            putMsg(result, Status.K8S_NAMESPACE_EXIST, namespace, k8s);
+        if (checkNamespaceExistInDb(namespace, clusterCode)) {
+            putMsg(result, Status.K8S_NAMESPACE_EXIST, namespace, clusterCode);
+            return result;
+        }
+
+        Cluster cluster = clusterMapper.queryByClusterCode(clusterCode);
+        if (cluster == null) {
+            putMsg(result, Status.CLUSTER_NOT_EXISTS, namespace, clusterCode);
+            return result;
+        }
+
+        long code = 0L;
+        try {
+            code = CodeGenerateUtils.getInstance().genCode();
+            cluster.setCode(code);
+        } catch (CodeGenerateUtils.CodeGenerateException e) {
+            logger.error("Cluster code get error, ", e);
+        }
+        if (code == 0L) {
+            putMsg(result, Status.INTERNAL_SERVER_ERROR_ARGS, "Error 
generating cluster code");
             return result;
         }
 
         K8sNamespace k8sNamespaceObj = new K8sNamespace();
         Date now = new Date();
 
+        k8sNamespaceObj.setCode(code);
         k8sNamespaceObj.setNamespace(namespace);
-        k8sNamespaceObj.setK8s(k8s);
+        k8sNamespaceObj.setClusterCode(clusterCode);
         k8sNamespaceObj.setUserId(loginUser.getId());
         k8sNamespaceObj.setLimitsCpu(limitsCpu);
         k8sNamespaceObj.setLimitsMemory(limitsMemory);
-        k8sNamespaceObj.setOnlineJobNum(0);
         k8sNamespaceObj.setPodReplicas(0);
         k8sNamespaceObj.setPodRequestCpu(0.0);
         k8sNamespaceObj.setPodRequestMemory(0);
         k8sNamespaceObj.setCreateTime(now);
         k8sNamespaceObj.setUpdateTime(now);
 
-        if 
(!Constants.K8S_LOCAL_TEST_CLUSTER.equals(k8sNamespaceObj.getK8s())) {
+        if 
(!Constants.K8S_LOCAL_TEST_CLUSTER_CODE.equals(k8sNamespaceObj.getClusterCode()))
 {
             try {
                 String yamlStr = genDefaultResourceYaml(k8sNamespaceObj);
                 
k8sClientService.upsertNamespaceAndResourceToK8s(k8sNamespaceObj, yamlStr);
@@ -181,8 +211,7 @@ public class K8SNamespaceServiceImpl extends 
BaseServiceImpl implements K8sNames
     @Override
     public Map<String, Object> updateK8sNamespace(User loginUser, int id, 
String userName, Double limitsCpu, Integer limitsMemory) {
         Map<String, Object> result = new HashMap<>();
-        if (!canOperatorPermissions(loginUser, 
null,AuthorizationType.K8S_NAMESPACE,null)) {
-            putMsg(result, Status.USER_NO_OPERATION_PERM);
+        if (isNotAdmin(loginUser, result)) {
             return result;
         }
 
@@ -207,7 +236,7 @@ public class K8SNamespaceServiceImpl extends 
BaseServiceImpl implements K8sNames
         k8sNamespaceObj.setLimitsMemory(limitsMemory);
         k8sNamespaceObj.setUpdateTime(now);
 
-        if 
(!Constants.K8S_LOCAL_TEST_CLUSTER.equals(k8sNamespaceObj.getK8s())) {
+        if 
(!Constants.K8S_LOCAL_TEST_CLUSTER_CODE.equals(k8sNamespaceObj.getClusterCode()))
 {
             try {
                 String yamlStr = genDefaultResourceYaml(k8sNamespaceObj);
                 
k8sClientService.upsertNamespaceAndResourceToK8s(k8sNamespaceObj, yamlStr);
@@ -227,25 +256,25 @@ public class K8SNamespaceServiceImpl extends 
BaseServiceImpl implements K8sNames
     /**
      * verify namespace and k8s
      *
-     * @param namespace namespace
-     * @param k8s       k8s
+     * @param namespace   namespace
+     * @param clusterCode cluster code
      * @return true if the k8s and namespace not exists, otherwise return false
      */
     @Override
-    public Result<Object> verifyNamespaceK8s(String namespace, String k8s) {
+    public Result<Object> verifyNamespaceK8s(String namespace, Long 
clusterCode) {
         Result<Object> result = new Result<>();
         if (StringUtils.isEmpty(namespace)) {
             putMsg(result, Status.REQUEST_PARAMS_NOT_VALID_ERROR, 
Constants.NAMESPACE);
             return result;
         }
 
-        if (StringUtils.isEmpty(k8s)) {
-            putMsg(result, Status.REQUEST_PARAMS_NOT_VALID_ERROR, 
Constants.K8S);
+        if (clusterCode == null) {
+            putMsg(result, Status.REQUEST_PARAMS_NOT_VALID_ERROR, 
Constants.CLUSTER);
             return result;
         }
 
-        if (checkNamespaceExistInDb(namespace, k8s)) {
-            putMsg(result, Status.K8S_NAMESPACE_EXIST, namespace, k8s);
+        if (checkNamespaceExistInDb(namespace, clusterCode)) {
+            putMsg(result, Status.K8S_NAMESPACE_EXIST, namespace, clusterCode);
             return result;
         }
 
@@ -263,8 +292,7 @@ public class K8SNamespaceServiceImpl extends 
BaseServiceImpl implements K8sNames
     @Override
     public Map<String, Object> deleteNamespaceById(User loginUser, int id) {
         Map<String, Object> result = new HashMap<>();
-        if (!canOperatorPermissions(loginUser, 
null,AuthorizationType.K8S_NAMESPACE,null)) {
-            putMsg(result, Status.USER_NO_OPERATION_PERM);
+        if (isNotAdmin(loginUser, result)) {
             return result;
         }
 
@@ -273,8 +301,13 @@ public class K8SNamespaceServiceImpl extends 
BaseServiceImpl implements K8sNames
             putMsg(result, Status.K8S_NAMESPACE_NOT_EXIST, id);
             return result;
         }
-        if 
(!Constants.K8S_LOCAL_TEST_CLUSTER.equals(k8sNamespaceObj.getK8s())) {
-            
k8sClientService.deleteNamespaceToK8s(k8sNamespaceObj.getNamespace(), 
k8sNamespaceObj.getK8s());
+        if 
(!Constants.K8S_LOCAL_TEST_CLUSTER_CODE.equals(k8sNamespaceObj.getClusterCode()))
 {
+            try {
+                
k8sClientService.deleteNamespaceToK8s(k8sNamespaceObj.getNamespace(), 
k8sNamespaceObj.getClusterCode());
+            } catch (RemotingException e) {
+                putMsg(result, Status.K8S_CLIENT_OPS_ERROR, id);
+                return result;
+            }
         }
         k8sNamespaceMapper.deleteById(id);
         putMsg(result, Status.SUCCESS);
@@ -287,8 +320,8 @@ public class K8SNamespaceServiceImpl extends 
BaseServiceImpl implements K8sNames
      * @param namespace namespace
      * @return true if the k8s and namespace not exists, otherwise return false
      */
-    private boolean checkNamespaceExistInDb(String namespace, String k8s) {
-        return k8sNamespaceMapper.existNamespace(namespace, k8s) == 
Boolean.TRUE;
+    private boolean checkNamespaceExistInDb(String namespace, Long 
clusterCode) {
+        return k8sNamespaceMapper.existNamespace(namespace, clusterCode) == 
Boolean.TRUE;
     }
 
     /**
@@ -338,8 +371,7 @@ public class K8SNamespaceServiceImpl extends 
BaseServiceImpl implements K8sNames
     @Override
     public Map<String, Object> queryUnauthorizedNamespace(User loginUser, 
Integer userId) {
         Map<String, Object> result = new HashMap<>();
-        if (loginUser.getId() != userId && !canOperatorPermissions(loginUser, 
null,AuthorizationType.K8S_NAMESPACE,null)) {
-            putMsg(result, Status.USER_NO_OPERATION_PERM);
+        if (loginUser.getId() != userId && isNotAdmin(loginUser, result)) {
             return result;
         }
         // query all namespace list,this auth does not like project
@@ -367,8 +399,7 @@ public class K8SNamespaceServiceImpl extends 
BaseServiceImpl implements K8sNames
     public Map<String, Object> queryAuthorizedNamespace(User loginUser, 
Integer userId) {
         Map<String, Object> result = new HashMap<>();
 
-        if (loginUser.getId() != userId && !canOperatorPermissions(loginUser, 
null,AuthorizationType.K8S_NAMESPACE,null)) {
-            putMsg(result, Status.USER_NO_OPERATION_PERM);
+        if (loginUser.getId() != userId && isNotAdmin(loginUser, result)) {
             return result;
         }
 
@@ -387,7 +418,7 @@ public class K8SNamespaceServiceImpl extends 
BaseServiceImpl implements K8sNames
      */
     @Override
     public List<K8sNamespace> queryNamespaceAvailable(User loginUser) {
-        if 
(canOperatorPermissions(loginUser,null,AuthorizationType.K8S_NAMESPACE,null)) {
+        if (isAdmin(loginUser)) {
             return k8sNamespaceMapper.selectList(null);
         } else {
             return 
k8sNamespaceMapper.queryNamespaceAvailable(loginUser.getId());
@@ -419,5 +450,4 @@ public class K8SNamespaceServiceImpl extends 
BaseServiceImpl implements K8sNames
         }
         return resultList;
     }
-
-}
+}
\ No newline at end of file
diff --git 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/ClusterControllerTest.java
 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/ClusterControllerTest.java
index fd255ce0f3..8ee52f8664 100644
--- 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/ClusterControllerTest.java
+++ 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/ClusterControllerTest.java
@@ -42,7 +42,7 @@ import com.google.common.base.Preconditions;
 
 public class ClusterControllerTest extends AbstractControllerTest {
     public static final String clusterName = "Cluster1";
-    public static final String config = "this is config content";
+    public static final String config = "{\"k8s\":\"apiVersion: v1\"}";
     public static final String desc = "this is cluster description";
     private static final Logger logger = 
LoggerFactory.getLogger(ClusterControllerTest.class);
     private String clusterCode;
diff --git 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/K8sNamespaceControllerTest.java
 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/K8sNamespaceControllerTest.java
index d265ebb118..9631ab6d11 100644
--- 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/K8sNamespaceControllerTest.java
+++ 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/K8sNamespaceControllerTest.java
@@ -28,12 +28,8 @@ import org.apache.dolphinscheduler.api.utils.Result;
 import org.apache.dolphinscheduler.common.utils.JSONUtils;
 import org.apache.dolphinscheduler.dao.entity.User;
 
-import java.util.HashMap;
-import java.util.Map;
-
 import org.junit.Assert;
 import org.junit.Test;
-import org.mockito.Mockito;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.http.MediaType;
@@ -72,7 +68,7 @@ public class K8sNamespaceControllerTest extends 
AbstractControllerTest {
 
         MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>();
         paramsMap.add("namespace", NAMESPACE_CREATE_STRING);
-        paramsMap.add("k8s", "k8s");
+        paramsMap.add("clusterCode", "0");
 
         MvcResult mvcResult = mockMvc.perform(post("/k8s-namespace")
             .header(SESSION_ID, sessionId)
@@ -82,7 +78,7 @@ public class K8sNamespaceControllerTest extends 
AbstractControllerTest {
             .andReturn();
 
         Result result = 
JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), 
Result.class);
-        Assert.assertEquals(Status.K8S_CLIENT_OPS_ERROR.getCode(), 
result.getCode().intValue());//because we not have a k8s cluster in test env
+        Assert.assertEquals(Status.SUCCESS.getCode(), 
result.getCode().intValue());//because we not have a k8s cluster in test env
         logger.info("create queue return result:{}", 
mvcResult.getResponse().getContentAsString());
     }
 
@@ -108,8 +104,8 @@ public class K8sNamespaceControllerTest extends 
AbstractControllerTest {
     public void verifyNamespace() throws Exception {
         // queue value exist
         MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>();
-        paramsMap.add("namespace", NAMESPACE_CREATE_STRING);
-        paramsMap.add("k8s", "default");
+        paramsMap.add("namespace", "NAMESPACE_CREATE_STRING");
+        paramsMap.add("clusterCode", "100");
 
         // success
 
@@ -127,7 +123,7 @@ public class K8sNamespaceControllerTest extends 
AbstractControllerTest {
         //error
         paramsMap.clear();
         paramsMap.add("namespace", null);
-        paramsMap.add("k8s", "default");
+        paramsMap.add("clusterCode", "100");
         mvcResult = mockMvc.perform(post("/k8s-namespace/verify")
             .header(SESSION_ID, sessionId)
             .params(paramsMap))
diff --git 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/k8s/K8sManagerTest.java
 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/k8s/K8sManagerTest.java
index 0d2033e88d..fb36dd2e35 100644
--- 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/k8s/K8sManagerTest.java
+++ 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/k8s/K8sManagerTest.java
@@ -17,8 +17,9 @@
 
 package org.apache.dolphinscheduler.api.k8s;
 
-import org.apache.dolphinscheduler.dao.entity.K8s;
-import org.apache.dolphinscheduler.dao.mapper.K8sMapper;
+import org.apache.dolphinscheduler.dao.entity.Cluster;
+import org.apache.dolphinscheduler.dao.mapper.ClusterMapper;
+import org.apache.dolphinscheduler.remote.exceptions.RemotingException;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -42,7 +43,7 @@ public class K8sManagerTest {
     private K8sManager k8sManager;
 
     @Mock
-    private K8sMapper k8sMapper;
+    private ClusterMapper clusterMapper;
 
     @Before
     public void setUp() throws Exception {
@@ -53,26 +54,27 @@ public class K8sManagerTest {
     }
 
     @Test
-    public void getK8sClient() {
-        
Mockito.when(k8sMapper.selectList(Mockito.any())).thenReturn(getK8sList());
+    public void getK8sClient() throws RemotingException {
+        
Mockito.when(clusterMapper.selectList(Mockito.any())).thenReturn(getClusterList());
 
-        KubernetesClient result = k8sManager.getK8sClient("must null");
+        KubernetesClient result = k8sManager.getK8sClient(1L);
         Assert.assertNull(result);
         result = k8sManager.getK8sClient(null);
         Assert.assertNull(result);
     }
 
-    private K8s getK8s() {
-        K8s k8s = new K8s();
-        k8s.setId(1);
-        k8s.setK8sName("default");
-        k8s.setK8sConfig("k8s config");
-        return k8s;
+    private Cluster getCluster() {
+        Cluster cluster = new Cluster();
+        cluster.setId(1);
+        cluster.setCode(1L);
+        cluster.setName("cluster");
+        cluster.setConfig("{\"k8s\":\"k8s config yaml\"}");
+        return cluster;
     }
 
-    private List<K8s> getK8sList() {
-        List<K8s> k8sList = new ArrayList<>();
-        k8sList.add(getK8s());
-        return k8sList;
+    private List<Cluster> getClusterList() {
+        List<Cluster> clusterList = new ArrayList<>();
+        clusterList.add(getCluster());
+        return clusterList;
     }
 }
\ No newline at end of file
diff --git 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ClusterServiceTest.java
 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ClusterServiceTest.java
index 7c22c57fc6..ac2e261ce9 100644
--- 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ClusterServiceTest.java
+++ 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ClusterServiceTest.java
@@ -221,6 +221,11 @@ public class ClusterServiceTest {
         result = clusterService.deleteClusterByCode(loginUser,1L);
         logger.info(result.toString());
         Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS));
+
+        
Mockito.when(k8sNamespaceMapper.selectCount(Mockito.any())).thenReturn(1);
+        result = clusterService.deleteClusterByCode(loginUser,1L);
+        logger.info(result.toString());
+        Assert.assertEquals(Status.DELETE_CLUSTER_RELATED_NAMESPACE_EXISTS, 
result.get(Constants.STATUS));
     }
 
     @Test
diff --git 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/K8SNamespaceServiceTest.java
 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/K8SNamespaceServiceTest.java
index f2c5b7064c..8732a59658 100644
--- 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/K8SNamespaceServiceTest.java
+++ 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/K8SNamespaceServiceTest.java
@@ -18,15 +18,15 @@
 package org.apache.dolphinscheduler.api.service;
 
 import org.apache.dolphinscheduler.api.enums.Status;
-import org.apache.dolphinscheduler.api.service.impl.BaseServiceImpl;
 import org.apache.dolphinscheduler.api.service.impl.K8SNamespaceServiceImpl;
 import org.apache.dolphinscheduler.api.utils.PageInfo;
 import org.apache.dolphinscheduler.api.utils.Result;
 import org.apache.dolphinscheduler.common.Constants;
-import org.apache.dolphinscheduler.common.enums.AuthorizationType;
 import org.apache.dolphinscheduler.common.enums.UserType;
+import org.apache.dolphinscheduler.dao.entity.Cluster;
 import org.apache.dolphinscheduler.dao.entity.K8sNamespace;
 import org.apache.dolphinscheduler.dao.entity.User;
+import org.apache.dolphinscheduler.dao.mapper.ClusterMapper;
 import org.apache.dolphinscheduler.dao.mapper.K8sNamespaceMapper;
 import org.apache.dolphinscheduler.dao.mapper.UserMapper;
 import org.apache.dolphinscheduler.api.k8s.K8sClientService;
@@ -37,7 +37,6 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
-import 
org.apache.dolphinscheduler.api.permission.ResourcePermissionCheckService;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
@@ -57,7 +56,6 @@ import 
com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 public class K8SNamespaceServiceTest {
 
     private static final Logger logger = 
LoggerFactory.getLogger(K8SNamespaceServiceTest.class);
-    private static final Logger baseServiceLogger = 
LoggerFactory.getLogger(BaseServiceImpl.class);
 
     @InjectMocks
     private K8SNamespaceServiceImpl k8sNamespaceService;
@@ -69,18 +67,18 @@ public class K8SNamespaceServiceTest {
     private K8sClientService k8sClientService;
 
     @Mock
-    private ResourcePermissionCheckService resourcePermissionCheckService;
+    private UserMapper userMapper;
 
     @Mock
-    private UserMapper userMapper;
+    private ClusterMapper clusterMapper;
 
     private String namespace = "default";
-    private String k8s = "default";
+    private Long clusterCode = 100L;
 
     @Before
     public void setUp() throws Exception {
         
Mockito.when(k8sClientService.upsertNamespaceAndResourceToK8s(Mockito.any(K8sNamespace.class),
 Mockito.anyString())).thenReturn(null);
-        
Mockito.when(k8sClientService.deleteNamespaceToK8s(Mockito.anyString(), 
Mockito.anyString())).thenReturn(null);
+        
Mockito.when(k8sClientService.deleteNamespaceToK8s(Mockito.anyString(), 
Mockito.anyLong())).thenReturn(null);
     }
 
     @After
@@ -101,10 +99,8 @@ public class K8SNamespaceServiceTest {
 
     @Test
     public void createK8sNamespace() {
-        
Mockito.when(resourcePermissionCheckService.operationPermissionCheck(AuthorizationType.K8S_NAMESPACE,
 getLoginUser().getId(), null, baseServiceLogger)).thenReturn(true);
-        
Mockito.when(resourcePermissionCheckService.resourcePermissionCheck(AuthorizationType.K8S_NAMESPACE,
 null, 0, baseServiceLogger)).thenReturn(true);
         // namespace is null
-        Map<String, Object> result = 
k8sNamespaceService.createK8sNamespace(getLoginUser(), null, k8s, 10.0, 100);
+        Map<String, Object> result = 
k8sNamespaceService.createK8sNamespace(getLoginUser(), null, clusterCode, 10.0, 
100);
         logger.info(result.toString());
         Assert.assertEquals(Status.REQUEST_PARAMS_NOT_VALID_ERROR, 
result.get(Constants.STATUS));
         // k8s is null
@@ -112,11 +108,12 @@ public class K8SNamespaceServiceTest {
         logger.info(result.toString());
         Assert.assertEquals(Status.REQUEST_PARAMS_NOT_VALID_ERROR, 
result.get(Constants.STATUS));
         // correct
-        result = k8sNamespaceService.createK8sNamespace(getLoginUser(), 
namespace, k8s, 10.0, 100);
+        
Mockito.when(clusterMapper.queryByClusterCode(Mockito.anyLong())).thenReturn(getCluster());
+        result = k8sNamespaceService.createK8sNamespace(getLoginUser(), 
namespace, clusterCode, 10.0, 100);
         logger.info(result.toString());
         Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS));
         //null limit cpu and mem
-        result = k8sNamespaceService.createK8sNamespace(getLoginUser(), 
namespace, k8s, null, null);
+        result = k8sNamespaceService.createK8sNamespace(getLoginUser(), 
namespace, clusterCode, null, null);
         logger.info(result.toString());
         Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS));
     }
@@ -124,8 +121,7 @@ public class K8SNamespaceServiceTest {
     @Test
     public void updateK8sNamespace() {
         
Mockito.when(k8sNamespaceMapper.selectById(1)).thenReturn(getNamespace());
-        
Mockito.when(resourcePermissionCheckService.operationPermissionCheck(AuthorizationType.K8S_NAMESPACE,
 getLoginUser().getId(), null, baseServiceLogger)).thenReturn(true);
-        
Mockito.when(resourcePermissionCheckService.resourcePermissionCheck(AuthorizationType.K8S_NAMESPACE,
 null, 0, baseServiceLogger)).thenReturn(true);
+
         Map<String, Object> result = 
k8sNamespaceService.updateK8sNamespace(getLoginUser(), 1, null, null, null);
         logger.info(result.toString());
         Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS));
@@ -142,10 +138,10 @@ public class K8SNamespaceServiceTest {
     @Test
     public void verifyNamespaceK8s() {
 
-        Mockito.when(k8sNamespaceMapper.existNamespace(namespace, 
k8s)).thenReturn(true);
+        Mockito.when(k8sNamespaceMapper.existNamespace(namespace, 
clusterCode)).thenReturn(true);
 
         //namespace null
-        Result result = k8sNamespaceService.verifyNamespaceK8s(null, k8s);
+        Result result = k8sNamespaceService.verifyNamespaceK8s(null, 
clusterCode);
         logger.info(result.toString());
         Assert.assertEquals(result.getCode().intValue(), 
Status.REQUEST_PARAMS_NOT_VALID_ERROR.getCode());
 
@@ -155,12 +151,12 @@ public class K8SNamespaceServiceTest {
         Assert.assertEquals(result.getCode().intValue(), 
Status.REQUEST_PARAMS_NOT_VALID_ERROR.getCode());
 
         //exist
-        result = k8sNamespaceService.verifyNamespaceK8s(namespace, k8s);
+        result = k8sNamespaceService.verifyNamespaceK8s(namespace, 
clusterCode);
         logger.info(result.toString());
         Assert.assertEquals(result.getCode().intValue(), 
Status.K8S_NAMESPACE_EXIST.getCode());
 
         //not exist
-        result = k8sNamespaceService.verifyNamespaceK8s(namespace, "other 
k8s");
+        result = k8sNamespaceService.verifyNamespaceK8s(namespace, 9999L);
         logger.info(result.toString());
         Assert.assertEquals(result.getCode().intValue(), 
Status.SUCCESS.getCode());
     }
@@ -169,8 +165,7 @@ public class K8SNamespaceServiceTest {
     public void deleteNamespaceById() {
         
Mockito.when(k8sNamespaceMapper.deleteById(Mockito.any())).thenReturn(1);
         
Mockito.when(k8sNamespaceMapper.selectById(1)).thenReturn(getNamespace());
-        
Mockito.when(resourcePermissionCheckService.operationPermissionCheck(AuthorizationType.K8S_NAMESPACE,
 getLoginUser().getId(), null, baseServiceLogger)).thenReturn(true);
-        
Mockito.when(resourcePermissionCheckService.resourcePermissionCheck(AuthorizationType.K8S_NAMESPACE,
 null, 0, baseServiceLogger)).thenReturn(true);
+
         Map<String, Object> result = 
k8sNamespaceService.deleteNamespaceById(getLoginUser(), 1);
         logger.info(result.toString());
         Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS));
@@ -179,8 +174,7 @@ public class K8SNamespaceServiceTest {
     @Test
     public void testQueryAuthorizedNamespace() {
         
Mockito.when(k8sNamespaceMapper.queryAuthedNamespaceListByUserId(2)).thenReturn(getNamespaceList());
-        
Mockito.when(resourcePermissionCheckService.operationPermissionCheck(AuthorizationType.K8S_NAMESPACE,
 getLoginUser().getId(), null, baseServiceLogger)).thenReturn(true);
-        
Mockito.when(resourcePermissionCheckService.resourcePermissionCheck(AuthorizationType.K8S_NAMESPACE,
 null, 0, baseServiceLogger)).thenReturn(true);
+
         User loginUser = getLoginUser();
 
         // test admin user
@@ -203,8 +197,7 @@ public class K8SNamespaceServiceTest {
     public void testQueryUnAuthorizedNamespace() {
         
Mockito.when(k8sNamespaceMapper.queryAuthedNamespaceListByUserId(2)).thenReturn(new
 ArrayList<>());
         
Mockito.when(k8sNamespaceMapper.selectList(Mockito.any())).thenReturn(getNamespaceList());
-        
Mockito.when(resourcePermissionCheckService.operationPermissionCheck(AuthorizationType.K8S_NAMESPACE,
 0, null, baseServiceLogger)).thenReturn(true);
-        
Mockito.when(resourcePermissionCheckService.resourcePermissionCheck(AuthorizationType.K8S_NAMESPACE,
 null, 0, baseServiceLogger)).thenReturn(true);
+
         // test admin user
         User loginUser = new User();
         loginUser.setUserType(UserType.ADMIN_USER);
@@ -235,7 +228,7 @@ public class K8SNamespaceServiceTest {
     private K8sNamespace getNamespace() {
         K8sNamespace k8sNamespace = new K8sNamespace();
         k8sNamespace.setId(1);
-        k8sNamespace.setK8s(k8s);
+        k8sNamespace.setClusterCode(clusterCode);
         k8sNamespace.setNamespace(namespace);
         return k8sNamespace;
     }
@@ -245,4 +238,14 @@ public class K8SNamespaceServiceTest {
         k8sNamespaceList.add(getNamespace());
         return k8sNamespaceList;
     }
+
+    private Cluster getCluster() {
+        Cluster cluster = new Cluster();
+        cluster.setId(1);
+        cluster.setCode(1L);
+        cluster.setName("clusterName");
+        cluster.setConfig("{}");
+        cluster.setOperator(1);
+        return cluster;
+    }
 }
\ No newline at end of file
diff --git 
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/Constants.java
 
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/Constants.java
index ea54e362cc..6f253d99a4 100644
--- 
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/Constants.java
+++ 
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/Constants.java
@@ -804,10 +804,10 @@ public final class Constants {
      * use for k8s
      */
     public static final String NAMESPACE = "namespace";
-    public static final String K8S = "k8s";
+    public static final String CLUSTER = "cluster";
     public static final String LIMITS_CPU = "limitsCpu";
     public static final String LIMITS_MEMORY = "limitsMemory";
-    public static final String K8S_LOCAL_TEST_CLUSTER = "ds_null_k8s";
+    public static final Long K8S_LOCAL_TEST_CLUSTER_CODE = 0L;
 
     /**
      * schedule timezone
diff --git 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/K8sNamespace.java
 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/K8sNamespace.java
index e6864a58bd..fde51dbebe 100644
--- 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/K8sNamespace.java
+++ 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/K8sNamespace.java
@@ -32,6 +32,11 @@ public class K8sNamespace {
     @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
 
+    /**
+     * cluster code
+     */
+    private Long code;
+
     /**
      * namespace name
      */
@@ -92,16 +97,16 @@ public class K8sNamespace {
     private Integer podReplicas = 0;
 
     /**
-     * online job
+     * cluster code
      */
-    @TableField("online_job_num")
-    private Integer onlineJobNum = 0;
+    @TableField("cluster_code")
+    private Long clusterCode;
 
     /**
      * k8s name
      */
-    @TableField("k8s")
-    private String k8s;
+    @TableField(exist = false)
+    private String clusterName;
 
     public Integer getId() {
         return id;
@@ -175,20 +180,20 @@ public class K8sNamespace {
         this.podReplicas = podReplicas;
     }
 
-    public Integer getOnlineJobNum() {
-        return onlineJobNum;
+    public Long getClusterCode() {
+        return clusterCode;
     }
 
-    public void setOnlineJobNum(Integer onlineJobNum) {
-        this.onlineJobNum = onlineJobNum;
+    public void setClusterCode(Long clusterCode) {
+        this.clusterCode = clusterCode;
     }
 
-    public String getK8s() {
-        return k8s;
+    public String getClusterName() {
+        return clusterName;
     }
 
-    public void setK8s(String k8s) {
-        this.k8s = k8s;
+    public void setClusterName(String clusterName) {
+        this.clusterName = clusterName;
     }
 
     public Double getPodRequestCpu() {
@@ -211,14 +216,14 @@ public class K8sNamespace {
     public String toString() {
         return "K8sNamespace{" +
             "id=" + id +
+            "code=" + code +
             ", namespace=" + namespace +
             ", limitsCpu=" + limitsCpu +
             ", limitsMemory=" + limitsMemory +
-            ", userId=" + userId +
             ", podRequestCpu=" + podRequestCpu +
             ", podRequestMemory=" + podRequestMemory +
             ", podReplicas=" + podReplicas +
-            ", k8s=" + k8s +
+            ", clusterCode=" + clusterCode +
             ", createTime=" + createTime +
             ", updateTime=" + updateTime +
             '}';
@@ -239,13 +244,21 @@ public class K8sNamespace {
             return true;
         }
 
-        return namespace.equals(k8sNamespace.namespace) && 
k8s.equals(k8sNamespace.k8s);
+        return namespace.equals(k8sNamespace.namespace) && 
clusterName.equals(k8sNamespace.clusterName);
     }
 
     @Override
     public int hashCode() {
         int result = id;
-        result = 31 * result + (k8s+namespace).hashCode();
+        result = 31 * result + (clusterName + namespace).hashCode();
         return result;
     }
-}
+
+    public Long getCode() {
+        return code;
+    }
+
+    public void setCode(Long code) {
+        this.code = code;
+    }
+}
\ No newline at end of file
diff --git 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/K8sNamespaceMapper.java
 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/K8sNamespaceMapper.java
index e8f80ebf3f..f89e7579e4 100644
--- 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/K8sNamespaceMapper.java
+++ 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/K8sNamespaceMapper.java
@@ -43,11 +43,11 @@ public interface K8sNamespaceMapper extends 
BaseMapper<K8sNamespace> {
     /**
      * check the target namespace exist
      *
-     * @param namespace namespace
-     * @param k8s       k8s name
+     * @param namespace   namespace
+     * @param clusterCode clusterCode
      * @return true if exist else return null
      */
-    Boolean existNamespace(@Param("namespace") String namespace, @Param("k8s") 
String k8s);
+    Boolean existNamespace(@Param("namespace") String namespace, 
@Param("clusterCode") Long clusterCode);
 
     /**
      * query namespace except userId
@@ -72,4 +72,12 @@ public interface K8sNamespaceMapper extends 
BaseMapper<K8sNamespace> {
      * @return namespace list
      */
     List<K8sNamespace> queryNamespaceAvailable(@Param("userId") Integer 
userId);
-}
+
+    /**
+     * check the target namespace
+     *
+     * @param namespaceCode namespaceCode
+     * @return true if exist else return null
+     */
+    K8sNamespace queryByNamespaceCode(@Param("clusterCode") Long 
namespaceCode);
+}
\ No newline at end of file
diff --git 
a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/K8sNamespaceMapper.xml
 
b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/K8sNamespaceMapper.xml
index ba32fc2b12..4acea799df 100644
--- 
a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/K8sNamespaceMapper.xml
+++ 
b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/K8sNamespaceMapper.xml
@@ -20,22 +20,26 @@
 <mapper namespace="org.apache.dolphinscheduler.dao.mapper.K8sNamespaceMapper">
 
     <sql id="baseSql">
-        id, namespace, k8s, user_id, limits_memory, limits_cpu, 
online_job_num, pod_replicas, pod_request_cpu, pod_request_memory, create_time, 
update_time
+        id, code, namespace, user_id, limits_memory, limits_cpu, pod_replicas, 
pod_request_cpu, pod_request_memory, cluster_code, create_time, update_time
     </sql>
 
     <sql id="baseSqlV2">
-        ${alias}.id, ${alias}.namespace, ${alias}.k8s, ${alias}.user_id, 
${alias}.limits_memory, ${alias}.limits_cpu, ${alias}.online_job_num, 
${alias}.pod_replicas, ${alias}.pod_request_cpu, ${alias}.pod_request_memory, 
${alias}.create_time, ${alias}.update_time
+        ${alias}.id, ${alias}.code, ${alias}.namespace, ${alias}.user_id, 
${alias}.limits_memory, ${alias}.limits_cpu, ${alias}.pod_replicas, 
${alias}.pod_request_cpu, ${alias}.pod_request_memory, ${alias}.cluster_code, 
${alias}.create_time, ${alias}.update_time
     </sql>
 
     <select id="queryK8sNamespacePaging" 
resultType="org.apache.dolphinscheduler.dao.entity.K8sNamespace">
         select
-        <include refid="baseSql"/>
-        from t_ds_k8s_namespace
+        <include refid="baseSqlV2">
+            <property name="alias" value="p"/>
+        </include>
+        ,u.name as cluster_name
+        from t_ds_k8s_namespace p
+        left join t_ds_cluster u on u.code=p.cluster_code
         where 1= 1
         <if test="searchVal != null and searchVal != ''">
-            and namespace like concat('%', #{searchVal}, '%')
+            and p.namespace like concat('%', #{searchVal}, '%')
         </if>
-        order by update_time desc
+        order by p.update_time desc
     </select>
 
     <select id="existNamespace" resultType="java.lang.Boolean">
@@ -45,8 +49,8 @@
         <if test="namespace != null and namespace != ''">
             and namespace = #{namespace}
         </if>
-        <if test="k8s != null and k8s != ''">
-            and k8s =#{k8s}
+        <if test="clusterCode != null and clusterCode != ''">
+            and cluster_code =#{clusterCode}
         </if>
     </select>
 
@@ -76,4 +80,10 @@
         on b.id = a.namespace_id
         where b.id is not null
     </select>
-</mapper>
+    <select id="queryByNamespaceCode" 
resultType="org.apache.dolphinscheduler.dao.entity.K8sNamespace">
+        select
+        <include refid="baseSql"/>
+        from t_ds_k8s_namespace
+        where code = #{namespaceCode}
+    </select>
+</mapper>
\ No newline at end of file
diff --git 
a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_h2.sql 
b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_h2.sql
index 134d31644b..18e6efb61c 100644
--- a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_h2.sql
+++ b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_h2.sql
@@ -1907,35 +1907,34 @@ CREATE TABLE t_ds_k8s
 DROP TABLE IF EXISTS t_ds_k8s_namespace;
 CREATE TABLE t_ds_k8s_namespace (
     id                 int(11) NOT NULL AUTO_INCREMENT ,
+    code               bigint(20) NOT NULL,
     limits_memory      int(11) DEFAULT NULL,
     namespace          varchar(100) DEFAULT NULL,
-    online_job_num     int(11) DEFAULT NULL,
     user_id            int(11) DEFAULT NULL,
     pod_replicas       int(11) DEFAULT NULL,
     pod_request_cpu    decimal(14,3) DEFAULT NULL,
     pod_request_memory int(11) DEFAULT NULL,
     limits_cpu         decimal(14,3) DEFAULT NULL,
-    k8s                varchar(100) DEFAULT NULL,
+    cluster_code       bigint(20) NOT NULL,
     create_time        datetime DEFAULT NULL ,
     update_time        datetime DEFAULT NULL ,
     PRIMARY KEY (id) ,
-    UNIQUE KEY k8s_namespace_unique (namespace,k8s)
+    UNIQUE KEY k8s_namespace_unique (namespace,cluster_code)
 );
-
 -- ----------------------------
 -- Records of t_ds_k8s_namespace
 -- ----------------------------
 INSERT INTO `t_ds_k8s_namespace`
-(`id`,`limits_memory`,`namespace`,`online_job_num`,`user_id`,`pod_replicas`,`pod_request_cpu`,`pod_request_memory`,`limits_cpu`,`k8s`,`create_time`,`update_time`)
-VALUES (1, 1000, 'flink_test', 99, 1, 1, 0.1, 1, NULL, 'ds_null_k8s',  
'2022-03-03 11:31:24.0', '2022-03-03 11:31:24.0');
+(`id`,`code`,`limits_memory`,`namespace`,`user_id`,`pod_replicas`,`pod_request_cpu`,`pod_request_memory`,`limits_cpu`,`cluster_code`,`create_time`,`update_time`)
+VALUES (1, 990001, 1000, 'flink_test', 1, 1, 0.1, 1, 100, 0, '2022-03-03 
11:31:24.0', '2022-03-03 11:31:24.0');
 
 INSERT INTO `t_ds_k8s_namespace`
-(`id`,`limits_memory`,`namespace`,`online_job_num`,`user_id`,`pod_replicas`,`pod_request_cpu`,`pod_request_memory`,`limits_cpu`,`k8s`,`create_time`,`update_time`)
-VALUES (2, 500, 'spark_test', 90, 2,1,10000,1, NULL, 'ds_null_k8s', 
'2021-03-03 11:31:24.0', '2021-03-03 11:31:24.0');
+(`id`,`code`,`limits_memory`,`namespace`,`user_id`,`pod_replicas`,`pod_request_cpu`,`pod_request_memory`,`limits_cpu`,`cluster_code`,`create_time`,`update_time`)
+VALUES (2, 990002, 500, 'spark_test', 2, 1, 10000, 1, 100, 0, '2021-03-03 
11:31:24.0', '2021-03-03 11:31:24.0');
 
 INSERT INTO `t_ds_k8s_namespace`
-(`id`,`limits_memory`,`namespace`,`online_job_num`,`user_id`,`pod_replicas`,`pod_request_cpu`,`pod_request_memory`,`limits_cpu`,`k8s`,`create_time`,`update_time`)
-VALUES (3, 200, 'auth_test', 68, 3,1,100,1, 10000, 'ds_null_k8s', '2020-03-03 
11:31:24.0', '2020-03-03 11:31:24.0');
+(`id`,`code`,`limits_memory`,`namespace`,`user_id`,`pod_replicas`,`pod_request_cpu`,`pod_request_memory`,`limits_cpu`,`cluster_code`,`create_time`,`update_time`)
+VALUES (3, 990003, 200, 'auth_test', 3, 1, 100, 1, 10000, 0, '2020-03-03 
11:31:24.0', '2020-03-03 11:31:24.0');
 
 -- ----------------------------
 -- Table structure for t_ds_relation_namespace_user
@@ -1990,4 +1989,4 @@ CREATE TABLE t_ds_cluster
 
 INSERT INTO `t_ds_cluster`
 
(`id`,`code`,`name`,`config`,`description`,`operator`,`create_time`,`update_time`)
-VALUES (100, 100, 'ds_null_k8s', '{"k8s":"ds_null_k8s"}', 'test', 1, 
'2021-03-03 11:31:24.0', '2021-03-03 11:31:24.0');
+VALUES (100, 0, 'ds_null_k8s', '{"k8s":"ds_null_k8s"}', 'test', 1, '2021-03-03 
11:31:24.0', '2021-03-03 11:31:24.0');
diff --git 
a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_mysql.sql 
b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_mysql.sql
index 62ebe62038..714d32a121 100644
--- a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_mysql.sql
+++ b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_mysql.sql
@@ -1901,19 +1901,19 @@ CREATE TABLE `t_ds_k8s` (
 DROP TABLE IF EXISTS `t_ds_k8s_namespace`;
 CREATE TABLE `t_ds_k8s_namespace` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
+  `code` bigint(20) NOT NULL DEFAULT '0',
   `limits_memory` int(11) DEFAULT NULL,
   `namespace` varchar(100) DEFAULT NULL,
-  `online_job_num` int(11) DEFAULT NULL,
   `user_id` int(11) DEFAULT NULL,
   `pod_replicas` int(11) DEFAULT NULL,
   `pod_request_cpu` decimal(14,3) DEFAULT NULL,
   `pod_request_memory` int(11) DEFAULT NULL,
   `limits_cpu` decimal(14,3) DEFAULT NULL,
-  `k8s` varchar(100) DEFAULT NULL,
+  `cluster_code` bigint(20) NOT NULL DEFAULT '0',
   `create_time` datetime DEFAULT NULL COMMENT 'create time',
   `update_time` datetime DEFAULT NULL COMMENT 'update time',
   PRIMARY KEY (`id`),
-  UNIQUE KEY `k8s_namespace_unique` (`namespace`,`k8s`)
+  UNIQUE KEY `k8s_namespace_unique` (`namespace`,`cluster_code`)
 ) ENGINE= INNODB AUTO_INCREMENT= 1 DEFAULT CHARSET= utf8;
 
 -- ----------------------------
diff --git 
a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_postgresql.sql 
b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_postgresql.sql
index 148d04c2cd..27b5e80d89 100644
--- 
a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_postgresql.sql
+++ 
b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_postgresql.sql
@@ -1900,21 +1900,22 @@ CREATE TABLE t_ds_k8s (
 DROP TABLE IF EXISTS t_ds_k8s_namespace;
 CREATE TABLE t_ds_k8s_namespace (
    id serial NOT NULL,
+   code               bigint  NOT NULL,
    limits_memory      int DEFAULT NULL ,
    namespace          varchar(100) DEFAULT NULL ,
-   online_job_num     int DEFAULT '0' ,
    user_id            int DEFAULT NULL,
    pod_replicas       int DEFAULT NULL,
    pod_request_cpu    NUMERIC(13,4) NULL,
    pod_request_memory int DEFAULT NULL,
    limits_cpu         NUMERIC(13,4) NULL,
-   k8s                varchar(100) DEFAULT NULL,
+   cluster_code       bigint  NOT NULL,
    create_time        timestamp DEFAULT NULL ,
    update_time        timestamp DEFAULT NULL ,
    PRIMARY KEY (id) ,
-   CONSTRAINT k8s_namespace_unique UNIQUE (namespace,k8s)
+   CONSTRAINT k8s_namespace_unique UNIQUE (namespace,cluster_code)
 );
 
+
 --
 -- Table structure for table t_ds_relation_namespace_user
 --
diff --git 
a/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.0.0_schema/mysql/dolphinscheduler_ddl.sql
 
b/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.0.0_schema/mysql/dolphinscheduler_ddl.sql
index 081e12f1f8..f46f1c7e5e 100644
--- 
a/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.0.0_schema/mysql/dolphinscheduler_ddl.sql
+++ 
b/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.0.0_schema/mysql/dolphinscheduler_ddl.sql
@@ -266,19 +266,19 @@ CREATE TABLE `t_ds_k8s` (
 DROP TABLE IF EXISTS `t_ds_k8s_namespace`;
 CREATE TABLE `t_ds_k8s_namespace` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
+  `code` bigint(20) NOT NULL DEFAULT '0',
   `limits_memory` int(11) DEFAULT NULL,
   `namespace` varchar(100) DEFAULT NULL,
-  `online_job_num` int(11) DEFAULT NULL,
   `user_id` int(11) DEFAULT NULL,
   `pod_replicas` int(11) DEFAULT NULL,
   `pod_request_cpu` decimal(14,3) DEFAULT NULL,
   `pod_request_memory` int(11) DEFAULT NULL,
   `limits_cpu` decimal(14,3) DEFAULT NULL,
-  `k8s` varchar(100) DEFAULT NULL,
+  `cluster_code` bigint(20) NOT NULL DEFAULT '0',
   `create_time` datetime DEFAULT NULL COMMENT 'create time',
   `update_time` datetime DEFAULT NULL COMMENT 'update time',
   PRIMARY KEY (`id`),
-  UNIQUE KEY `k8s_namespace_unique` (`namespace`,`k8s`)
+  UNIQUE KEY `k8s_namespace_unique` (`namespace`,`cluster_code`)
 ) ENGINE= INNODB AUTO_INCREMENT= 1 DEFAULT CHARSET= utf8;
 
 -- ----------------------------
diff --git 
a/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.0.0_schema/postgresql/dolphinscheduler_ddl.sql
 
b/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.0.0_schema/postgresql/dolphinscheduler_ddl.sql
index c00c7deadc..8712a6a1e0 100644
--- 
a/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.0.0_schema/postgresql/dolphinscheduler_ddl.sql
+++ 
b/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.0.0_schema/postgresql/dolphinscheduler_ddl.sql
@@ -242,19 +242,19 @@ EXECUTE 'CREATE TABLE IF NOT EXISTS '|| 
quote_ident(v_schema) ||'."t_ds_k8s" (
 
 EXECUTE 'CREATE TABLE IF NOT EXISTS '|| quote_ident(v_schema) 
||'."t_ds_k8s_namespace" (
    id serial NOT NULL,
+   code       bigint  NOT NULL,
    limits_memory      int DEFAULT NULL ,
    namespace          varchar(100) DEFAULT NULL ,
-   online_job_num     int DEFAULT NULL,
    user_id            int DEFAULT NULL,
    pod_replicas       int DEFAULT NULL,
    pod_request_cpu    NUMERIC(13,4) NULL,
    pod_request_memory int DEFAULT NULL,
    limits_cpu         NUMERIC(13,4) NULL,
-   k8s                varchar(100) DEFAULT NULL,
+   cluster_code       bigint  NOT NULL,
    create_time        timestamp DEFAULT NULL ,
    update_time        timestamp DEFAULT NULL ,
    PRIMARY KEY (id) ,
-   CONSTRAINT k8s_namespace_unique UNIQUE (namespace,k8s)
+   CONSTRAINT k8s_namespace_unique UNIQUE (namespace,cluster_code)
 )';
 
 EXECUTE 'CREATE TABLE IF NOT EXISTS '|| quote_ident(v_schema) 
||'."t_ds_relation_namespace_user" (
diff --git 
a/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/K8sNamespaceMapperTest.java
 
b/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/K8sNamespaceMapperTest.java
index 75946f8aee..74b2887c63 100644
--- 
a/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/K8sNamespaceMapperTest.java
+++ 
b/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/K8sNamespaceMapperTest.java
@@ -23,7 +23,6 @@ import org.apache.dolphinscheduler.dao.entity.K8sNamespace;
 import java.util.Date;
 import java.util.List;
 
-import org.apache.dolphinscheduler.dao.entity.User;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
@@ -46,13 +45,14 @@ public class K8sNamespaceMapperTest extends BaseDaoTest {
     private K8sNamespace insertOne() {
         //insertOne
         K8sNamespace k8sNamespace = new K8sNamespace();
+        k8sNamespace.setCode(999L);
         k8sNamespace.setNamespace("testNamespace");
-        k8sNamespace.setK8s("ds_null_k8s");
+        k8sNamespace.setClusterCode(100L);
+        k8sNamespace.setClusterName("ds_null_k8s");
         k8sNamespace.setLimitsCpu(100.0);
         k8sNamespace.setLimitsMemory(100);
         k8sNamespace.setCreateTime(new Date());
         k8sNamespace.setUpdateTime(new Date());
-        k8sNamespace.setId(1);
         k8sNamespaceMapper.insert(k8sNamespace);
         return k8sNamespace;
     }
diff --git a/dolphinscheduler-ui/src/locales/en_US/security.ts 
b/dolphinscheduler-ui/src/locales/en_US/security.ts
index cde8692d9b..2dbb66fe84 100644
--- a/dolphinscheduler-ui/src/locales/en_US/security.ts
+++ b/dolphinscheduler-ui/src/locales/en_US/security.ts
@@ -269,8 +269,6 @@ export default {
     k8s_namespace_tips: 'Please enter k8s namespace',
     k8s_cluster: 'K8S Cluster',
     k8s_cluster_tips: 'Please enter k8s cluster',
-    owner: 'Owner',
-    owner_tips: 'Please enter owner',
     limit_cpu: 'Limit CPU',
     limit_cpu_tips: 'Please enter limit CPU',
     limit_memory: 'Limit Memory',
diff --git a/dolphinscheduler-ui/src/locales/zh_CN/security.ts 
b/dolphinscheduler-ui/src/locales/zh_CN/security.ts
index c06129c25f..9135ba78e4 100644
--- a/dolphinscheduler-ui/src/locales/zh_CN/security.ts
+++ b/dolphinscheduler-ui/src/locales/zh_CN/security.ts
@@ -269,8 +269,6 @@ export default {
     k8s_namespace_tips: '请输入k8s命名空间',
     k8s_cluster: 'K8S集群',
     k8s_cluster_tips: '请输入k8s集群',
-    owner: '负责人',
-    owner_tips: '请输入负责人',
     limit_cpu: '最大CPU',
     limit_cpu_tips: '请输入最大CPU',
     limit_memory: '最大内存',
diff --git a/dolphinscheduler-ui/src/service/modules/k8s-namespace/types.ts 
b/dolphinscheduler-ui/src/service/modules/k8s-namespace/types.ts
index a29a1cf51a..7ceae5c86e 100644
--- a/dolphinscheduler-ui/src/service/modules/k8s-namespace/types.ts
+++ b/dolphinscheduler-ui/src/service/modules/k8s-namespace/types.ts
@@ -23,7 +23,7 @@ interface ListReq {
 
 interface K8SReq {
   namespace: string
-  k8s: string
+  clusterCode: string
   owner?: string
   tag?: string
   limitsCpu?: number | string
@@ -49,4 +49,4 @@ interface NamespaceListRes {
   start: number
 }
 
-export { ListReq, K8SReq, NamespaceItem, NamespaceListRes }
+export { ListReq, K8SReq, NamespaceItem, NamespaceListRes }
\ No newline at end of file
diff --git 
a/dolphinscheduler-ui/src/views/security/k8s-namespace-manage/components/k8s-namespace-modal.tsx
 
b/dolphinscheduler-ui/src/views/security/k8s-namespace-manage/components/k8s-namespace-modal.tsx
index 4d7a1e6be2..9992f4353f 100644
--- 
a/dolphinscheduler-ui/src/views/security/k8s-namespace-manage/components/k8s-namespace-modal.tsx
+++ 
b/dolphinscheduler-ui/src/views/security/k8s-namespace-manage/components/k8s-namespace-modal.tsx
@@ -22,7 +22,8 @@ import {
   NFormItem,
   NInput,
   NInputGroup,
-  NInputGroupLabel
+  NInputGroupLabel,
+  NSelect
 } from 'naive-ui'
 import { useModal } from './use-modal'
 import { useI18n } from 'vue-i18n'
@@ -45,13 +46,13 @@ const K8sNamespaceModal = defineComponent({
   },
   emits: ['cancelModal', 'confirmModal'],
   setup(props, ctx) {
-    const { variables, handleValidate } = useModal(props, ctx)
+    const { variables, handleValidate, getListData } = useModal(props, ctx)
     const { t } = useI18n()
 
     const cancelModal = () => {
       if (props.statusRef === 0) {
         variables.model.namespace = ''
-        variables.model.k8s = ''
+        variables.model.clusterCode = ''
         variables.model.limitsCpu = ''
         variables.model.limitsMemory = ''
         variables.model.userId = ''
@@ -64,35 +65,42 @@ const K8sNamespaceModal = defineComponent({
     }
 
     watch(
-      () => props.statusRef,
-      () => {
-        if (props.statusRef === 0) {
-          variables.model.namespace = ''
-          variables.model.k8s = ''
-          variables.model.limitsCpu = ''
-          variables.model.limitsMemory = ''
-          variables.model.userId = ''
-        } else {
+        () => props.showModalRef,
+        () => {
+          props.showModalRef && getListData()
+        }
+    )
+
+    watch(
+        () => props.statusRef,
+        () => {
+          if (props.statusRef === 0) {
+            variables.model.namespace = ''
+            variables.model.clusterCode = ''
+            variables.model.limitsCpu = ''
+            variables.model.limitsMemory = ''
+            variables.model.userId = ''
+          } else {
+            variables.model.id = props.row.id
+            variables.model.namespace = props.row.namespace
+            variables.model.clusterCode = props.row.clusterCode
+            variables.model.limitsCpu = props.row.limitsCpu + ''
+            variables.model.limitsMemory = props.row.limitsMemory + ''
+            variables.model.userId = props.row.userId
+          }
+        }
+    )
+
+    watch(
+        () => props.row,
+        () => {
           variables.model.id = props.row.id
           variables.model.namespace = props.row.namespace
-          variables.model.k8s = props.row.k8s
+          variables.model.clusterCode = props.row.clusterCode
           variables.model.limitsCpu = props.row.limitsCpu + ''
           variables.model.limitsMemory = props.row.limitsMemory + ''
           variables.model.userId = props.row.userId
         }
-      }
-    )
-
-    watch(
-      () => props.row,
-      () => {
-        variables.model.id = props.row.id
-        variables.model.namespace = props.row.namespace
-        variables.model.k8s = props.row.k8s
-        variables.model.limitsCpu = props.row.limitsCpu + ''
-        variables.model.limitsMemory = props.row.limitsMemory + ''
-        variables.model.userId = props.row.userId
-      }
     )
 
     return { t, ...toRefs(variables), cancelModal, confirmModal }
@@ -100,89 +108,80 @@ const K8sNamespaceModal = defineComponent({
   render() {
     const { t } = this
     return (
-      <div>
-        <Modal
-          title={
-            this.statusRef === 0
-              ? t('security.k8s_namespace.create_namespace')
-              : t('security.k8s_namespace.edit_namespace')
-          }
-          show={this.showModalRef}
-          onCancel={this.cancelModal}
-          onConfirm={this.confirmModal}
-          confirmDisabled={!this.model.namespace || !this.model.k8s}
-          confirmLoading={this.saving}
-        >
-          {{
-            default: () => (
-              <NForm
-                model={this.model}
-                rules={this.rules}
-                ref='k8sNamespaceFormRef'
-              >
-                <NFormItem
-                  label={t('security.k8s_namespace.k8s_namespace')}
-                  path='namespace'
-                >
-                  <NInput
-                    
placeholder={t('security.k8s_namespace.k8s_namespace_tips')}
-                    v-model={[this.model.namespace, 'value']}
-                    disabled={this.statusRef !== 0}
-                  />
-                </NFormItem>
-                <NFormItem
-                  label={t('security.k8s_namespace.k8s_cluster')}
-                  path='k8s'
-                >
-                  <NInput
-                    placeholder={t('security.k8s_namespace.k8s_cluster_tips')}
-                    v-model={[this.model.k8s, 'value']}
-                    disabled={this.statusRef !== 0}
-                  />
-                </NFormItem>
-                <NFormItem
-                  label={t('security.k8s_namespace.limit_cpu')}
-                  path='limitsCpu'
-                >
-                  <NInputGroup>
-                    <NInput
-                      placeholder={t('security.k8s_namespace.limit_cpu_tips')}
-                      v-model={[this.model.limitsCpu, 'value']}
-                    />
-                    <NInputGroupLabel>CORE</NInputGroupLabel>
-                  </NInputGroup>
-                </NFormItem>
-                <NFormItem
-                  label={t('security.k8s_namespace.limit_memory')}
-                  path='limitsMemory'
-                >
-                  <NInputGroup>
-                    <NInput
-                      placeholder={t(
-                        'security.k8s_namespace.limit_memory_tips'
-                      )}
-                      v-model={[this.model.limitsMemory, 'value']}
-                    />
-                    <NInputGroupLabel>GB</NInputGroupLabel>
-                  </NInputGroup>
-                </NFormItem>
-                <NFormItem
-                  label={t('security.k8s_namespace.owner')}
-                  path='userId'
-                >
-                  <NInput
-                    placeholder={t('security.k8s_namespace.owner_tips')}
-                    v-model={[this.model.userId, 'value']}
-                    disabled={this.statusRef !== 0}
-                  />
-                </NFormItem>
-              </NForm>
-            )
-          }}
-        </Modal>
-      </div>
+        <div>
+          <Modal
+              title={
+                this.statusRef === 0
+                    ? t('security.k8s_namespace.create_namespace')
+                    : t('security.k8s_namespace.edit_namespace')
+              }
+              show={this.showModalRef}
+              onCancel={this.cancelModal}
+              onConfirm={this.confirmModal}
+              confirmDisabled={!this.model.namespace || 
(this.model.clusterCode == null || this.model.clusterCode === '')}
+              confirmLoading={this.saving}
+          >
+            {{
+              default: () => (
+                  <NForm
+                      model={this.model}
+                      rules={this.rules}
+                      ref='k8sNamespaceFormRef'
+                  >
+                    <NFormItem
+                        label={t('security.k8s_namespace.k8s_namespace')}
+                        path='namespace'
+                    >
+                      <NInput
+                          
placeholder={t('security.k8s_namespace.k8s_namespace_tips')}
+                          v-model={[this.model.namespace, 'value']}
+                          disabled={this.statusRef !== 0}
+                      />
+                    </NFormItem>
+                    <NFormItem
+                        label={t('security.k8s_namespace.k8s_cluster')}
+                        path='clusterCode'
+                    >
+                      <NSelect
+                          
placeholder={t('security.k8s_namespace.k8s_cluster_tips')}
+                          options={this.model.clusterOptions}
+                          v-model={[this.model.clusterCode, 'value']}
+                          disabled={this.statusRef !== 0}
+                      />
+                    </NFormItem>
+                    <NFormItem
+                        label={t('security.k8s_namespace.limit_cpu')}
+                        path='limitsCpu'
+                    >
+                      <NInputGroup>
+                        <NInput
+                            
placeholder={t('security.k8s_namespace.limit_cpu_tips')}
+                            v-model={[this.model.limitsCpu, 'value']}
+                        />
+                        <NInputGroupLabel>CORE</NInputGroupLabel>
+                      </NInputGroup>
+                    </NFormItem>
+                    <NFormItem
+                        label={t('security.k8s_namespace.limit_memory')}
+                        path='limitsMemory'
+                    >
+                      <NInputGroup>
+                        <NInput
+                            placeholder={t(
+                                'security.k8s_namespace.limit_memory_tips'
+                            )}
+                            v-model={[this.model.limitsMemory, 'value']}
+                        />
+                        <NInputGroupLabel>GB</NInputGroupLabel>
+                      </NInputGroup>
+                    </NFormItem>
+                  </NForm>
+              )
+            }}
+          </Modal>
+        </div>
     )
   }
 })
 
-export default K8sNamespaceModal
+export default K8sNamespaceModal
\ No newline at end of file
diff --git 
a/dolphinscheduler-ui/src/views/security/k8s-namespace-manage/components/use-modal.ts
 
b/dolphinscheduler-ui/src/views/security/k8s-namespace-manage/components/use-modal.ts
index 9bebe8ea6d..92248c7175 100644
--- 
a/dolphinscheduler-ui/src/views/security/k8s-namespace-manage/components/use-modal.ts
+++ 
b/dolphinscheduler-ui/src/views/security/k8s-namespace-manage/components/use-modal.ts
@@ -22,10 +22,12 @@ import {
   createK8sNamespace,
   updateK8sNamespace
 } from '@/service/modules/k8s-namespace'
+import { queryAllClusterList } from '@/service/modules/cluster'
+import { useAsyncState } from '@vueuse/core'
 
 export function useModal(
-  props: any,
-  ctx: SetupContext<('cancelModal' | 'confirmModal')[]>
+    props: any,
+    ctx: SetupContext<('cancelModal' | 'confirmModal')[]>
 ) {
   const { t } = useI18n()
 
@@ -34,10 +36,11 @@ export function useModal(
     model: {
       id: ref<number>(-1),
       namespace: ref(''),
-      k8s: ref(''),
+      clusterCode: ref(''),
       userId: ref(''),
       limitsCpu: ref(''),
-      limitsMemory: ref('')
+      limitsMemory: ref(''),
+      clusterOptions: []
     },
     saving: false,
     rules: {
@@ -50,11 +53,11 @@ export function useModal(
           }
         }
       },
-      k8s: {
+      clusterCode: {
         required: true,
         trigger: ['input', 'blur'],
         validator() {
-          if (variables.model.k8s === '') {
+          if (variables.model.clusterCode === '') {
             return new Error(t('security.k8s_namespace.k8s_cluster_tips'))
           }
         }
@@ -70,19 +73,43 @@ export function useModal(
 
     try {
       statusRef === 0
-        ? await submitK8SNamespaceModal()
-        : await updateK8SNamespaceModal()
+          ? await submitK8SNamespaceModal()
+          : await updateK8SNamespaceModal()
       variables.saving = false
     } catch (err) {
       variables.saving = false
     }
   }
 
+  const getListData = () => {
+    const { state } = useAsyncState(
+        queryAllClusterList().then((res: any) => {
+          variables.model.clusterOptions = res
+              .filter((item: any) => {
+                if (item.config) {
+                  const k8s = JSON.parse(item.config).k8s
+                  return !!k8s
+                }
+                return false
+              })
+              .map((item: any) => {
+                return {
+                  label: item.name,
+                  value: item.code
+                }
+              })
+        }),
+        {}
+    )
+
+    return state
+  }
+
   const submitK8SNamespaceModal = () => {
     verifyNamespaceK8s(variables.model).then(() => {
       createK8sNamespace(variables.model).then(() => {
         variables.model.namespace = ''
-        variables.model.k8s = ''
+        variables.model.clusterCode = ''
         variables.model.limitsCpu = ''
         variables.model.limitsMemory = ''
         variables.model.userId = ''
@@ -93,14 +120,15 @@ export function useModal(
 
   const updateK8SNamespaceModal = () => {
     updateK8sNamespace(variables.model, variables.model.id).then(
-      (ignored: any) => {
-        ctx.emit('confirmModal', props.showModalRef)
-      }
+        (ignored: any) => {
+          ctx.emit('confirmModal', props.showModalRef)
+        }
     )
   }
 
   return {
     variables,
-    handleValidate
+    handleValidate,
+    getListData
   }
-}
+}
\ No newline at end of file
diff --git 
a/dolphinscheduler-ui/src/views/security/k8s-namespace-manage/use-table.ts 
b/dolphinscheduler-ui/src/views/security/k8s-namespace-manage/use-table.ts
index 9a857b27d9..b1ddb82507 100644
--- a/dolphinscheduler-ui/src/views/security/k8s-namespace-manage/use-table.ts
+++ b/dolphinscheduler-ui/src/views/security/k8s-namespace-manage/use-table.ts
@@ -50,9 +50,9 @@ export function useTable() {
       getTableData({
         pageSize: variables.pageSize,
         pageNo:
-          variables.tableData.length === 1 && variables.page > 1
-            ? variables.page - 1
-            : variables.page,
+            variables.tableData.length === 1 && variables.page > 1
+                ? variables.page - 1
+                : variables.page,
         searchVal: variables.searchVal
       })
     })
@@ -73,14 +73,9 @@ export function useTable() {
       },
       {
         title: t('security.k8s_namespace.k8s_cluster'),
-        key: 'k8s',
+        key: 'clusterName',
         ...COLUMN_WIDTH_CONFIG['name']
       },
-      {
-        title: t('security.k8s_namespace.owner'),
-        key: 'userId',
-        ...COLUMN_WIDTH_CONFIG['userName']
-      },
       {
         title: t('security.k8s_namespace.limit_cpu'),
         key: 'limitsCpu',
@@ -109,61 +104,61 @@ export function useTable() {
           return h(NSpace, null, {
             default: () => [
               h(
-                NTooltip,
-                {},
-                {
-                  trigger: () =>
-                    h(
-                      NButton,
-                      {
-                        circle: true,
-                        type: 'info',
-                        size: 'small',
-                        onClick: () => {
-                          handleEdit(row)
-                        }
-                      },
-                      {
-                        icon: () =>
-                          h(NIcon, null, { default: () => h(EditOutlined) })
-                      }
-                    ),
-                  default: () => t('security.k8s_namespace.edit')
-                }
-              ),
-              h(
-                NPopconfirm,
-                {
-                  onPositiveClick: () => {
-                    handleDelete(row)
-                  }
-                },
-                {
-                  trigger: () =>
-                    h(
-                      NTooltip,
-                      {},
-                      {
-                        trigger: () =>
-                          h(
+                  NTooltip,
+                  {},
+                  {
+                    trigger: () =>
+                        h(
                             NButton,
                             {
                               circle: true,
-                              type: 'error',
-                              size: 'small'
+                              type: 'info',
+                              size: 'small',
+                              onClick: () => {
+                                handleEdit(row)
+                              }
                             },
                             {
                               icon: () =>
-                                h(NIcon, null, {
-                                  default: () => h(DeleteOutlined)
-                                })
+                                  h(NIcon, null, { default: () => 
h(EditOutlined) })
                             }
-                          ),
-                        default: () => t('security.k8s_namespace.delete')
-                      }
-                    ),
-                  default: () => t('security.k8s_namespace.delete_confirm')
-                }
+                        ),
+                    default: () => t('security.k8s_namespace.edit')
+                  }
+              ),
+              h(
+                  NPopconfirm,
+                  {
+                    onPositiveClick: () => {
+                      handleDelete(row)
+                    }
+                  },
+                  {
+                    trigger: () =>
+                        h(
+                            NTooltip,
+                            {},
+                            {
+                              trigger: () =>
+                                  h(
+                                      NButton,
+                                      {
+                                        circle: true,
+                                        type: 'error',
+                                        size: 'small'
+                                      },
+                                      {
+                                        icon: () =>
+                                            h(NIcon, null, {
+                                              default: () => h(DeleteOutlined)
+                                            })
+                                      }
+                                  ),
+                              default: () => t('security.k8s_namespace.delete')
+                            }
+                        ),
+                    default: () => t('security.k8s_namespace.delete_confirm')
+                  }
               )
             ]
           })
@@ -193,24 +188,24 @@ export function useTable() {
     if (variables.loadingRef) return
     variables.loadingRef = true
     const { state } = useAsyncState(
-      queryNamespaceListPaging({ ...params }).then((res: NamespaceListRes) => {
-        variables.tableData = res.totalList.map((item, unused) => {
-          item.createTime = format(
-            parseTime(item.createTime),
-            'yyyy-MM-dd HH:mm:ss'
-          )
-          item.updateTime = format(
-            parseTime(item.updateTime),
-            'yyyy-MM-dd HH:mm:ss'
-          )
-          return {
-            ...item
-          }
-        }) as any
-        variables.totalPage = res.totalPage
-        variables.loadingRef = false
-      }),
-      {}
+        queryNamespaceListPaging({ ...params }).then((res: NamespaceListRes) 
=> {
+          variables.tableData = res.totalList.map((item, unused) => {
+            item.createTime = format(
+                parseTime(item.createTime),
+                'yyyy-MM-dd HH:mm:ss'
+            )
+            item.updateTime = format(
+                parseTime(item.updateTime),
+                'yyyy-MM-dd HH:mm:ss'
+            )
+            return {
+              ...item
+            }
+          }) as any
+          variables.totalPage = res.totalPage
+          variables.loadingRef = false
+        }),
+        {}
     )
 
     return state
@@ -221,4 +216,4 @@ export function useTable() {
     getTableData,
     createColumns
   }
-}
+}
\ No newline at end of file

Reply via email to