Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
T
tke-eos
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
tke-eos
Commits
45eff20d
Commit
45eff20d
authored
Oct 31, 2019
by
智勇
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
自动部署master
parent
e7a773fe
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
172 additions
and
162 deletions
+172
-162
dailySyncDB.js
app/dailySyncDB.js
+60
-0
index.js
app/index.js
+2
-0
namespace.js
app/namespace.js
+0
-64
restartLatest.js
app/restartLatest.js
+32
-11
schedule.js
app/schedule.js
+4
-10
service.js
app/service.js
+7
-30
index.js
middleware/client/index.js
+5
-29
getClient.js
resource/getClient.js
+28
-3
makeResouce.js
resource/makeResouce.js
+18
-0
resourceLimit.js
resource/resourceLimit.js
+15
-15
awaitRequest.js
utils/awaitRequest.js
+1
-0
No files found.
app/dailySyncDB.js
0 → 100644
View file @
45eff20d
const
schedule
=
require
(
'
node-schedule
'
)
const
sleep
=
require
(
'
sleep
'
)
const
logger
=
require
(
'
koa-log4
'
).
getLogger
(
'
dailySyncDB
'
)
const
{
getServicesFormat
,
getAllNamespace
,
}
=
require
(
'
../kubeService/service
'
)
const
getClient
=
require
(
'
../resource/getClient
'
)
const
awaitRequest
=
require
(
'
../utils/awaitRequest
'
)
const
syncDB
=
async
(
cluster
)
=>
{
logger
.
info
(
'
dailySyncDB start
'
)
const
client
=
(
await
getClient
(
cluster
)).
clientInfo
const
ns
=
await
getAllNamespace
(
client
)
// for test
const
testNamespace
=
[
'
fis
'
,
'
arch
'
]
const
nsTest
=
ns
.
namespaces
&&
ns
.
namespaces
.
filter
(
item
=>
testNamespace
.
includes
(
item
.
name
))
for
(
const
namespace
of
nsTest
)
{
// for (const namespace of ns.namespaces) {
const
svcs
=
await
getServicesFormat
(
client
,
namespace
.
name
)
for
(
const
svc
of
svcs
)
{
if
(
svc
.
serviceName
===
'
mysql
'
)
{
const
data
=
{
dbname
:
'
all(no_mall)
'
,
mysqlName
:
'
mysql
'
,
namespace
:
namespace
.
name
,
not_delete_business_data
:
true
,
use_cache
:
true
,
}
const
res
=
await
awaitRequest
({
url
:
'
http://qaapi.liangkebang.com/dbsync/tke
'
,
method
:
'
post
'
,
body
:
JSON
.
stringify
(
data
),
})
if
(
JSON
.
parse
(
res
.
body
).
code
===
'
0000
'
)
{
logger
.
info
(
'
开始同步ns:
'
,
namespace
.
name
)
}
else
{
logger
.
info
(
'
同步ns失败:
'
,
namespace
.
name
,
JSON
.
parse
(
res
.
body
).
data
)
}
sleep
.
msleep
(
2
*
1000
)
break
}
}
}
logger
.
info
(
'
dailySyncDB end
'
)
}
module
.
exports
=
()
=>
{
schedule
.
scheduleJob
(
'
*/2 * * * *
'
,
async
()
=>
{
// schedule.scheduleJob('0 2 * * *', async () => {
try
{
await
syncDB
(
'
qa
'
)
}
catch
(
e
)
{
logger
.
info
(
'
dailySyncDB
'
,
e
)
}
});
}
app/index.js
View file @
45eff20d
...
...
@@ -15,6 +15,7 @@ const tag = require('./tag')
const
cluster
=
require
(
'
./cluster
'
)
const
ingressRoute
=
require
(
'
./ingress
'
)
const
deploy
=
require
(
'
./restartLatest
'
)
// const dailySyncDB = require('./dailySyncDB')
const
client
=
require
(
'
../middleware/client
'
)
const
logFormat
=
'
:req[x-real-ip] :req[x-forwarded-for] - -
'
...
...
@@ -58,6 +59,7 @@ exports.start = function (port) {
// 加载所有路由
loadRoutes
(
router
)
deploy
()
// dailySyncDB()
app
.
use
(
log4js
.
koaLogger
(
log4js
.
getLogger
(
'
http
'
),
{
level
:
'
auto
'
,
format
:
logFormat
}))
app
.
use
(
router
.
routes
())
app
.
listen
(
port
)
...
...
app/namespace.js
View file @
45eff20d
...
...
@@ -31,70 +31,6 @@ router.post('/create', async (ctx) => {
ctx
.
body
=
ctx
.
ok
()
})
// const IMAGES = {
// zookeeper: 'zookeeper:3.4.10',
// rabbitmq: 'rabbitmq:3.6-management',
// mysql: 'mysql:5.7',
// redis: 'ccr.ccs.tencentyun.com/qa-db/redis:v4',
// }
//
// router.post('/init', async (ctx) => {
// const body = ctx.request.body
// await ctx.cluster.namespace_create(body.namespace)
// await ctx.cluster.ingress_create(body.namespace)
//
// async function serviceCreate(element, index) {
// if (index !== 'common') {
// const data = {
// namespace: body.namespace,
// image: `ccr.ccs.tencentyun.com/qa-${index}/${element}:latest`,
// type: index,
// serviceName: element,
// system_name: element,
// }
// const template = templates[index].replace(/{{([A-Za-z0-9_]+)}}/g, function () {
// if (data[arguments[1]] === undefined) {
// throw new Error('缺少模板所需变量')
// }
// return data[arguments[1]]
// })
// const params = yaml.load(template)
// await ctx.cluster.service_create(params, index)
// }
// if (index === 'common') {
// const data = {
// namespace: body.namespace,
// image: IMAGES[element],
// }
// const template = templates[element].replace(/{{([A-Za-z0-9_]+)}}/g, function () {
// if (data[arguments[1]] === undefined) {
// throw new Error('缺少模板所需变量')
// }
// return data[arguments[1]]
// })
// const params = yaml.load(template)
// await ctx.cluster.service_create(params)
// }
// }
//
// for (const index in body.systems) {
// if ({}.hasOwnProperty.call(body.systems, index)) {
// for (const item in body.systems[index]) {
// if ({}.hasOwnProperty.call(body.systems[index], item)) {
// serviceCreate(body.systems[index][item], index)
// }
// }
// }
// }
//
// ctx.body = ctx.ok('正在创建')
// })
//
// router.post('/delete', async (ctx) => {
// await ctx.cluster.namespace_delete(ctx.request.body.name)
// ctx.body = ctx.ok()
// })
//
// function generateUUID() {
// let d = new Date().getTime();
// const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
...
...
app/restartLatest.js
View file @
45eff20d
...
...
@@ -2,28 +2,28 @@ const schedule = require('node-schedule')
const
_
=
require
(
'
lodash
'
)
const
sleep
=
require
(
'
sleep
'
)
const
logger
=
require
(
'
koa-log4
'
).
getLogger
(
'
deployLatest
'
)
const
{
serviceRestart
,
getServicesFormat
,
getAllNamespace
}
=
require
(
'
../kubeService/service
'
)
const
{
serviceRestart
,
getServicesFormat
,
getAllNamespace
,
deployUpdate
,
}
=
require
(
'
../kubeService/service
'
)
const
container
=
require
(
'
../services/tke.containerService
'
).
create
()
const
getClient
=
require
(
'
../resource/getClient
'
)
const
clientNew
=
{}
const
makeResouce
=
require
(
'
./../resource/makeResouce
'
)
const
deploy
=
async
(
cluster
)
=>
{
if
(
!
clientNew
[
cluster
])
{
clientNew
[
cluster
]
=
await
getClient
(
cluster
)
}
logger
.
info
(
'
deployLatest start
'
)
const
client
=
(
await
getClient
(
cluster
)).
clientInfo
const
ns
=
await
getAllNamespace
(
client
)
const
ns
=
await
getAllNamespace
(
clientNew
[
cluster
])
// for test
// const testNamespace = ['fis', 'xyqb2']
// // for test
// const testNamespace = ['fis']
// const nsTest = ns.namespaces && ns.namespaces.filter(item => testNamespace.includes(item.name))
// for (const namespace of nsTest) {
for
(
const
namespace
of
ns
.
namespaces
)
{
logger
.
info
(
'
开始检查ns:
'
,
namespace
.
name
)
const
svcs
=
await
getServicesFormat
(
client
New
[
cluster
]
,
namespace
.
name
)
const
svcs
=
await
getServicesFormat
(
client
,
namespace
.
name
)
for
(
const
svc
of
svcs
)
{
// 重启latest
if
(
svc
.
image
.
indexOf
(
'
latest
'
)
!==
-
1
)
{
logger
.
info
(
'
检查项目
'
,
svc
.
image
)
const
repoName
=
svc
.
image
.
split
(
'
:
'
)[
0
].
split
(
'
/
'
).
slice
(
1
).
join
(
'
/
'
)
...
...
@@ -31,8 +31,29 @@ const deploy = async (cluster) => {
const
latestImageID
=
_
.
get
(
latest
.
tagInfo
,
'
[0].tagId
'
,
''
)
if
(
svc
.
imageID
.
split
(
'
@
'
)[
1
]
!==
latestImageID
)
{
logger
.
info
(
'
latest不一致,部署项目
'
,
namespace
.
name
,
svc
.
podName
)
await
serviceRestart
(
clientNew
[
cluster
],
namespace
.
name
,
svc
.
podName
)
await
serviceRestart
(
client
,
namespace
.
name
,
svc
.
podName
)
}
sleep
.
msleep
(
1000
)
}
// 把master更新部署成lastet
if
(
svc
.
image
.
indexOf
(
'
:master-
'
)
!==
-
1
)
{
logger
.
info
(
'
将master分支
'
,
svc
.
image
,
'
部署成latest
'
)
const
repoName
=
svc
.
image
.
split
(
'
:
'
)[
0
].
split
(
'
/
'
).
slice
(
1
).
join
(
'
/
'
)
let
mock
if
(
svc
.
labels
.
mock
)
{
mock
=
`'
${
svc
.
labels
.
mock
}
'`
}
const
data
=
{
image
:
`
${
repoName
}
:latest`
,
namespace
:
namespace
.
name
,
serviceName
:
repoName
.
split
(
'
/
'
)[
1
],
type
:
svc
.
labels
.
type
,
label
:
svc
.
labels
.
type
,
mock
,
}
const
resources
=
await
makeResouce
(
data
.
serviceName
,
data
.
label
)
data
.
resources
=
resources
await
deployUpdate
(
client
.
clusterInfo
,
client
,
data
)
sleep
.
msleep
(
1000
)
}
}
...
...
app/schedule.js
View file @
45eff20d
...
...
@@ -6,8 +6,6 @@ const Redis = require('ioredis')
const
{
podGetstatus
,
getPods
}
=
require
(
'
../kubeService/service
'
)
const
getClient
=
require
(
'
../resource/getClient
'
)
const
clientNew
=
{}
const
redis
=
new
Redis
(
6380
,
'
172.30.220.22
'
)
const
awaitRequest
=
function
(
options
)
{
return
new
Promise
((
resolve
,
reject
)
=>
{
...
...
@@ -89,10 +87,8 @@ const checkRecoverPod = async () => {
const
podname
=
resKeys
[
i
].
split
(
'
#
'
)[
1
]
// 获取新的状态
if
(
podname
.
indexOf
(
resKeys
[
i
].
split
(
'
#
'
)[
1
])
>
-
1
)
{
if
(
!
clientNew
.
qa
)
{
clientNew
.
qa
=
await
getClient
(
'
qa
'
)
}
const
Pod
=
await
getPods
(
clientNew
.
qa
,
namespace
)
const
client
=
(
await
getClient
(
'
qa
'
)).
clientInfo
const
Pod
=
await
getPods
(
client
,
namespace
)
Pod
.
body
.
items
.
forEach
(
async
(
item
)
=>
{
if
(
item
.
metadata
.
name
.
indexOf
(
podname
)
>
-
1
)
{
if
(
item
.
status
.
conditions
.
length
===
3
)
{
...
...
@@ -124,10 +120,8 @@ const checkRecoverPod = async () => {
});
}
const
checkErrorPod
=
async
()
=>
{
if
(
!
clientNew
.
qa
)
{
clientNew
.
qa
=
await
getClient
(
'
qa
'
)
}
const
listPods
=
await
podGetstatus
(
clientNew
.
qa
)
const
client
=
(
await
getClient
(
'
qa
'
)).
clientInfo
const
listPods
=
await
podGetstatus
(
client
)
listPods
.
body
.
items
.
forEach
((
item
)
=>
{
const
key
=
`
${
item
.
metadata
.
namespace
}
:
${
item
.
metadata
.
name
}
#
${
item
.
metadata
.
labels
[
'
qcloud-app
'
]}
`
item
.
status
.
conditions
.
forEach
(
async
(
value
)
=>
{
...
...
app/service.js
View file @
45eff20d
...
...
@@ -6,7 +6,6 @@ const Redis = require('ioredis')
const
redis
=
new
Redis
(
6380
,
'
172.30.220.22
'
)
const
{
ingressCreate
,
ingressDelete
}
=
require
(
'
../kubeService/ingress
'
)
const
{
defaultConfig
}
=
require
(
'
../resource/resourceLimit
'
)
const
{
getPods
,
serviceCreate
,
...
...
@@ -21,11 +20,10 @@ const {
pvcDelete
,
}
=
require
(
'
../kubeService/service
'
)
const
getClient
=
require
(
'
./../resource/getClient
'
)
const
awaitRequest
=
require
(
'
../utils/awaitRequest
'
)
const
makeResouce
=
require
(
'
./../resource/makeResouce
'
)
const
router
=
new
Router
()
module
.
exports
=
router
const
clientNew
=
{}
router
.
get
(
'
/
'
,
async
(
ctx
)
=>
{
const
data
=
await
getServicesFormat
(
ctx
.
client
,
ctx
.
query
.
namespace
)
ctx
.
body
=
ctx
.
ok
({
...
...
@@ -34,22 +32,6 @@ router.get('/', async (ctx) => {
})
})
// 资源限制
const
makeResouce
=
async
(
serviceName
,
type
)
=>
{
let
resources
=
defaultConfig
[
type
]
const
res
=
await
awaitRequest
({
url
:
`http://127.0.0.1:3003/proconfig/getK8sConf?project_name=
${
serviceName
}
`
,
method
:
'
get
'
,
})
const
mongoResouces
=
JSON
.
parse
(
res
.
body
).
data
if
(
mongoResouces
&&
mongoResouces
.
memLimit
)
{
resources
=
mongoResouces
}
return
resources
}
// // 用于刷 mongo 库
// router.get('/insertData', async (ctx) => {
// const res = await awaitRequest({
...
...
@@ -190,12 +172,10 @@ router.get('/listEnvVars', async (ctx) => {
namespace
=
parmars
.
split
(
'
@
'
)[
0
];
cluster
=
parmars
.
split
(
'
@
'
)[
1
]
}
if
(
!
clientNew
[
cluster
])
{
clientNew
[
cluster
]
=
await
getClient
(
cluster
)
}
const
client
=
(
await
getClient
(
cluster
)).
clientInfo
const
res
=
await
Promise
.
all
([
getPods
(
client
New
[
cluster
]
,
namespace
),
getServices
(
client
New
[
cluster
]
,
namespace
),
getPods
(
client
,
namespace
),
getServices
(
client
,
namespace
),
])
res
[
0
].
body
.
items
.
forEach
(
async
(
item
)
=>
{
...
...
@@ -225,7 +205,6 @@ router.get('/listEnvVars', async (ctx) => {
})
// for container
router
.
get
(
'
/listEnvVarsNew
'
,
async
(
ctx
)
=>
{
const
envVars
=
{}
let
cluster
;
...
...
@@ -238,12 +217,10 @@ router.get('/listEnvVarsNew', async (ctx) => {
namespace
=
parmars
.
split
(
'
@
'
)[
0
];
cluster
=
parmars
.
split
(
'
@
'
)[
1
]
}
if
(
!
clientNew
[
cluster
])
{
clientNew
[
cluster
]
=
await
getClient
(
cluster
)
}
const
client
=
(
await
getClient
(
cluster
)).
clientInfo
const
res
=
await
Promise
.
all
([
getPods
(
client
New
[
cluster
]
,
namespace
),
getServices
(
client
New
[
cluster
]
,
namespace
),
getPods
(
client
,
namespace
),
getServices
(
client
,
namespace
),
])
res
[
0
].
body
.
items
.
forEach
(
async
(
item
)
=>
{
...
...
middleware/client/index.js
View file @
45eff20d
const
Client
=
require
(
'
kubernetes-client
'
).
Client
const
config
=
require
(
'
kubernetes-client
'
).
config
const
awaitRequest
=
require
(
'
../../utils/awaitRequest
'
)
const
getClient
=
require
(
'
../../resource/getClient
'
)
module
.
exports
=
function
client
()
{
const
client
=
{}
const
domain
=
{}
return
async
function
(
ctx
,
next
)
{
const
exclude
=
[
'
/service/listEnvVarsNew
'
,
'
/service/listEnvVars
'
,
'
/service/
insertData
'
,
'
/service/
test
'
,
'
/cluster
'
,
'
/repository
'
,
'
/repository/getTags
'
,
...
...
@@ -19,29 +15,9 @@ module.exports = function client() {
await
next
()
}
else
{
const
cluster
=
ctx
.
request
.
headers
.
cluster
if
(
!
client
[
cluster
])
{
// 请求qa-api
const
res
=
await
awaitRequest
({
url
:
`http://qaapi.liangkebang.com/cluster/list?clusterName=
${
cluster
}
`
,
method
:
'
get
'
,
})
const
ca
=
JSON
.
parse
(
res
.
body
).
data
[
0
]
client
[
cluster
]
=
new
Client
({
config
:
config
.
fromKubeconfig
(
ca
.
clusterCA
),
version
:
'
1.10
'
,
})
let
hosts
=
''
ca
.
hosts
.
forEach
((
item
)
=>
{
hosts
+=
`
${
item
.
value
}
&`
})
domain
[
`
${
cluster
}
domain`
]
=
{
clusterDomain
:
ca
.
clusterDomain
,
cluster
:
ca
.
clusterName
,
hosts
,
}
}
ctx
.
client
=
client
[
cluster
]
ctx
.
cluterParams
=
domain
[
`
${
cluster
}
domain`
]
const
client
=
await
getClient
(
cluster
)
ctx
.
client
=
client
.
clientInfo
ctx
.
cluterParams
=
client
.
clusterInfo
await
next
()
}
}
...
...
resource/getClient.js
View file @
45eff20d
...
...
@@ -2,14 +2,39 @@ const Client = require('kubernetes-client').Client
const
config
=
require
(
'
kubernetes-client
'
).
config
const
awaitRequest
=
require
(
'
../utils/awaitRequest
'
)
module
.
exports
=
async
function
getClient
(
cluster
)
{
const
getClient
=
async
function
(
cluster
)
{
const
res
=
await
awaitRequest
({
url
:
`http://
127.0.0.1:3003
/cluster/list?clusterName=
${
cluster
}
`
,
url
:
`http://
qaapi.liangkebang.com
/cluster/list?clusterName=
${
cluster
}
`
,
method
:
'
get
'
,
})
const
ca
=
JSON
.
parse
(
res
.
body
).
data
[
0
]
return
new
Client
({
const
clientInfo
=
new
Client
({
config
:
config
.
fromKubeconfig
(
ca
.
clusterCA
),
version
:
'
1.10
'
,
})
let
hosts
=
''
ca
.
hosts
.
forEach
((
item
)
=>
{
hosts
+=
`
${
item
.
value
}
&`
})
const
clusterInfo
=
{
clusterDomain
:
ca
.
clusterDomain
,
cluster
:
ca
.
clusterName
,
hosts
,
}
return
{
clientInfo
,
clusterInfo
,
}
}
const
client
=
{}
module
.
exports
=
async
function
(
cluster
)
{
if
(
!
client
[
cluster
])
{
client
[
cluster
]
=
await
getClient
(
cluster
)
}
return
client
[
cluster
]
}
resource/makeResouce.js
0 → 100644
View file @
45eff20d
const
{
defaultConfig
}
=
require
(
'
../resource/resourceLimit
'
)
const
awaitRequest
=
require
(
'
../utils/awaitRequest
'
)
// 资源限制
module
.
exports
=
async
(
serviceName
,
type
)
=>
{
let
resources
=
defaultConfig
[
type
]
const
res
=
await
awaitRequest
({
url
:
`http://qaapi.liangkebang.com/proconfig/getK8sConf?project_name=
${
serviceName
}
`
,
method
:
'
get
'
,
})
const
mongoResouces
=
JSON
.
parse
(
res
.
body
).
data
if
(
mongoResouces
&&
mongoResouces
.
memLimit
)
{
resources
=
mongoResouces
}
return
resources
}
resource/resourceLimit.js
View file @
45eff20d
...
...
@@ -43,31 +43,31 @@ const defaultRedis = {
}
const
defaultUI
=
{
cpuLimit
:
10
,
cpuRequest
:
100
,
memLimit
:
50
,
cpuRequest
:
10
,
cpuLimit
:
100
,
memRequest
:
50
,
memLimit
:
50
,
}
const
defaultNodejs
=
{
cpu
Limi
t
:
20
,
cpu
Reques
t
:
200
,
mem
Limi
t
:
200
,
mem
Reques
t
:
240
,
cpu
Reques
t
:
20
,
cpu
Limi
t
:
200
,
mem
Reques
t
:
200
,
mem
Limi
t
:
240
,
}
const
defaultPython
=
{
cpu
Limi
t
:
20
,
cpu
Reques
t
:
200
,
mem
Limi
t
:
200
,
mem
Reques
t
:
240
,
cpu
Reques
t
:
20
,
cpu
Limi
t
:
200
,
mem
Reques
t
:
200
,
mem
Limi
t
:
240
,
}
const
defaultJava
=
{
cpu
Limi
t
:
100
,
cpu
Reques
t
:
1000
,
mem
Limi
t
:
500
,
mem
Reques
t
:
600
,
cpu
Reques
t
:
100
,
cpu
Limi
t
:
1000
,
mem
Reques
t
:
500
,
mem
Limi
t
:
600
,
}
exports
.
defaultConfig
=
{
...
...
utils/awaitRequest
→
utils/awaitRequest
.js
View file @
45eff20d
...
...
@@ -5,6 +5,7 @@ module.exports = function (options) {
request
(
Object
.
assign
(
options
,
{
headers
:
{
'
Content-Type
'
:
'
application/json;charset=utf-8
'
,
cluster
:
'
qa
'
,
},
}),
(
error
,
res
)
=>
{
if
(
error
)
{
...
...
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