Commit 45eff20d authored by 智勇's avatar 智勇

自动部署master

parent e7a773fe
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)
}
});
}
......@@ -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)
......
......@@ -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) => {
......
......@@ -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(clientNew[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)
}
}
......
......@@ -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) => {
......
......@@ -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(clientNew[cluster], namespace),
getServices(clientNew[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(clientNew[cluster], namespace),
getServices(clientNew[cluster], namespace),
getPods(client, namespace),
getServices(client, namespace),
])
res[0].body.items.forEach(async (item) => {
......
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()
}
}
......
......@@ -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]
}
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
}
......@@ -43,31 +43,31 @@ const defaultRedis = {
}
const defaultUI = {
cpuLimit: 10,
cpuRequest: 100,
memLimit: 50,
cpuRequest: 10,
cpuLimit: 100,
memRequest: 50,
memLimit: 50,
}
const defaultNodejs = {
cpuLimit: 20,
cpuRequest: 200,
memLimit: 200,
memRequest: 240,
cpuRequest: 20,
cpuLimit: 200,
memRequest: 200,
memLimit: 240,
}
const defaultPython = {
cpuLimit: 20,
cpuRequest: 200,
memLimit: 200,
memRequest: 240,
cpuRequest: 20,
cpuLimit: 200,
memRequest: 200,
memLimit: 240,
}
const defaultJava = {
cpuLimit: 100,
cpuRequest: 1000,
memLimit: 500,
memRequest: 600,
cpuRequest: 100,
cpuLimit: 1000,
memRequest: 500,
memLimit: 600,
}
exports.defaultConfig = {
......
......@@ -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) {
......
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