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

服务接口更新为原生

parent e23f8d6b
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, servicesGet,
getPods, serviceCreate, getServices, getServiceDetail, serviceUpdate, serviceRestart, serviceDelete,
} = require('../kubeService/service')
const router = new 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) => {
const data = await servicesGet(ctx.query.namespace)
console.log(1, data)
const data = await getServices(ctx.query.namespace)
ctx.body = ctx.ok({ services: data })
})
const createService = async (ctx) => {
const {
type, serviceName, namespace, domain, label,
} = ctx.request.body
logger.info('创建服务', ctx.request.body)
const makeResouce = (serviceName, type) => {
// 资源限制
const resources = projectConfig[serviceName] || defaultConfig[type]
logger.info('资源限制', JSON.stringify(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('创建成功')
return resources
}
const createServiceTencent = async (ctx) => {
const createService = async (ctx) => {
const {
type, serviceName, namespace, system_name, domain, label,
type, serviceName, namespace, domain, label,
} = 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 resources = makeResouce(serviceName, type)
data.resources = resources
if (!system_name) {
// ui abTest的时候不一样
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)
logger.info('创建服务', data)
await serviceCreate(data)
if (label !== 'base') {
if (serviceName === 'xyqb-user2') {
await ingressCreate(namespace, 'xyqb-user2-2', 'passportapi2')
......@@ -129,17 +52,13 @@ router.post('/details', async (ctx) => {
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 }))
const data = await getServiceDetail(ctx.request.body.namespace, ctx.request.body.serviceName)
ctx.body = ctx.ok(data)
})
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') {
await ingressDelete(ctx.request.body.namespace, 'xyqb-user2-2')
}
......@@ -148,22 +67,26 @@ router.post('/delete', async (ctx) => {
})
router.post('/modifyImage', async (ctx) => {
let list = await ctx.cluster.service_list(ctx.request.body.namespace)
list = list.services.map(item => item.serviceName)
let list = await getPods(ctx.request.body.namespace)
list = list.map(item => (item.metadata.labels && item.metadata.labels['qcloud-app']) || item.metadata.name)
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 {
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('服务重部署成功')
await serviceRestart(ctx.request.body.namespace, ctx.request.body.podName)
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({
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 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 { type, namespace, serviceName } = data
const yamlManifest = yamls[type].replace(/{{([A-Za-z0-9_\.]+)}}/g, function () {
......@@ -144,7 +143,5 @@ module.exports = {
serviceGet,
servicesGet,
podGet,
podlog,
serviceCreate,
podGetstatus,
}
......@@ -525,11 +525,6 @@
"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": {
"version": "4.6.0",
"resolved": "http://registry.npm.taobao.org/co/download/co-4.6.0.tgz",
......@@ -658,15 +653,6 @@
"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": {
"version": "5.1.0",
"resolved": "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-5.1.0.tgz",
......@@ -757,6 +743,7 @@
"version": "1.1.3",
"resolved": "http://npmprivate.quantgroups.com/define-properties/-/define-properties-1.1.3.tgz",
"integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
"dev": true,
"requires": {
"object-keys": "^1.0.12"
}
......@@ -812,11 +799,6 @@
"resolved": "http://registry.npm.taobao.org/delegates/download/delegates-1.0.0.tgz",
"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": {
"version": "1.1.2",
"resolved": "http://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz",
......@@ -2373,22 +2355,6 @@
"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": {
"version": "0.1.6",
"resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz",
......@@ -2532,14 +2498,6 @@
"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": {
"version": "1.0.0",
"resolved": "http://registry.npm.taobao.org/is-npm/download/is-npm-1.0.0.tgz",
......@@ -2981,16 +2939,6 @@
"integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
"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": {
"version": "4.6.1",
"resolved": "http://npmprivate.quantgroups.com/lodash.merge/-/lodash.merge-4.6.1.tgz",
......@@ -3001,11 +2949,6 @@
"resolved": "http://npmprivate.quantgroups.com/long/-/long-4.0.0.tgz",
"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": {
"version": "1.0.1",
"resolved": "http://registry.npm.taobao.org/lowercase-keys/download/lowercase-keys-1.0.1.tgz",
......@@ -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": {
"version": "2.0.0",
"resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
......@@ -3234,16 +3164,6 @@
"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": {
"version": "1.18.9",
"resolved": "http://registry.npm.taobao.org/nodemon/download/nodemon-1.18.9.tgz",
......@@ -3362,7 +3282,8 @@
"object-keys": {
"version": "1.1.0",
"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": {
"version": "1.0.1",
......@@ -3875,24 +3796,6 @@
"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": {
"version": "1.0.2",
"resolved": "http://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz",
......@@ -4268,11 +4171,6 @@
"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": {
"version": "0.5.7",
"resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz",
......@@ -4360,11 +4258,6 @@
"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": {
"version": "0.1.2",
"resolved": "http://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz",
......
......@@ -4,7 +4,6 @@
"description": "",
"main": "bin/www.js",
"dependencies": {
"ioredis": "^4.9.5",
"joi": "^14.3.1",
"js-yaml": "^3.12.1",
"koa": "^2.6.2",
......@@ -14,8 +13,6 @@
"kubernetes-client": "^6.3.2",
"lodash": "^4.17.11",
"lru-cache": "^5.1.1",
"moment": "^2.24.0",
"node-schedule": "^1.3.2",
"request": "^2.88.0"
},
"devDependencies": {
......
......@@ -16,9 +16,11 @@ spec:
template:
metadata:
labels:
type: {{label}}
qcloud-app: {{serviceName}}
type: {{label}}
spec:
terminationGracePeriodSeconds: 0
revisionHistoryLimit: 1
containers:
- name: {{serviceName}}
......
......@@ -33,6 +33,7 @@ spec:
metadata:
labels:
qcloud-app: {{serviceName}}
type: base
spec:
containers:
- image: ccr.ccs.tencentyun.com/{{image}}
......
......@@ -33,6 +33,7 @@ spec:
metadata:
labels:
qcloud-app: {{serviceName}}
type: base
spec:
# hostname固定,容器重置后数据持久化才能正常
hostname: {{serviceName}}-{{namespace}}
......
......@@ -32,6 +32,7 @@ spec:
template:
metadata:
labels:
type: base
qcloud-app: {{serviceName}}
spec:
containers:
......
......@@ -19,6 +19,7 @@ spec:
qcloud-app: {{serviceName}}
type: {{label}}
spec:
terminationGracePeriodSeconds: 0
revisionHistoryLimit: 1
containers:
- name: {{serviceName}}
......
......@@ -33,6 +33,7 @@ spec:
metadata:
labels:
qcloud-app: {{serviceName}}
type: base
spec:
containers:
- 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