diff --git a/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/controller/K8sDashboardController.java b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/controller/K8sDashboardController.java index 3a77e33ac..928bcb2c7 100644 --- a/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/controller/K8sDashboardController.java +++ b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/controller/K8sDashboardController.java @@ -28,7 +28,7 @@ public class K8sDashboardController extends BaseController { @ApiOperation(value = "获取命名空间列表") @GetMapping("/namespace/list") public GenericsTableDataInfo namespaceList() { - return new GenericsTableDataInfo<>(k8sNamespaceService.getNamespaceDetailList()); + return new GenericsTableDataInfo<>(k8sNamespaceService.getNamespaceDetailList(true)); } @ApiOperation(value = "获取集群节点列表") diff --git a/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/K8sApplication.java b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/K8sApplication.java index 8ef1b7804..357acf7ad 100644 --- a/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/K8sApplication.java +++ b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/K8sApplication.java @@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.List; + @Data @ApiModel("K8S应用") @@ -27,8 +29,13 @@ public class K8sApplication { @ApiModelProperty(value = "副本数量") private Integer replicas; - @ApiModelProperty(value = "有效副本数量") + @ApiModelProperty(value = "有效副本数量(当有效副本数为0时代表应用失败呈现红色;当有效副本数大于0但小于副本数时代表应用部分失败呈现橙色;当有效副本数等于副本数代表应用正常呈现蓝色)") private Integer readyReplicas; + + @ApiModelProperty(value = "Pod选择器") + private String podSelector; + + private List podList; public static String getApplicationFullKind(String kind) { if("DaemonSet".equals(kind)){ return "apps.daemonsets"; diff --git a/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/K8sApplicationPod.java b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/K8sApplicationPod.java new file mode 100644 index 000000000..cdc6ebc05 --- /dev/null +++ b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/K8sApplicationPod.java @@ -0,0 +1,23 @@ +package com.microservices.mon.k8s.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +@Data +@ApiModel("K8S Pod") +public class K8sApplicationPod { + + @ApiModelProperty(value = "Pod Id") + private String id; + + @ApiModelProperty(value = "Pod名称") + private String name; + + @ApiModelProperty(value = "Pod Ip") + private String ip; + + @ApiModelProperty(value = "容器id") + private String containerID; +} diff --git a/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/vo/RancherApplicationVo.java b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/vo/RancherApplicationVo.java index a0d14343a..253cd11a0 100644 --- a/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/vo/RancherApplicationVo.java +++ b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/vo/RancherApplicationVo.java @@ -1,5 +1,8 @@ package com.microservices.mon.k8s.domain.vo; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.microservices.common.core.utils.StringUtils; import com.microservices.common.core.utils.bean.BeanUtils; import com.microservices.mon.k8s.domain.K8sApplication; import lombok.Data; @@ -23,17 +26,29 @@ public class RancherApplicationVo { target.setAlias(metadata.getAnnotations().getString("mon-name")); } target.setName(metadata.getName()); - if("DaemonSet".equals(kind)){ + if ("DaemonSet".equals(kind)) { target.setReplicas(status.getDesiredNumberScheduled()); target.setReadyReplicas(status.getNumberReady()); - }else if("StatefulSet".equals(kind)){ + } else if ("StatefulSet".equals(kind)) { target.setReplicas(status.getReplicas()); target.setReadyReplicas(status.getAvailableReplicas()); - }else{ + } else { target.setReplicas(status.getReplicas()); target.setReadyReplicas(status.getReadyReplicas()); } target.setNamespace(metadata.getNamespace()); + + JSONArray relationships = metadata.getRelationships(); + for (int i = 0; i < relationships.size(); i++) { + JSONObject relationship = relationships.getJSONObject(i); + if (relationship.containsKey("toType") && "pod".equals(relationship.getString("toType"))) { + String selector = relationship.getString("selector"); + if (StringUtils.isNotEmpty(selector) && selector.contains("app=")) { + String appName = selector.substring(selector.indexOf("=") + 1); + target.setPodSelector(appName); + } + } + } return target; } } diff --git a/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/vo/RancherPodVo.java b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/vo/RancherPodVo.java index b00a23fed..12f4382a6 100644 --- a/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/vo/RancherPodVo.java +++ b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/vo/RancherPodVo.java @@ -1,17 +1,33 @@ package com.microservices.mon.k8s.domain.vo; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.microservices.common.core.utils.StringUtils; import com.microservices.common.core.utils.bean.BeanUtils; import com.microservices.mon.k8s.domain.K8sApplication; +import com.microservices.mon.k8s.domain.K8sApplicationPod; import lombok.Data; @Data public class RancherPodVo { // 标识 String id; - // 应用类型 - String kind; // 元数据 RancherMetadataVo metadata; // 状态 RancherPodStateVo status; + + public K8sApplicationPod toK8sApplicationPod() { + K8sApplicationPod target = new K8sApplicationPod(); + BeanUtils.copyProperties(this, target); + target.setIp(status.getPodIP()); + if (metadata != null) { + if (metadata.getAnnotations() != null) { + target.setContainerID(metadata.getAnnotations().getString("cni.projectcalico.org/containerID")); + } + target.setName(metadata.getName()); + } + + return target; + } } diff --git a/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/service/IK8sDashboardService.java b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/service/IK8sDashboardService.java index b07c7a9f0..8b76764a6 100644 --- a/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/service/IK8sDashboardService.java +++ b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/service/IK8sDashboardService.java @@ -6,7 +6,7 @@ import java.util.HashMap; import java.util.List; public interface IK8sDashboardService { - List getNamespaceDetailList(); + List getNamespaceDetailList(boolean needPod); List getClusterNodeList(); diff --git a/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/service/impl/K8SDashboardServiceImpl.java b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/service/impl/K8SDashboardServiceImpl.java index cd5fd5340..1618f0384 100644 --- a/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/service/impl/K8SDashboardServiceImpl.java +++ b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/service/impl/K8SDashboardServiceImpl.java @@ -28,7 +28,7 @@ public class K8SDashboardServiceImpl extends CommonService implements IK8sDashbo private RemoteGatewayService remoteGatewayService; @Override - public List getNamespaceDetailList() { + public List getNamespaceDetailList(boolean needPod) { List rancherApplicationVoList = new ArrayList<>(); //调用rancher远程接口获取所有daemonsets列表 JSONObject daemonsetsJsonObject = remoteRancherService.getK8sDaemonsetsList(cluster_id, SecurityContextHolder.getUserKey()); @@ -51,10 +51,27 @@ public class K8SDashboardServiceImpl extends CommonService implements IK8sDashbo List k8sNamespaceList = getK8sNamespaceList(); for (int i = 0; i < k8sNamespaceList.size(); i++) { K8sNamespace k8sNamespace = k8sNamespaceList.get(i); - k8sNamespace.setApplicationList(k8sApplicationList + List namespaceApplicationList = k8sApplicationList .stream() .filter(k8sApplication -> k8sApplication.getNamespace().equals(k8sNamespace.getName())) - .collect(Collectors.toList())); + .collect(Collectors.toList()); + if (needPod) { + // 获取命名空间下pod列表 + JSONObject podListJson = remoteRancherService.getK8sPodListByNamespace(cluster_id, k8sNamespace.getName(), SecurityContextHolder.getUserKey()); + List rancherPodVoList; + if (podListJson != null && podListJson.containsKey("data")) { + rancherPodVoList = podListJson.getJSONArray("data").toList(RancherPodVo.class); + for (int j = 0; j < namespaceApplicationList.size(); j++) { + K8sApplication k8sApplication = namespaceApplicationList.get(j); + List applicationToPodList = rancherPodVoList.stream() + .filter(rancherPodVo -> rancherPodVo.getMetadata().getLabels().containsKey("app") && rancherPodVo.getMetadata().getLabels().get("app").equals(k8sApplication.getPodSelector())) + .collect(Collectors.toList()); + k8sApplication.setPodList(applicationToPodList.stream().map(RancherPodVo::toK8sApplicationPod).collect(Collectors.toList())); + namespaceApplicationList.set(j, k8sApplication); + } + } + } + k8sNamespace.setApplicationList(namespaceApplicationList); k8sNamespaceList.set(i, k8sNamespace); } return k8sNamespaceList; diff --git a/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/service/impl/MonCommonAsyncServiceImpl.java b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/service/impl/MonCommonAsyncServiceImpl.java index a8e6dafdb..b76ed8a4b 100644 --- a/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/service/impl/MonCommonAsyncServiceImpl.java +++ b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/service/impl/MonCommonAsyncServiceImpl.java @@ -100,7 +100,7 @@ public class MonCommonAsyncServiceImpl extends CommonService implements IMonComm }); CustomExecutorFactory.threadPoolExecutor.execute(() -> { try { - List k8sNamespaceList = k8sDashboardService.getNamespaceDetailList(); + List k8sNamespaceList = k8sDashboardService.getNamespaceDetailList(false); k8sClusterStatus.setMicroserviceApplicationCount(k8sNamespaceList); List namespaceNameList = k8sNamespaceList.stream().map(K8sNamespace::getName).collect(Collectors.toList()); JSONObject microserviceRestartCountTodayJson = remoteGatewayService.getPrometheusQueryRes(PromQLConstant.MICROSERVICE_RESTART_COUNT_TODAY(cluster_id,namespaceNameList), SecurityContextHolder.getUserKey());