Commit 3af4194d authored by 黎博's avatar 黎博

新增接口

parent 20b7fa3e
package cn.qg.holmes.controller.k8s;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.entity.k8s.DockerProject;
import cn.qg.holmes.service.k8s.DockerProjectService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
@CrossOrigin
@RestController
@RequestMapping("/docker/project")
public class DockerProjectController {
@Autowired
DockerProjectService dockerProjectService;
/**
* 获取docker project列表
* @param pageNum 第几页
* @param pageSize 每页多少个
* @return
*/
@GetMapping("/list")
public JsonResult getDockerProjectList(@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
IPage<DockerProject> dockerProjectIPage = new Page<>(pageNum, pageSize);
IPage projectIPage = dockerProjectService.page(dockerProjectIPage);
Map<String, Object> map = new HashMap<>();
map.put("total", projectIPage.getTotal());
map.put("list", projectIPage.getRecords());
return JsonResult.buildSuccessResult(map);
}
/**
* 新增docker project
* @param dockerProject docker项目实体类
* @return
*/
@PostMapping("/add")
public JsonResult addDockerProject(@RequestBody DockerProject dockerProject) {
return JsonResult.buildSuccessResult(dockerProjectService.save(dockerProject));
}
/**
* 编辑docker project
* @param dockerProject docker项目实体类
* @return
*/
@PostMapping("/edit")
public JsonResult editDockerProject(@RequestBody DockerProject dockerProject) {
return JsonResult.buildSuccessResult(dockerProjectService.saveOrUpdate(dockerProject));
}
/**
* 删除docker project
* @param dockerProjectId 删除id
* @return
*/
@GetMapping("/del")
public JsonResult delDockerProject(@RequestParam Integer dockerProjectId) {
return JsonResult.buildSuccessResult(dockerProjectService.removeById(dockerProjectId));
}
}
......@@ -70,10 +70,17 @@ public class K8sController {
public JsonResult createPod(@RequestBody ServiceCreateVo serviceCreateVo) {
try {
String serviceName = serviceCreateVo.getServiceName();
String type = serviceCreateVo.getType();
QueryWrapper<DockerProject> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("project_name", serviceName);
DockerProject dockerProject = dockerProjectService.getOne(queryWrapper);
if (type.equals("java")) {
tkeService.createJavaDeployment(serviceCreateVo, dockerProject);
} else if (type.equals("ui") || type.equals("node")) {
tkeService.createUIAndNodeDeployment(serviceCreateVo, dockerProject);
} else {
return JsonResult.buildErrorStateResult("暂不支持!", false);
}
return JsonResult.buildSuccessResult("pod创建成功!");
} catch (Exception e) {
e.printStackTrace();
......@@ -92,6 +99,18 @@ public class K8sController {
return JsonResult.buildSuccessResult(tkeService.resetPod(namespace, podName));
}
/**
* 更新部署
* @param namespace 环境
* @param serviceName 服务名
* @param image 镜像名
* @return
*/
@PostMapping("/pod/modify")
public JsonResult modifyPod(String namespace, String serviceName, String image) {
return JsonResult.buildSuccessResult(tkeService.updateDeployment(namespace, serviceName, image));
}
/**
* 删除pod
* @param namespace 环境
......
package cn.qg.holmes.entity.k8s;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
......@@ -24,19 +25,22 @@ public class DockerProject {
private String hostName;
private String logPath;
private String configPath;
@TableField(value = "`desc`")
private String desc;
@TableField(value = "`owner`")
private String owner;
private String buildCommand;
private String startCommand;
private String stopCommand;
private Integer deployToDocker;
private Integer isActive;
@TableField(value = "`database`")
private String database;
private String ddl;
private String wiki;
private String api;
private String memLimit;
private String menRequest;
private String memRequest;
private String cpuLimit;
private String cpuRequest;
private Integer sonar;
......
......@@ -13,6 +13,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;
import javax.print.Doc;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
......@@ -324,7 +325,7 @@ public class TkeService {
Quantity memoryLimit = new Quantity();
cpuQuantity.setAmount(dockerProject.getCpuRequest());
cpuQuantity.setFormat("m");
memoryQuantity.setAmount(dockerProject.getMenRequest());
memoryQuantity.setAmount(dockerProject.getMemRequest());
memoryQuantity.setFormat("Mi");
cpuLimit.setAmount(dockerProject.getCpuLimit());
cpuLimit.setFormat("m");
......@@ -405,18 +406,237 @@ public class TkeService {
}
/**
* 更新部署pod
* 创建UI或Node 服务
* @param namespace 环境
* @param serviceName
* @param type
* @param image
* @param serviceName 服务名
* @param serviceType 服务类型
* @param label
* @return
*/
public Deployment updateDeployment(String namespace, String serviceName, String type, String image) {
public Service createUIAndNodeService(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);
portList.add(servicePort1);
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);
}
/**
* 部署UI或Node deployment
* @param serviceCreateVo
* @param dockerProject
* @return
*/
public Deployment createUIAndNodeDeployment(ServiceCreateVo serviceCreateVo, DockerProject dockerProject) {
String serviceName = serviceCreateVo.getServiceName();
String namespace = serviceCreateVo.getNamespace();
String label = serviceCreateVo.getLabel();
String image = serviceCreateVo.getImage();
String cluster = serviceCreateVo.getCluster();
String debug = serviceCreateVo.getDebug().toString();
Deployment deployment = new Deployment();
// 设置meta
ObjectMeta objectMeta = new ObjectMeta();
Map<String, String> labelMap = new HashMap<>();
labelMap.put("type", label);
labelMap.put("qcloud-app", serviceName);
objectMeta.setName(serviceName);
objectMeta.setNamespace(namespace);
objectMeta.setLabels(labelMap);
// 设置spec
DeploymentSpec deploymentSpec = new DeploymentSpec();
// 设置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", label);
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/" + image);
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("SYSTEM_NAME");
envVar2.setValue(serviceName);
EnvVar envVar3 = new EnvVar();
envVar3.setName("CLUSTER");
envVar3.setValue(cluster);
EnvVar envVar4 = new EnvVar();
envVar4.setName("NODE_ENV");
envVar4.setValue("test");
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(debug);
envVarList.add(envVar1);
envVarList.add(envVar2);
envVarList.add(envVar3);
envVarList.add(envVar4);
envVarList.add(envVar5);
envVarList.add(envVar6);
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.getMemRequest());
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(100);
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);
// return kubernetesClient.apps().deployments().inNamespace(namespace).withName(serviceName).create();
return null;
// 设置PodTemplateSpec
podTemplateSpec.setMetadata(templateObjectMeta);
podTemplateSpec.setSpec(podSpec);
// 设置Deployment Spec
deploymentSpec.setRevisionHistoryLimit(1);
deploymentSpec.setStrategy(deploymentStrategy);
deploymentSpec.setTemplate(podTemplateSpec);
deploymentSpec.setSelector(labelSelector);
// deployment设置
deployment.setApiVersion("apps/v1");
deployment.setKind("Deployment");
deployment.setMetadata(objectMeta);
deployment.setSpec(deploymentSpec);
return kubernetesClient.apps().deployments().inNamespace(namespace).create(deployment);
}
/**
* 更新部署pod
* @param namespace 环境
* @param serviceName 服务名
* @param image 镜像名
* @return
*/
public Deployment updateDeployment(String namespace, String serviceName, String image) {
Deployment deployment = kubernetesClient.apps().deployments().inNamespace(namespace).withName(serviceName).get();
List<Container> containerList = deployment.getSpec().getTemplate().getSpec().getContainers();
containerList.get(0).setImage("ccr.ccs.tencentyun.com/" + image);
deployment.getSpec().getTemplate().getSpec().setContainers(containerList);
return kubernetesClient.apps().deployments().inNamespace(namespace).withName(serviceName).createOrReplace(deployment);
}
public static void main(String[] args) {
......@@ -454,7 +674,7 @@ public class TkeService {
// dockerProject.setCpuLimit("2000");
// dockerProject.setMemLimit("1000");
// tkeService.createJavaDeployment(serviceCreateVo, dockerProject);
tkeService.updateDeployment("fe", "mo-clotho", "java", "qa-test/mo-clotho:master-20210707143546990");
tkeService.updateDeployment("fe", "mo-clotho", "qa-test/mo-clotho:master-20210707143546990");
}
}
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