Commit 43645596 authored by 黎博's avatar 黎博

新增方法

parent e6a3713d
......@@ -155,6 +155,11 @@
<version>5.4.1</version>
</dependency>
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId>
<version>3.1.305</version>
</dependency>
</dependencies>
......
......@@ -2,7 +2,6 @@ package cn.qg.holmes.controller.effect;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.service.effect.DatabaseSyncService;
import cn.qg.holmes.utils.K8sService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
......
package cn.qg.holmes.controller.k8s;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.utils.K8sService;
import cn.qg.holmes.service.k8s.ImageService;
import cn.qg.holmes.service.k8s.TkeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
......@@ -14,7 +15,10 @@ import java.util.Map;
public class K8sController {
@Autowired
K8sService k8sService;
TkeService tkeService;
@Autowired
ImageService imageService;
/**
* 获取namespace列表
......@@ -22,7 +26,7 @@ public class K8sController {
*/
@GetMapping("/namespace")
public JsonResult getNamespaceList() {
return JsonResult.buildSuccessResult(k8sService.getNamespaceList());
return JsonResult.buildSuccessResult(tkeService.getNamespaceList());
}
/**
......@@ -32,7 +36,44 @@ public class K8sController {
*/
@GetMapping("/pod/list")
public JsonResult getServiceList(@RequestParam String namespace) {
List<Map<String, Object>> podList = k8sService.getPodList(namespace);
List<Map<String, Object>> podList = tkeService.getPodList(namespace);
return JsonResult.buildSuccessResult(podList);
}
/**
* 根据服务名称获取镜像列表
* @param serviceName 服务名称
* @return
*/
@GetMapping("/image/list")
public JsonResult getImageListByServiceName(@RequestParam String serviceName) {
return JsonResult.buildSuccessResult(imageService.getImageListByService(serviceName));
}
@PostMapping("/pod/create")
public JsonResult createPod() {
return null;
}
/**
* 重置pod
* @param namespace 环境
* @param podName podName
* @return
*/
@PostMapping("/pod/redeploy")
public JsonResult resetPodByName(String namespace, String podName) {
return JsonResult.buildSuccessResult(tkeService.resetPod(namespace, podName));
}
/**
* 删除pod
* @param namespace 环境
* @param serviceName 服务名称
* @return
*/
@PostMapping("/pod/delete")
public JsonResult deletePodByName(String namespace, String serviceName) {
return JsonResult.buildSuccessResult(tkeService.deleteService(namespace, serviceName));
}
}
package cn.qg.holmes.entity.k8s;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
@TableName("docker_project")
public class DockerProject {
@TableId(type = IdType.AUTO)
private Integer id;
private String projectName;
private String projectType;
private String gitPath;
private String gitPathGroup;
private String hostName;
private String logPath;
private String configPath;
private String desc;
private String owner;
private String buildCommand;
private String startCommand;
private String stopCommand;
private String deployToDocker;
private Integer isActive;
private String database;
private String ddl;
private String wiki;
private String api;
private String memLimit;
private String menRequest;
private String cpuLimit;
private String cpuRequest;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}
package cn.qg.holmes.entity.k8s;
import lombok.Data;
/**
* 创建服务接口请求实体类
*/
@Data
public class ServiceCreateVo {
private Integer debug;
private Integer mock;
private String domain;
private String image;
private String label;
private String namespace;
private String serviceName;
private String type;
private Integer wechat;
private String cluster;
}
package cn.qg.holmes.service.k8s;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.tcr.v20190924.TcrClient;
import com.tencentcloudapi.tcr.v20190924.models.DescribeImagePersonalRequest;
import com.tencentcloudapi.tcr.v20190924.models.DescribeImagePersonalResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* 镜像仓库相关服务
* @author libo 2021
*/
@Slf4j
@Component
public class ImageService {
private TcrClient tcrClient;
public ImageService() {
try {
Credential credential = new Credential("AKID4rY7wwNphsUcaFsy1pRtKhQvDj4CA3Ac", "YBduRnjgVRGzmagZJbss3Vo58wWCyhgc");
ClientProfile clientProfile = new ClientProfile();
clientProfile.setSignMethod("HmacSHA256");
tcrClient = new TcrClient(credential, "ap-beijing", clientProfile);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 根据服务名获取镜像列表
* @param serviceName 服务名
* @return
*/
public String getImageListByService(String serviceName) {
try {
String repoName = "qa-test/" + serviceName;
DescribeImagePersonalRequest request = new DescribeImagePersonalRequest();
request.setRepoName(repoName);
DescribeImagePersonalResponse response = tcrClient.DescribeImagePersonal(request);
return DescribeImagePersonalResponse.toJsonString(response);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
ImageService imageService = new ImageService();
System.out.println(imageService.getImageListByService("kdsp"));
}
}
package cn.qg.holmes.utils;
package cn.qg.holmes.service.k8s;
import cn.qg.holmes.entity.k8s.DockerProject;
import cn.qg.holmes.entity.k8s.ServiceCreateVo;
import io.fabric8.kubernetes.api.model.*;
import io.fabric8.kubernetes.api.model.apps.DeploymentStrategy;
import io.fabric8.kubernetes.api.model.apps.Deployment;
import io.fabric8.kubernetes.api.model.apps.DeploymentSpec;
import io.fabric8.kubernetes.client.Config;
import io.fabric8.kubernetes.client.DefaultKubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClient;
......@@ -19,11 +24,11 @@ import java.util.Map;
@Slf4j
@Component
public class K8sService {
public class TkeService {
private KubernetesClient kubernetesClient;
public K8sService() {
public TkeService() {
try {
String configYAML = String.join("\n", readConfigFile("kube-config.yml"));
Config config = Config.fromKubeconfig(configYAML);
......@@ -43,7 +48,7 @@ public class K8sService {
* @return
* @throws IOException
*/
public static List<String> readConfigFile(String file) throws IOException {
private static List<String> readConfigFile(String file) throws IOException {
String str = "";
ClassPathResource resource = new ClassPathResource(file);
InputStream in = resource.getInputStream();
......@@ -77,12 +82,11 @@ public class K8sService {
return resultList;
}
public List<Map<String, Object>> getServiceList() {
List<Map<String, Object>> serviceList = new ArrayList<>();
kubernetesClient.services().inNamespace("fe").list();
return null;
}
/**
* 获取运行中的pod列表
* @param namespace 环境
* @return
*/
public List<Map<String, Object>> getPodList(String namespace) {
List<Pod> podList = kubernetesClient.pods().inNamespace(namespace).list().getItems();
List<Map<String, Object>> result = new ArrayList<>();
......@@ -129,8 +133,274 @@ public class K8sService {
return result;
}
/**
* 重置pod
* @param namespace 环境
* @param podName podName
* @return
*/
public boolean resetPod(String namespace, String podName) {
return kubernetesClient.pods().inNamespace(namespace).withName(podName).delete();
}
/**
* 删除一个pod
* @param namespace 环境
* @param serviceName 服务名
* @return
*/
public boolean deleteService(String namespace, String serviceName) {
// 删除service
kubernetesClient.services().inNamespace(namespace).withName(serviceName).delete();
Map<String, String > map = new HashMap<>();
map.put("qcloud-app", serviceName);
LabelSelector labelSelector = new LabelSelector();
labelSelector.setMatchLabels(map);
// 删除deployment
boolean deploymentResult = kubernetesClient.apps().deployments().inNamespace(namespace).withName(serviceName).delete();
// 删除replicationControllers
boolean rpcResult = kubernetesClient.replicationControllers().inNamespace(namespace).withLabelSelector(labelSelector).delete();
// 删除pvc
boolean pvcResult = kubernetesClient.persistentVolumeClaims().inNamespace(namespace).withName(serviceName).delete();
// 删除service
boolean serviceResult = kubernetesClient.services().inNamespace(namespace).withLabelSelector(labelSelector).delete();
// 删除ingress
boolean ingressResult = kubernetesClient.extensions().ingresses().inNamespace(namespace).withName(serviceName).delete();
return deploymentResult && rpcResult && pvcResult && serviceResult && ingressResult;
}
/**
* 部署Java服务
* @return
*/
public Service createJavaService(String namespace, String serviceName, String serviceType, String label) {
Service service = new Service();
ObjectMeta objectMeta = new ObjectMeta();
ServiceSpec serviceSpec = new ServiceSpec();
// 设置meta
Map<String, String> labels = new HashMap<>();
labels.put("type", label);
labels.put("qcloud-app", serviceName);
objectMeta.setName(serviceName);
objectMeta.setNamespace(namespace);
objectMeta.setLabels(labels);
// 设置spec
List<ServicePort> portList = new ArrayList<>();
ServicePort servicePort1 = new ServicePort();
servicePort1.setName("80");
servicePort1.setPort(80);
ServicePort servicePort2 = new ServicePort();
servicePort1.setName("5005");
servicePort1.setPort(5005);
ServicePort servicePort3 = new ServicePort();
servicePort1.setName("20880");
servicePort1.setPort(20880);
portList.add(servicePort1);
portList.add(servicePort2);
portList.add(servicePort3);
Map<String, String> selector = new HashMap<>();
selector.put("qcloud-app", serviceName);
// 设置serviceSpec
serviceSpec.setType(serviceType);
serviceSpec.setPorts(portList);
serviceSpec.setSelector(selector);
// 设置service
service.setApiVersion("v1");
service.setKind("Service");
service.setMetadata(objectMeta);
service.setSpec(serviceSpec);
return kubernetesClient.services().inNamespace(namespace).create(service);
}
/**
* 部署Java Deployment
* @param serviceCreateVo
* @return
*/
public Deployment createJavaDeployment(ServiceCreateVo serviceCreateVo, DockerProject dockerProject) {
String namespace = serviceCreateVo.getNamespace();
String serviceName = serviceCreateVo.getServiceName();
String mock = serviceCreateVo.getMock().toString();
Deployment deployment = new Deployment();
ObjectMeta objectMeta = new ObjectMeta();
DeploymentSpec deploymentSpec = new DeploymentSpec();
// 设置metadata
Map<String, String> labels = new HashMap<>();
labels.put("type", serviceCreateVo.getLabel());
labels.put("qcloud-app", serviceName);
objectMeta.setName(serviceName);
objectMeta.setNamespace(namespace);
objectMeta.setLabels(labels);
// 设置labelSelector
LabelSelector labelSelector = new LabelSelector();
Map<String, String> matchLabels = new HashMap<>();
matchLabels.put("qcloud-app", serviceName);
labelSelector.setMatchLabels(matchLabels);
// 设置strategy
DeploymentStrategy deploymentStrategy = new DeploymentStrategy();
deploymentStrategy.setType("Recreate");
// 设置pod Template
PodTemplateSpec podTemplateSpec = new PodTemplateSpec();
ObjectMeta templateObjectMeta = new ObjectMeta();
Map<String, String> templateLabels = new HashMap<>();
templateLabels.put("qcloud-app", serviceName);
templateLabels.put("type", serviceCreateVo.getLabel());
templateLabels.put("mock", mock);
templateObjectMeta.setLabels(templateLabels);
PodSpec podSpec = new PodSpec();
List<Container> containerList = new ArrayList<>();
Container container = new Container();
container.setName(serviceName);
container.setImage("ccr.ccs.tencentyun.com/" + serviceCreateVo.getImage());
container.setImagePullPolicy("IfNotPresent");
// volumeMounts
List<VolumeMount> volumeMountList = new ArrayList<>();
VolumeMount volumeMount = new VolumeMount();
volumeMount.setName("filelog");
volumeMount.setMountPath("/home/logs");
volumeMountList.add(volumeMount);
container.setVolumeMounts(volumeMountList);
// env
List<EnvVar> envVarList = new ArrayList<>();
EnvVar envVar1 = new EnvVar();
envVar1.setName("NAMESPACE");
envVar1.setValue(namespace);
EnvVar envVar2 = new EnvVar();
envVar2.setName("NAMESPACECLUSTER");
envVar2.setValue(namespace + "@" + serviceCreateVo.getCluster());
EnvVar envVar3 = new EnvVar();
envVar3.setName("CLUSTER");
envVar3.setValue(serviceCreateVo.getCluster());
EnvVar envVar4 = new EnvVar();
envVar4.setName("CLUSTER");
envVar4.setValue(serviceName);
EnvVar envVar5 = new EnvVar();
envVar5.setName("HOSTS");
envVar5.setValue("192.168.4.50=>eos.quantgroups.com&172.17.1.7=>apollo-dev.quantgroups.com&172.20.3.11=>sentry.quantgroups.com&");
EnvVar envVar6 = new EnvVar();
envVar6.setName("DEBUG");
envVar6.setValue(serviceCreateVo.getDebug().toString());
EnvVar envVar7 = new EnvVar();
envVar7.setName("MOCK");
envVar7.setValue(mock);
EnvVar envVar8 = new EnvVar();
EnvVarSource envVarSource = new EnvVarSource();
ObjectFieldSelector objectFieldSelector = new ObjectFieldSelector();
objectFieldSelector.setFieldPath("status.hostIP");
envVarSource.setFieldRef(objectFieldSelector);
envVar8.setName("DUBBO_IP_TO_REGISTRY");
envVar8.setValueFrom(envVarSource);
envVarList.add(envVar1);
envVarList.add(envVar2);
envVarList.add(envVar3);
envVarList.add(envVar4);
envVarList.add(envVar5);
envVarList.add(envVar6);
envVarList.add(envVar7);
envVarList.add(envVar8);
container.setEnv(envVarList);
// resources
ResourceRequirements resourceRequirements = new ResourceRequirements();
Map<String, Quantity> requests = new HashMap<>();
Map<String, Quantity> limits = new HashMap<>();
Quantity cpuQuantity = new Quantity();
Quantity memoryQuantity = new Quantity();
Quantity cpuLimit = new Quantity();
Quantity memoryLimit = new Quantity();
cpuQuantity.setAmount(dockerProject.getCpuRequest());
cpuQuantity.setFormat("m");
memoryQuantity.setAmount(dockerProject.getMenRequest());
memoryQuantity.setFormat("Mi");
cpuLimit.setAmount(dockerProject.getCpuLimit());
cpuLimit.setFormat("m");
memoryLimit.setAmount(dockerProject.getMemLimit());
memoryLimit.setFormat("Mi");
requests.put("cpu", cpuQuantity);
requests.put("memory", memoryQuantity);
resourceRequirements.setRequests(requests);
resourceRequirements.setLimits(limits);
container.setResources(resourceRequirements);
// livenessProbe
Probe livenessProbe = new Probe();
ExecAction execAction = new ExecAction();
List<String> commandList = new ArrayList<>();
commandList.add("/home/quant_group/readyCheck.sh");
execAction.setCommand(commandList);
livenessProbe.setExec(execAction);
livenessProbe.setInitialDelaySeconds(200);
livenessProbe.setSuccessThreshold(1);
livenessProbe.setFailureThreshold(5);
container.setLivenessProbe(livenessProbe);
//readinessProbe
Probe readinessProbe = new Probe();
readinessProbe.setExec(execAction);
readinessProbe.setInitialDelaySeconds(30);
readinessProbe.setTimeoutSeconds(2);
readinessProbe.setPeriodSeconds(5);
container.setReadinessProbe(readinessProbe);
containerList.add(container);
// volumes
List<Volume> volumeList = new ArrayList<>();
Volume volume = new Volume();
HostPathVolumeSource hostPathVolumeSource = new HostPathVolumeSource();
hostPathVolumeSource.setPath("/var/log/containers2/" + namespace + "/" + serviceName);
volume.setName("filelog");
volume.setHostPath(hostPathVolumeSource);
volumeList.add(volume);
// imagePullSecrets
List<LocalObjectReference> referenceList = new ArrayList<>();
LocalObjectReference reference1 = new LocalObjectReference();
LocalObjectReference reference2 = new LocalObjectReference();
reference1.setName("qcloudregistrykey");
reference2.setName("tencenthubkey");
referenceList.add(reference1);
referenceList.add(reference2);
// 设置podSpec
podSpec.setTerminationGracePeriodSeconds(0L);
podSpec.setContainers(containerList);
podSpec.setVolumes(volumeList);
podSpec.setRestartPolicy("Always");
podSpec.setDnsPolicy("ClusterFirst");
podSpec.setImagePullSecrets(referenceList);
// 设置PodTemplateSpec
podTemplateSpec.setMetadata(templateObjectMeta);
podTemplateSpec.setSpec(podSpec);
// 设置Deployment Spec
deploymentSpec.setReplicas(1);
deploymentSpec.setRevisionHistoryLimit(1);
deploymentSpec.setSelector(labelSelector);
deploymentSpec.setStrategy(deploymentStrategy);
deploymentSpec.setTemplate(podTemplateSpec);
// deployment设置
deployment.setApiVersion("apps/v1beta1");
deployment.setKind("Deployment");
deployment.setMetadata(objectMeta);
deployment.setSpec(deploymentSpec);
return kubernetesClient.apps().deployments().inNamespace(namespace).create(deployment);
}
public static void main(String[] args) {
K8sService k8sService = new K8sService();
TkeService tkeService = new TkeService();
// List<Service> serviceList = k8sService.kubernetesClient.services().inNamespace("fe").list().getItems();
// List<Pod> podList = k8sService.kubernetesClient.pods().inNamespace("fe").list().getItems();
// Pod pod = podList.get(22);
......@@ -145,9 +415,11 @@ public class K8sService {
// System.out.println(pod.getSpec().getContainers().get(0).getName());
// System.out.println(serviceList.get(19).getSpec().getPorts());
Service service = k8sService.kubernetesClient.services().inNamespace("fe").withName("holmes").get();
System.out.println(service);
// Service service = k8sService.kubernetesClient.services().inNamespace("fe").withName("holmes").get();
// System.out.println(service);
// System.out.println(k8sService.resetPod("fe", "acm-ui-58864499d9-h47rl"));
tkeService.deleteService("fe", "kdsp");
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment