Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
H
holmes
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
QA
holmes
Commits
3af4194d
Commit
3af4194d
authored
Jul 12, 2021
by
黎博
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
新增接口
parent
20b7fa3e
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
322 additions
and
11 deletions
+322
-11
DockerProjectController.java
.../cn/qg/holmes/controller/k8s/DockerProjectController.java
+68
-0
K8sController.java
src/main/java/cn/qg/holmes/controller/k8s/K8sController.java
+20
-1
DockerProject.java
src/main/java/cn/qg/holmes/entity/k8s/DockerProject.java
+5
-1
TkeService.java
src/main/java/cn/qg/holmes/service/k8s/TkeService.java
+229
-9
No files found.
src/main/java/cn/qg/holmes/controller/k8s/DockerProjectController.java
0 → 100644
View file @
3af4194d
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
));
}
}
src/main/java/cn/qg/holmes/controller/k8s/K8sController.java
View file @
3af4194d
...
@@ -70,10 +70,17 @@ public class K8sController {
...
@@ -70,10 +70,17 @@ public class K8sController {
public
JsonResult
createPod
(
@RequestBody
ServiceCreateVo
serviceCreateVo
)
{
public
JsonResult
createPod
(
@RequestBody
ServiceCreateVo
serviceCreateVo
)
{
try
{
try
{
String
serviceName
=
serviceCreateVo
.
getServiceName
();
String
serviceName
=
serviceCreateVo
.
getServiceName
();
String
type
=
serviceCreateVo
.
getType
();
QueryWrapper
<
DockerProject
>
queryWrapper
=
new
QueryWrapper
<>();
QueryWrapper
<
DockerProject
>
queryWrapper
=
new
QueryWrapper
<>();
queryWrapper
.
eq
(
"project_name"
,
serviceName
);
queryWrapper
.
eq
(
"project_name"
,
serviceName
);
DockerProject
dockerProject
=
dockerProjectService
.
getOne
(
queryWrapper
);
DockerProject
dockerProject
=
dockerProjectService
.
getOne
(
queryWrapper
);
if
(
type
.
equals
(
"java"
))
{
tkeService
.
createJavaDeployment
(
serviceCreateVo
,
dockerProject
);
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创建成功!"
);
return
JsonResult
.
buildSuccessResult
(
"pod创建成功!"
);
}
catch
(
Exception
e
)
{
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
e
.
printStackTrace
();
...
@@ -92,6 +99,18 @@ public class K8sController {
...
@@ -92,6 +99,18 @@ public class K8sController {
return
JsonResult
.
buildSuccessResult
(
tkeService
.
resetPod
(
namespace
,
podName
));
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
* 删除pod
* @param namespace 环境
* @param namespace 环境
...
...
src/main/java/cn/qg/holmes/entity/k8s/DockerProject.java
View file @
3af4194d
package
cn
.
qg
.
holmes
.
entity
.
k8s
;
package
cn
.
qg
.
holmes
.
entity
.
k8s
;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
com.baomidou.mybatisplus.annotation.TableField
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
com.fasterxml.jackson.annotation.JsonFormat
;
import
com.fasterxml.jackson.annotation.JsonFormat
;
...
@@ -24,19 +25,22 @@ public class DockerProject {
...
@@ -24,19 +25,22 @@ public class DockerProject {
private
String
hostName
;
private
String
hostName
;
private
String
logPath
;
private
String
logPath
;
private
String
configPath
;
private
String
configPath
;
@TableField
(
value
=
"`desc`"
)
private
String
desc
;
private
String
desc
;
@TableField
(
value
=
"`owner`"
)
private
String
owner
;
private
String
owner
;
private
String
buildCommand
;
private
String
buildCommand
;
private
String
startCommand
;
private
String
startCommand
;
private
String
stopCommand
;
private
String
stopCommand
;
private
Integer
deployToDocker
;
private
Integer
deployToDocker
;
private
Integer
isActive
;
private
Integer
isActive
;
@TableField
(
value
=
"`database`"
)
private
String
database
;
private
String
database
;
private
String
ddl
;
private
String
ddl
;
private
String
wiki
;
private
String
wiki
;
private
String
api
;
private
String
api
;
private
String
memLimit
;
private
String
memLimit
;
private
String
me
n
Request
;
private
String
me
m
Request
;
private
String
cpuLimit
;
private
String
cpuLimit
;
private
String
cpuRequest
;
private
String
cpuRequest
;
private
Integer
sonar
;
private
Integer
sonar
;
...
...
src/main/java/cn/qg/holmes/service/k8s/TkeService.java
View file @
3af4194d
...
@@ -13,6 +13,7 @@ import lombok.extern.slf4j.Slf4j;
...
@@ -13,6 +13,7 @@ import lombok.extern.slf4j.Slf4j;
import
org.springframework.core.io.ClassPathResource
;
import
org.springframework.core.io.ClassPathResource
;
import
org.springframework.stereotype.Component
;
import
org.springframework.stereotype.Component
;
import
javax.print.Doc
;
import
java.io.BufferedReader
;
import
java.io.BufferedReader
;
import
java.io.IOException
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.io.InputStream
;
...
@@ -324,7 +325,7 @@ public class TkeService {
...
@@ -324,7 +325,7 @@ public class TkeService {
Quantity
memoryLimit
=
new
Quantity
();
Quantity
memoryLimit
=
new
Quantity
();
cpuQuantity
.
setAmount
(
dockerProject
.
getCpuRequest
());
cpuQuantity
.
setAmount
(
dockerProject
.
getCpuRequest
());
cpuQuantity
.
setFormat
(
"m"
);
cpuQuantity
.
setFormat
(
"m"
);
memoryQuantity
.
setAmount
(
dockerProject
.
getMe
n
Request
());
memoryQuantity
.
setAmount
(
dockerProject
.
getMe
m
Request
());
memoryQuantity
.
setFormat
(
"Mi"
);
memoryQuantity
.
setFormat
(
"Mi"
);
cpuLimit
.
setAmount
(
dockerProject
.
getCpuLimit
());
cpuLimit
.
setAmount
(
dockerProject
.
getCpuLimit
());
cpuLimit
.
setFormat
(
"m"
);
cpuLimit
.
setFormat
(
"m"
);
...
@@ -405,18 +406,237 @@ public class TkeService {
...
@@ -405,18 +406,237 @@ public class TkeService {
}
}
/**
/**
*
更新部署pod
*
创建UI或Node 服务
* @param namespace 环境
* @param namespace 环境
* @param serviceName
* @param serviceName
服务名
* @param
type
* @param
serviceType 服务类型
* @param
image
* @param
label
* @return
* @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();
// 设置PodTemplateSpec
return
null
;
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
)
{
public
static
void
main
(
String
[]
args
)
{
...
@@ -454,7 +674,7 @@ public class TkeService {
...
@@ -454,7 +674,7 @@ public class TkeService {
// dockerProject.setCpuLimit("2000");
// dockerProject.setCpuLimit("2000");
// dockerProject.setMemLimit("1000");
// dockerProject.setMemLimit("1000");
// tkeService.createJavaDeployment(serviceCreateVo, dockerProject);
// 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"
);
}
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment