Explorar o código

feat: mysql应用以external的service方式暴露

370774330@qq.com %!s(int64=5) %!d(string=hai) anos
pai
achega
0832f29d48

+ 2 - 0
api/src/main/java/cn/seecoder/api/k8s/K8sConstants.java

@@ -53,5 +53,7 @@ public class K8sConstants {
 
     public final static String SERVICE_SUFFIX = "-service";
 
+    public final static String EXTERNAL_SERVICE_SUFFIX = "-external-service";
+
     public final static String INGRESS_SUFFIX = "-ingress";
 }

+ 9 - 0
api/src/main/java/cn/seecoder/api/k8s/model/Service.java

@@ -39,6 +39,10 @@ public class Service extends K8sAbstractObject<V1Service> {
     @Builder.Default
     private Map<String, String> selectors = new HashMap<>();
 
+    private String type;
+
+    private String externalName;
+
     public Service(V1Service v1Service) {
         super(v1Service);
         this.servicePorts = v1Service.getSpec().getPorts() == null ? null : v1Service.getSpec().getPorts().stream().map(ServicePort::new).collect(Collectors.toSet());
@@ -57,6 +61,11 @@ public class Service extends K8sAbstractObject<V1Service> {
                 .withSelector(selectors)
                 .withPorts(servicePorts == null ? null : servicePorts.stream().map(ServicePort::toV1ServicePort).collect(Collectors.toList()))
                 .build();
+        //用于跨命名空间访问service
+        if ("ExternalName".equals(type)){
+            serviceSpec.type(type);
+            serviceSpec.externalName(externalName);
+        }
         return serviceSpec;
     }
 

+ 27 - 1
web/src/main/java/cn/seecoder/web/core/pipeline/handler/MysqlDeployHandler.java

@@ -171,6 +171,32 @@ public class MysqlDeployHandler extends AbstractHandler{
         }
         context.appendSuccessResult("K8s Service创建成功: [namespace: " + context.getNamespace() + ", deployName: " + context.getDeployName() + "]");
 
-
+        //4.1 配置external type的 service,使得其可以被devcloud后端访问
+        service = new Service();
+        service.setType("ExternalName");
+        service.setExternalName( context.getDeployName() + K8sConstants.SERVICE_SUFFIX+"."+namespace+".svc.cluster.local");
+        service.setNamespace(context.getNamespace());
+        service.setName(context.getDeployName() + K8sConstants.EXTERNAL_SERVICE_SUFFIX);
+        service.setServicePorts(
+                Collections.singleton(ServicePort.builder().port(port).targetPort(port).build())
+        );
+        //4.2. 创建external service实例
+        try {
+            List<Service> services = serviceApi.getByCondition(K8sObjectRequest.builder()
+                    .namespace(context.getNamespace())
+                    .name(context.getDeployName() + K8sConstants.EXTERNAL_SERVICE_SUFFIX)
+                    .build());
+            if (services.size() == 0) {
+                serviceApi.create(service);
+                log.info("external service创建成功: [namespace: " + context.getNamespace() + ", deployName: " + context.getDeployName() + "]");
+            } else {
+                serviceApi.update(service);
+                log.info("external service更新成功: [namespace: " + context.getNamespace() + ", deployName: " + context.getDeployName() + "]");
+            }
+        } catch (K8sApiException e) {
+            context.appendErrorResult(PipelineException.SERVICE_CREATE_ERROR, e);
+            throw new PipelineException(HttpStatus.SC_SERVICE_UNAVAILABLE, PipelineException.SERVICE_CREATE_ERROR, e);
+        }
+        context.appendSuccessResult("K8s external Service创建成功: [namespace: " + context.getNamespace() + ", deployName: " + context.getDeployName() + "]");
     }
 }