Commit 0aa9d022 authored by 智勇's avatar 智勇 Committed by kewei.jia

服务接口更新为原生

parent e23f8d6b
const Router = require('koa-router') const Router = require('koa-router')
const yaml = require('js-yaml')
const _ = require('lodash')
const logger = require('koa-log4').getLogger() const logger = require('koa-log4').getLogger()
const templates = require('../serviceTemplate')
const lruCache = require('../services/lruCache.service')
const { ingressCreate, ingressDelete } = require('../kubeService/ingress') const { ingressCreate, ingressDelete } = require('../kubeService/ingress')
const { projectConfig, defaultConfig } = require('../serviceTemplate/resourceLimit') const { projectConfig, defaultConfig } = require('../serviceTemplate/resourceLimit')
const { const {
podGet, serviceCreate, servicesGet, getPods, serviceCreate, getServices, getServiceDetail, serviceUpdate, serviceRestart, serviceDelete,
} = require('../kubeService/service') } = require('../kubeService/service')
const router = new Router() const router = new Router()
module.exports = router module.exports = router
const serviceListTencent = async (ctx) => {
// 取节点列表的第一个作为服务的访问ip
const cacheKey = 'k8s.nodes.first'
const c = lruCache.get(cacheKey)
let lanIp = lruCache.get(cacheKey)
if (!c) {
const res = await ctx.cluster.node_list()
lanIp = _.get(res, 'nodes[0].lanIp', '')
lruCache.set(cacheKey, lanIp)
}
const data = await ctx.cluster.service_list(ctx.query.namespace)
const podData = await podGet(ctx.query.namespace)
const getDetail = async (item) => {
const resData = await ctx.cluster.service_get(item.serviceName, ctx.query.namespace)
item.image = resData.service.containers[0].image
if (item.userLabels.type === 'base') {
item.portMappings = resData.service.portMappings
const pod = podData.body.items.filter(i => i.metadata.name.indexOf(item.serviceName) !== -1)
lanIp = pod[0].status.hostIP
item.lanIp = lanIp
}
}
const task = []
for (let i = 0; i < data.services.length; i += 1) {
task.push(getDetail(data.services[i]))
}
await Promise.all(task)
ctx.body = ctx.ok(data)
}
router.get('/', async (ctx) => { router.get('/', async (ctx) => {
const data = await servicesGet(ctx.query.namespace) const data = await getServices(ctx.query.namespace)
console.log(1, data)
ctx.body = ctx.ok({ services: data }) ctx.body = ctx.ok({ services: data })
}) })
const createService = async (ctx) => { const makeResouce = (serviceName, type) => {
const {
type, serviceName, namespace, domain, label,
} = ctx.request.body
logger.info('创建服务', ctx.request.body)
// 资源限制 // 资源限制
const resources = projectConfig[serviceName] || defaultConfig[type] const resources = projectConfig[serviceName] || defaultConfig[type]
logger.info('资源限制', JSON.stringify(resources)) logger.info('资源限制', JSON.stringify(resources))
return resources
const data = ctx.request.body
data.resources = resources
await serviceCreate(data)
if (label !== 'base') {
if (serviceName === 'xyqb-user2') {
await ingressCreate(namespace, 'xyqb-user2-2', 'passportapi2')
}
await ingressCreate(namespace, serviceName, domain)
}
ctx.body = ctx.ok('创建成功')
} }
const createServiceTencent = async (ctx) => { const createService = async (ctx) => {
const { const {
type, serviceName, namespace, system_name, domain, label, type, serviceName, namespace, domain, label,
} = ctx.request.body } = ctx.request.body
logger.info('创建服务', ctx.request.body)
// 资源限制
const resources = projectConfig[serviceName] || defaultConfig[type]
logger.info('资源限制', JSON.stringify(resources))
const data = ctx.request.body const data = ctx.request.body
const resources = makeResouce(serviceName, type)
data.resources = resources data.resources = resources
if (!system_name) { logger.info('创建服务', data)
// ui abTest的时候不一样 await serviceCreate(data)
data.system_name = serviceName
}
const template = templates[type].replace(/{{([A-Za-z0-9_\.]+)}}/g, function () {
if (_.get(data, arguments[1], null) === null) {
throw new Error(`缺少模板所需变量: ${arguments[1]}`)
}
return _.get(data, arguments[1])
})
let params = yaml.load(template)
// todo: 放开限制,暂时只更新了clotho的镜像
// java项目的就绪检查需要定制
if (type === 'java' && data.system_name !== 'clotho') {
params = _.omitBy(params, (value, key) => key.indexOf('healthCheck') !== -1)
}
logger.info(params)
await ctx.cluster.service_create(params, label)
if (label !== 'base') { if (label !== 'base') {
if (serviceName === 'xyqb-user2') { if (serviceName === 'xyqb-user2') {
await ingressCreate(namespace, 'xyqb-user2-2', 'passportapi2') await ingressCreate(namespace, 'xyqb-user2-2', 'passportapi2')
...@@ -129,17 +52,13 @@ router.post('/details', async (ctx) => { ...@@ -129,17 +52,13 @@ router.post('/details', async (ctx) => {
namespace: ctx.Joi.string().required(), namespace: ctx.Joi.string().required(),
})) }))
const podData = await podGet(ctx.request.body.namespace) const data = await getServiceDetail(ctx.request.body.namespace, ctx.request.body.serviceName)
// const lanIp = podData.body.items.filter(i => i.metadata.name.indexOf(ctx.request.body.serviceName) !== -1)[0].status.hostIP ctx.body = ctx.ok(data)
const serviceItems = podData.body.items.filter(i => i.metadata.name.indexOf(ctx.request.body.serviceName) !== -1)
const lanIp = _.get(serviceItems, '[0].status.hostIP', '')
const data = await ctx.cluster.service_get(ctx.request.body.serviceName, ctx.request.body.namespace)
ctx.body = ctx.ok(Object.assign({}, data, { lanIp }))
}) })
router.post('/delete', async (ctx) => { router.post('/delete', async (ctx) => {
await ctx.cluster.service_delete(ctx.request.body.serviceName, ctx.request.body.namespace) const rsName = ctx.request.body.podName.slice(0, -6)
await serviceDelete(ctx.request.body.namespace, ctx.request.body.serviceName, rsName)
if (ctx.request.body.serviceName === 'xyqb-user2') { if (ctx.request.body.serviceName === 'xyqb-user2') {
await ingressDelete(ctx.request.body.namespace, 'xyqb-user2-2') await ingressDelete(ctx.request.body.namespace, 'xyqb-user2-2')
} }
...@@ -148,22 +67,26 @@ router.post('/delete', async (ctx) => { ...@@ -148,22 +67,26 @@ router.post('/delete', async (ctx) => {
}) })
router.post('/modifyImage', async (ctx) => { router.post('/modifyImage', async (ctx) => {
let list = await ctx.cluster.service_list(ctx.request.body.namespace) let list = await getPods(ctx.request.body.namespace)
list = list.services.map(item => item.serviceName) list = list.map(item => (item.metadata.labels && item.metadata.labels['qcloud-app']) || item.metadata.name)
if (list.includes(ctx.request.body.serviceName)) { if (list.includes(ctx.request.body.serviceName)) {
await ctx.cluster.service_modifyImage(ctx.request.body.serviceName, ctx.request.body.image, ctx.request.body.namespace) const data = ctx.request.body
if (!data.label) {
data.label = data.type
}
const resources = makeResouce(data.serviceName, data.label)
data.resources = resources
logger.info('更新服务', data)
await serviceUpdate(data)
} else { } else {
await createService(ctx) await createService(ctx)
} }
ctx.body = ctx.ok('更新成功') ctx.body = ctx.ok('更新成功')
}) })
router.post('/instance', async (ctx) => {
const data = await ctx.cluster.instance_get(ctx.request.body.serviceName, ctx.request.body.namespace)
ctx.body = ctx.ok(data)
})
router.post('/redeploy', async (ctx) => { router.post('/redeploy', async (ctx) => {
await ctx.cluster.service_redeployment(ctx.request.body.serviceName, ctx.request.body.namespace) await serviceRestart(ctx.request.body.namespace, ctx.request.body.podName)
ctx.body = ctx.ok('服务重部署成功') ctx.body = ctx.ok('重置服务成功')
}) })
const Router = require('koa-router')
const yaml = require('js-yaml')
const _ = require('lodash')
const logger = require('koa-log4').getLogger()
const templates = require('../serviceTemplate')
const lruCache = require('../services/lruCache.service')
const { ingressCreate, ingressDelete } = require('../kubeService/ingress')
const { projectConfig, defaultConfig } = require('../serviceTemplate/resourceLimit')
const { podGet, serviceCreate } = require('../kubeService/service')
const router = new Router()
module.exports = router
router.get('/', async (ctx) => {
// 取节点列表的第一个作为服务的访问ip
const cacheKey = 'k8s.nodes.first'
const c = lruCache.get(cacheKey)
let lanIp = lruCache.get(cacheKey)
if (!c) {
const res = await ctx.cluster.node_list()
lanIp = _.get(res, 'nodes[0].lanIp', '')
lruCache.set(cacheKey, lanIp)
}
const data = await ctx.cluster.service_list(ctx.query.namespace)
const podData = await podGet(ctx.query.namespace)
const getDetail = async (item) => {
const resData = await ctx.cluster.service_get(item.serviceName, ctx.query.namespace)
item.image = resData.service.containers[0].image
if (item.userLabels.type === 'base') {
item.portMappings = resData.service.portMappings
const pod = podData.body.items.filter(i => i.metadata.name.indexOf(item.serviceName) !== -1)
lanIp = pod[0].status.hostIP
item.lanIp = lanIp
}
}
const task = []
for (let i = 0; i < data.services.length; i += 1) {
task.push(getDetail(data.services[i]))
}
await Promise.all(task)
ctx.body = ctx.ok(data)
})
const createService = async (ctx) => {
const {
type, serviceName, namespace, image, system_name, domain, label, debug,
} = ctx.request.body
logger.info('创建服务', ctx.request.body)
if (label === 'base') {
await serviceCreate(namespace, serviceName, image, label)
ctx.body = ctx.ok('创建成功')
return
}
const data = {
serviceName,
namespace,
image,
system_name,
debug,
}
if (!system_name) {
// ui abTest的时候不一样
data.system_name = serviceName
}
// 资源限制
const resources = projectConfig[data.system_name] || defaultConfig[type]
logger.info('资源限制', JSON.stringify(resources))
data.resources = resources
const template = templates[type].replace(/{{([A-Za-z0-9_\.]+)}}/g, function () {
if (_.get(data, arguments[1], null) === null) {
throw new Error(`缺少模板所需变量: ${arguments[1]}`)
}
return _.get(data, arguments[1])
})
let params = yaml.load(template)
// todo: 放开限制,暂时只更新了clotho的镜像
// java项目的就绪检查需要定制
if (type === 'java' && data.system_name !== 'clotho') {
params = _.omitBy(params, (value, key) => key.indexOf('healthCheck') !== -1)
}
logger.info(params)
await ctx.cluster.service_create(params, label)
if (label !== 'base') {
if (serviceName === 'xyqb-user2') {
await ingressCreate(namespace, 'xyqb-user2-2', 'passportapi2')
}
await ingressCreate(namespace, serviceName, domain)
}
ctx.body = ctx.ok('创建成功')
}
router.post('/create', async (ctx) => {
await createService(ctx)
})
router.post('/details', async (ctx) => {
ctx.validate(ctx.Joi.object().keys({
serviceName: ctx.Joi.string().required(),
namespace: ctx.Joi.string().required(),
}))
const podData = await podGet(ctx.request.body.namespace)
// const lanIp = podData.body.items.filter(i => i.metadata.name.indexOf(ctx.request.body.serviceName) !== -1)[0].status.hostIP
const serviceItems = podData.body.items.filter(i => i.metadata.name.indexOf(ctx.request.body.serviceName) !== -1)
const lanIp = _.get(serviceItems, '[0].status.hostIP', '')
const data = await ctx.cluster.service_get(ctx.request.body.serviceName, ctx.request.body.namespace)
ctx.body = ctx.ok(Object.assign({}, data, { lanIp }))
})
router.post('/delete', async (ctx) => {
await ctx.cluster.service_delete(ctx.request.body.serviceName, ctx.request.body.namespace)
if (ctx.request.body.serviceName === 'xyqb-user2') {
await ingressDelete(ctx.request.body.namespace, 'xyqb-user2-2')
}
await ingressDelete(ctx.request.body.namespace, ctx.request.body.serviceName)
ctx.body = ctx.ok('删除成功')
})
router.post('/modifyImage', async (ctx) => {
let list = await ctx.cluster.service_list(ctx.request.body.namespace)
list = list.services.map(item => item.serviceName)
if (list.includes(ctx.request.body.serviceName)) {
await ctx.cluster.service_modifyImage(ctx.request.body.serviceName, ctx.request.body.image, ctx.request.body.namespace)
} else {
await createService(ctx)
}
ctx.body = ctx.ok('更新成功')
})
router.post('/instance', async (ctx) => {
const data = await ctx.cluster.instance_get(ctx.request.body.serviceName, ctx.request.body.namespace)
ctx.body = ctx.ok(data)
})
router.post('/redeploy', async (ctx) => {
await ctx.cluster.service_redeployment(ctx.request.body.serviceName, ctx.request.body.namespace)
ctx.body = ctx.ok('服务重部署成功')
})
const commonService = ['db', 'redis', 'rabbitmq', 'zookeeper', 'kong', 'postgres', 'mongodb']
module.exports = {
commonService,
}
...@@ -15,8 +15,7 @@ const client = new Client({ ...@@ -15,8 +15,7 @@ const client = new Client({
const serviceGet = async (namespace, service) => client.api.v1.namespaces(namespace).services(service).get() const serviceGet = async (namespace, service) => client.api.v1.namespaces(namespace).services(service).get()
const podGet = async namespace => client.api.v1.namespaces(namespace).pods.get() const podGet = async namespace => client.api.v1.namespaces(namespace).pods.get()
const podGetstatus = async () => client.api.v1.pods.get()
const podlog = async (namespace, name) => client.api.v1.namespace(namespace).pods(name).log.get()
const serviceCreate = async (data) => { const serviceCreate = async (data) => {
const { type, namespace, serviceName } = data const { type, namespace, serviceName } = data
const yamlManifest = yamls[type].replace(/{{([A-Za-z0-9_\.]+)}}/g, function () { const yamlManifest = yamls[type].replace(/{{([A-Za-z0-9_\.]+)}}/g, function () {
...@@ -144,7 +143,5 @@ module.exports = { ...@@ -144,7 +143,5 @@ module.exports = {
serviceGet, serviceGet,
servicesGet, servicesGet,
podGet, podGet,
podlog,
serviceCreate, serviceCreate,
podGetstatus,
} }
...@@ -525,11 +525,6 @@ ...@@ -525,11 +525,6 @@
"mimic-response": "^1.0.0" "mimic-response": "^1.0.0"
} }
}, },
"cluster-key-slot": {
"version": "1.0.12",
"resolved": "http://npmprivate.quantgroups.com/cluster-key-slot/-/cluster-key-slot-1.0.12.tgz",
"integrity": "sha512-21O0kGmvED5OJ7ZTdqQ5lQQ+sjuez33R+d35jZKLwqUb5mqcPHUsxOSzj61+LHVtxGZd1kShbQM3MjB/gBJkVg=="
},
"co": { "co": {
"version": "4.6.0", "version": "4.6.0",
"resolved": "http://registry.npm.taobao.org/co/download/co-4.6.0.tgz", "resolved": "http://registry.npm.taobao.org/co/download/co-4.6.0.tgz",
...@@ -658,15 +653,6 @@ ...@@ -658,15 +653,6 @@
"capture-stack-trace": "^1.0.0" "capture-stack-trace": "^1.0.0"
} }
}, },
"cron-parser": {
"version": "2.11.0",
"resolved": "http://npmprivate.quantgroups.com/cron-parser/-/cron-parser-2.11.0.tgz",
"integrity": "sha512-L5LAGlvq2xmCLErhjQRX8IL5v72y8jhGOaxrarYOhse0kJjJGb/vY/0sV/c7F/SylJGkUIY2iZPPJXZD3glZqA==",
"requires": {
"is-nan": "^1.2.1",
"moment-timezone": "^0.5.23"
}
},
"cross-spawn": { "cross-spawn": {
"version": "5.1.0", "version": "5.1.0",
"resolved": "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-5.1.0.tgz", "resolved": "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-5.1.0.tgz",
...@@ -757,6 +743,7 @@ ...@@ -757,6 +743,7 @@
"version": "1.1.3", "version": "1.1.3",
"resolved": "http://npmprivate.quantgroups.com/define-properties/-/define-properties-1.1.3.tgz", "resolved": "http://npmprivate.quantgroups.com/define-properties/-/define-properties-1.1.3.tgz",
"integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
"dev": true,
"requires": { "requires": {
"object-keys": "^1.0.12" "object-keys": "^1.0.12"
} }
...@@ -812,11 +799,6 @@ ...@@ -812,11 +799,6 @@
"resolved": "http://registry.npm.taobao.org/delegates/download/delegates-1.0.0.tgz", "resolved": "http://registry.npm.taobao.org/delegates/download/delegates-1.0.0.tgz",
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
}, },
"denque": {
"version": "1.4.1",
"resolved": "http://npmprivate.quantgroups.com/denque/-/denque-1.4.1.tgz",
"integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ=="
},
"depd": { "depd": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "http://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz", "resolved": "http://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz",
...@@ -2373,22 +2355,6 @@ ...@@ -2373,22 +2355,6 @@
"p-is-promise": "^1.1.0" "p-is-promise": "^1.1.0"
} }
}, },
"ioredis": {
"version": "4.9.5",
"resolved": "http://npmprivate.quantgroups.com/ioredis/-/ioredis-4.9.5.tgz",
"integrity": "sha512-L9MVfvX4F3LScTMEgriCGixzqinJsYy7Mt0NPX8RyuOTmx5JW0744pM4Ze2KVQcP3J0zvKYZ1LywAB6KIq7PYg==",
"requires": {
"cluster-key-slot": "^1.0.6",
"debug": "^3.1.0",
"denque": "^1.1.0",
"lodash.defaults": "^4.2.0",
"lodash.flatten": "^4.4.0",
"redis-commands": "1.4.0",
"redis-errors": "^1.2.0",
"redis-parser": "^3.0.0",
"standard-as-callback": "^2.0.1"
}
},
"is-accessor-descriptor": { "is-accessor-descriptor": {
"version": "0.1.6", "version": "0.1.6",
"resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz", "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz",
...@@ -2532,14 +2498,6 @@ ...@@ -2532,14 +2498,6 @@
"is-path-inside": "^1.0.0" "is-path-inside": "^1.0.0"
} }
}, },
"is-nan": {
"version": "1.2.1",
"resolved": "http://npmprivate.quantgroups.com/is-nan/-/is-nan-1.2.1.tgz",
"integrity": "sha1-n69ltvttskt/XAYoR16nH5iEAeI=",
"requires": {
"define-properties": "^1.1.1"
}
},
"is-npm": { "is-npm": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "http://registry.npm.taobao.org/is-npm/download/is-npm-1.0.0.tgz", "resolved": "http://registry.npm.taobao.org/is-npm/download/is-npm-1.0.0.tgz",
...@@ -2981,16 +2939,6 @@ ...@@ -2981,16 +2939,6 @@
"integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
"dev": true "dev": true
}, },
"lodash.defaults": {
"version": "4.2.0",
"resolved": "http://npmprivate.quantgroups.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
"integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw="
},
"lodash.flatten": {
"version": "4.4.0",
"resolved": "http://npmprivate.quantgroups.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
"integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8="
},
"lodash.merge": { "lodash.merge": {
"version": "4.6.1", "version": "4.6.1",
"resolved": "http://npmprivate.quantgroups.com/lodash.merge/-/lodash.merge-4.6.1.tgz", "resolved": "http://npmprivate.quantgroups.com/lodash.merge/-/lodash.merge-4.6.1.tgz",
...@@ -3001,11 +2949,6 @@ ...@@ -3001,11 +2949,6 @@
"resolved": "http://npmprivate.quantgroups.com/long/-/long-4.0.0.tgz", "resolved": "http://npmprivate.quantgroups.com/long/-/long-4.0.0.tgz",
"integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
}, },
"long-timeout": {
"version": "0.1.1",
"resolved": "http://npmprivate.quantgroups.com/long-timeout/-/long-timeout-0.1.1.tgz",
"integrity": "sha1-lyHXiLR+C8taJMLivuGg2lXatRQ="
},
"lowercase-keys": { "lowercase-keys": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "http://registry.npm.taobao.org/lowercase-keys/download/lowercase-keys-1.0.1.tgz", "resolved": "http://registry.npm.taobao.org/lowercase-keys/download/lowercase-keys-1.0.1.tgz",
...@@ -3149,19 +3092,6 @@ ...@@ -3149,19 +3092,6 @@
} }
} }
}, },
"moment": {
"version": "2.24.0",
"resolved": "http://npmprivate.quantgroups.com/moment/-/moment-2.24.0.tgz",
"integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
},
"moment-timezone": {
"version": "0.5.25",
"resolved": "http://npmprivate.quantgroups.com/moment-timezone/-/moment-timezone-0.5.25.tgz",
"integrity": "sha512-DgEaTyN/z0HFaVcVbSyVCUU6HeFdnNC3vE4c9cgu2dgMTvjBUBdBzWfasTBmAW45u5OIMeCJtU8yNjM22DHucw==",
"requires": {
"moment": ">= 2.9.0"
}
},
"ms": { "ms": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
...@@ -3234,16 +3164,6 @@ ...@@ -3234,16 +3164,6 @@
"uuid": "^3.3.2" "uuid": "^3.3.2"
} }
}, },
"node-schedule": {
"version": "1.3.2",
"resolved": "http://npmprivate.quantgroups.com/node-schedule/-/node-schedule-1.3.2.tgz",
"integrity": "sha512-GIND2pHMHiReSZSvS6dpZcDH7pGPGFfWBIEud6S00Q8zEIzAs9ommdyRK1ZbQt8y1LyZsJYZgPnyi7gpU2lcdw==",
"requires": {
"cron-parser": "^2.7.3",
"long-timeout": "0.1.1",
"sorted-array-functions": "^1.0.0"
}
},
"nodemon": { "nodemon": {
"version": "1.18.9", "version": "1.18.9",
"resolved": "http://registry.npm.taobao.org/nodemon/download/nodemon-1.18.9.tgz", "resolved": "http://registry.npm.taobao.org/nodemon/download/nodemon-1.18.9.tgz",
...@@ -3362,7 +3282,8 @@ ...@@ -3362,7 +3282,8 @@
"object-keys": { "object-keys": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "http://npmprivate.quantgroups.com/object-keys/-/object-keys-1.1.0.tgz", "resolved": "http://npmprivate.quantgroups.com/object-keys/-/object-keys-1.1.0.tgz",
"integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==" "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==",
"dev": true
}, },
"object-visit": { "object-visit": {
"version": "1.0.1", "version": "1.0.1",
...@@ -3875,24 +3796,6 @@ ...@@ -3875,24 +3796,6 @@
"readable-stream": "^2.0.2" "readable-stream": "^2.0.2"
} }
}, },
"redis-commands": {
"version": "1.4.0",
"resolved": "http://npmprivate.quantgroups.com/redis-commands/-/redis-commands-1.4.0.tgz",
"integrity": "sha512-cu8EF+MtkwI4DLIT0x9P8qNTLFhQD4jLfxLR0cCNkeGzs87FN6879JOJwNQR/1zD7aSYNbU0hgsV9zGY71Itvw=="
},
"redis-errors": {
"version": "1.2.0",
"resolved": "http://npmprivate.quantgroups.com/redis-errors/-/redis-errors-1.2.0.tgz",
"integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60="
},
"redis-parser": {
"version": "3.0.0",
"resolved": "http://npmprivate.quantgroups.com/redis-parser/-/redis-parser-3.0.0.tgz",
"integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=",
"requires": {
"redis-errors": "^1.0.0"
}
},
"regex-not": { "regex-not": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "http://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz", "resolved": "http://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz",
...@@ -4268,11 +4171,6 @@ ...@@ -4268,11 +4171,6 @@
"is-plain-obj": "^1.0.0" "is-plain-obj": "^1.0.0"
} }
}, },
"sorted-array-functions": {
"version": "1.2.0",
"resolved": "http://npmprivate.quantgroups.com/sorted-array-functions/-/sorted-array-functions-1.2.0.tgz",
"integrity": "sha512-sWpjPhIZJtqO77GN+LD8dDsDKcWZ9GCOJNqKzi1tvtjGIzwfoyuRH8S0psunmc6Z5P+qfDqztSbwYR5X/e1UTg=="
},
"source-map": { "source-map": {
"version": "0.5.7", "version": "0.5.7",
"resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz",
...@@ -4360,11 +4258,6 @@ ...@@ -4360,11 +4258,6 @@
"tweetnacl": "~0.14.0" "tweetnacl": "~0.14.0"
} }
}, },
"standard-as-callback": {
"version": "2.0.1",
"resolved": "http://npmprivate.quantgroups.com/standard-as-callback/-/standard-as-callback-2.0.1.tgz",
"integrity": "sha512-NQOxSeB8gOI5WjSaxjBgog2QFw55FV8TkS6Y07BiB3VJ8xNTvUYm0wl0s8ObgQ5NhdpnNfigMIKjgPESzgr4tg=="
},
"static-extend": { "static-extend": {
"version": "0.1.2", "version": "0.1.2",
"resolved": "http://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz", "resolved": "http://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz",
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
"description": "", "description": "",
"main": "bin/www.js", "main": "bin/www.js",
"dependencies": { "dependencies": {
"ioredis": "^4.9.5",
"joi": "^14.3.1", "joi": "^14.3.1",
"js-yaml": "^3.12.1", "js-yaml": "^3.12.1",
"koa": "^2.6.2", "koa": "^2.6.2",
...@@ -14,8 +13,6 @@ ...@@ -14,8 +13,6 @@
"kubernetes-client": "^6.3.2", "kubernetes-client": "^6.3.2",
"lodash": "^4.17.11", "lodash": "^4.17.11",
"lru-cache": "^5.1.1", "lru-cache": "^5.1.1",
"moment": "^2.24.0",
"node-schedule": "^1.3.2",
"request": "^2.88.0" "request": "^2.88.0"
}, },
"devDependencies": { "devDependencies": {
......
...@@ -16,9 +16,11 @@ spec: ...@@ -16,9 +16,11 @@ spec:
template: template:
metadata: metadata:
labels: labels:
type: {{label}}
qcloud-app: {{serviceName}} qcloud-app: {{serviceName}}
type: {{label}} type: {{label}}
spec: spec:
terminationGracePeriodSeconds: 0
revisionHistoryLimit: 1 revisionHistoryLimit: 1
containers: containers:
- name: {{serviceName}} - name: {{serviceName}}
......
...@@ -33,6 +33,7 @@ spec: ...@@ -33,6 +33,7 @@ spec:
metadata: metadata:
labels: labels:
qcloud-app: {{serviceName}} qcloud-app: {{serviceName}}
type: base
spec: spec:
containers: containers:
- image: ccr.ccs.tencentyun.com/{{image}} - image: ccr.ccs.tencentyun.com/{{image}}
......
...@@ -33,6 +33,7 @@ spec: ...@@ -33,6 +33,7 @@ spec:
metadata: metadata:
labels: labels:
qcloud-app: {{serviceName}} qcloud-app: {{serviceName}}
type: base
spec: spec:
# hostname固定,容器重置后数据持久化才能正常 # hostname固定,容器重置后数据持久化才能正常
hostname: {{serviceName}}-{{namespace}} hostname: {{serviceName}}-{{namespace}}
......
...@@ -32,6 +32,7 @@ spec: ...@@ -32,6 +32,7 @@ spec:
template: template:
metadata: metadata:
labels: labels:
type: base
qcloud-app: {{serviceName}} qcloud-app: {{serviceName}}
spec: spec:
containers: containers:
......
...@@ -19,6 +19,7 @@ spec: ...@@ -19,6 +19,7 @@ spec:
qcloud-app: {{serviceName}} qcloud-app: {{serviceName}}
type: {{label}} type: {{label}}
spec: spec:
terminationGracePeriodSeconds: 0
revisionHistoryLimit: 1 revisionHistoryLimit: 1
containers: containers:
- name: {{serviceName}} - name: {{serviceName}}
......
...@@ -33,6 +33,7 @@ spec: ...@@ -33,6 +33,7 @@ spec:
metadata: metadata:
labels: labels:
qcloud-app: {{serviceName}} qcloud-app: {{serviceName}}
type: base
spec: spec:
containers: containers:
- image: ccr.ccs.tencentyun.com/{{image}} - image: ccr.ccs.tencentyun.com/{{image}}
......
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