创建任务-发布至k8s
在内网的一台Web服务器上创建K8S的部署yaml模板:
cd /data/www/ mkdir k8s cd k8s vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: CI_PROJECT_NAME
namespace: NAMESPACE
spec:
replicas: REPLICAS_NUM
selector:
matchLabels:
app: CI_PROJECT_NAME
template:
metadata:
labels:
app: CI_PROJECT_NAME
spec:
containers:
- env:
- name: JVM_XMS
value: JVM_XMS_VALUE
- name: JVM_XMX
value: JVM_XMX_VALUE
- name: PROFILE_ACTIVE
value: SPRING_PROFILE
name: CI_PROJECT_NAME
image: REPOSITORY_BASE/CI_PROJECT_NAME:BUILD_IMAGE_VERSION
imagePullPolicy: Always
resources:
requests:
cpu: REQUESTS_CPU
memory: REQUESTS_MEM
#limits:
#cpu: LIMITS_CPU
#memory: 20240Mi
dnsPolicy: ClusterFirst
restartPolicy: Always
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
minReadySeconds: MINREADSECONDS
vim svc.yaml
apiVersion: v1
kind: Service
metadata:
name: CI_SERVICE_NAME
namespace: NAMESPACE
labels:
app: CI_SERVICE_NAME
spec:
ports:
- port: SVC_PORT
protocol: TCP
targetPort: TARGETPORT
selector:
app: CI_PROJECT_NAME
在Jenkins服务器上,为jenkins用户添加K8S群集内SSH密钥(若服务部署于k8s之内则可以不执行此操作):
mkdir /data/jenkins/.ssh cd /data/jenkins/.ssh/ chown -R jenkins.jenkins /data/jenkins/.ssh chmod 700 /data/jenkins/.ssh chmod 600 /data/jenkins/.ssh/id_rsa
创建Pipeline任务:
node{
// Pipeline方式, 提交参数, 将build的Docker镜像部署至K8S; 可用于外部调用
String HarborUrl='nw-harbor.zongs365.cc'
String HarborUser='admin'
String HarborPasswd='Nw-Harbor123'
String TemplateUrl='http://172.16.220.105/k8s'
String Temp_Depoly='deployment.yaml'
String Temp_SVC='svc.yaml'
String KubernetHost='[email protected]'
String Yaml_Path='/root/k8s_deploy'
String SSH_KeyFile='/data/jenkins/.ssh/id_rsa'
properties([
parameters([
string(name: 'Group', defaultValue: 'zongs-nw', description: 'Pod拉取用: 填写项目组名称,Harbor项目组;同构建任务', trim: false),
string(name: 'Project_name', defaultValue: 'demo', description: '部署配置用,Pod拉取用: 项目名称;同构建任务', trim: false),
string(name: 'Project_tag', defaultValue: 'nw-2', description: '部署配置用,Pod拉取用: 项目tag(镜像构建的版本);同构建任务', trim: false),
string(name: 'NAMESPACE', defaultValue: 'default', description: '部署配置用: 所在命名空间', trim: false),
string(name: 'REPLICAS_NUM', defaultValue: '1', description: '部署配置用: 运行的 Pod 数目', trim: false),
string(name: 'JVM_XMS_VALUE', defaultValue: '256m', description: '部署配置用: JAVA 选项 Xms', trim: false),
string(name: 'JVM_XMX_VALUE', defaultValue: '256m', description: '部署配置用: JAVA 选项 Xmx', trim: false),
string(name: 'SPRING_PROFILE', defaultValue: 'dev', description: '部署配置用: spring.profiles.active', trim: false),
string(name: 'REQUESTS_CPU', defaultValue: '50m', description: '部署配置用: 资源CPU需求', trim: false),
string(name: 'REQUESTS_MEM', defaultValue: '256Mi', description: '部署配置用: 资源Memory需求,与 JVM_XMX_VALUE 一致即可', trim: false),
string(name: 'MINREADSECONDS', defaultValue: '5', description: '部署配置用: 新创建的Pod状态为Ready持续此时间后认为Available', trim: false),
string(name: 'CI_SERVICE_NAME', defaultValue: "${Project_name}-svc", description: '部署配置用: 服务名称', trim: false),
choice(name: 'IS_SVC', choices: ['No', 'Yes'], description: '部署配置用: 是否创建服务(为 Yes 部署svc.yaml)'),
string(name: 'SVC_PORT', defaultValue: '80', description: '部署配置用: 服务本身监听端口', trim: false),
string(name: 'TARGETPORT', defaultValue: '8080', description: '部署配置用: 服务后端项目端口(即项目本身所监听的端口)', trim: false)
])
])
if(SSH_KeyFile){
if(!fileExists("${SSH_KeyFile}")){
error "连接密钥文件 ${SSH_KeyFile} 不存在"
}
SSH_Command="ssh -i ${SSH_KeyFile} -p 22 -o StrictHostKeyChecking=no"
SCP_Command="scp -i ${SSH_KeyFile} -P 22 -o StrictHostKeyChecking=no"
}else{
SSH_Command="ssh -p 22 -o StrictHostKeyChecking=no"
SCP_Command="scp -P 22 -o StrictHostKeyChecking=no"
}
dir("${env.WORKSPACE}"){
stage('群集主机SSH验证'){
echo "验证k8s群集内主机 ${KubernetHost} 是否可连通,并确保YAML文件存放目录 ${Yaml_Path}"
sh "${SSH_Command} ${KubernetHost} mkdir -p ${Yaml_Path}"
}
stage('K8S-Deployment 配置'){
echo "从 ${TemplateUrl} 拉取 K8S-Deployment 模板文件"
sh "wget ${TemplateUrl}/${Temp_Depoly} -O ${Project_name}-deploy.yaml"
echo "按参数配置修改模板文件"
sh "sed -i 's#CI_PROJECT_NAME#${Project_name}#g' ${Project_name}-deploy.yaml"
sh "sed -i 's#NAMESPACE#${NAMESPACE}#g' ${Project_name}-deploy.yaml"
sh "sed -i 's#REPLICAS_NUM#${REPLICAS_NUM}#g' ${Project_name}-deploy.yaml"
sh "sed -i 's#JVM_XMS_VALUE#${JVM_XMS_VALUE}#g' ${Project_name}-deploy.yaml"
sh "sed -i 's#JVM_XMX_VALUE#${JVM_XMX_VALUE}#g' ${Project_name}-deploy.yaml"
sh "sed -i 's#SPRING_PROFILE#${SPRING_PROFILE}#g' ${Project_name}-deploy.yaml"
sh "sed -i 's#REPOSITORY_BASE#${HarborUrl}/${Group}#g' ${Project_name}-deploy.yaml"
sh "sed -i 's#BUILD_IMAGE_VERSION#${Project_tag}#g' ${Project_name}-deploy.yaml"
sh "sed -i 's#REQUESTS_CPU#${REQUESTS_CPU}#g' ${Project_name}-deploy.yaml"
sh "sed -i 's#REQUESTS_MEM#${REQUESTS_MEM}#g' ${Project_name}-deploy.yaml"
sh "sed -i 's#MINREADSECONDS#${MINREADSECONDS}#g' ${Project_name}-deploy.yaml"
echo "将修改的文件 ${Project_name}-deploy.yaml 传送至 k8s 群集内部机器 ${KubernetHost}"
sh "${SCP_Command} ${Project_name}-deploy.yaml ${KubernetHost}:${Yaml_Path}"
}
if(IS_SVC == 'Yes'){
stage('K8S-SVC 配置(可选项)'){
echo "从 ${TemplateUrl} 拉取 K8S-SVC 模板文件"
sh "wget ${TemplateUrl}/${Temp_SVC} -O ${Project_name}-svc.yaml"
echo "按参数配置修改模板文件"
sh "sed -i 's#CI_SERVICE_NAME#${CI_SERVICE_NAME}#g' ${Project_name}-svc.yaml"
sh "sed -i 's#CI_PROJECT_NAME#${Project_name}#g' ${Project_name}-svc.yaml"
sh "sed -i 's#NAMESPACE#${NAMESPACE}#g' ${Project_name}-svc.yaml"
sh "sed -i 's#SVC_PORT#${SVC_PORT}#g' ${Project_name}-svc.yaml"
sh "sed -i 's#TARGETPORT#${TARGETPORT}#g' ${Project_name}-svc.yaml"
echo "将修改的文件 ${Project_name}-svc.yaml 传送至 k8s 群集内部机器 ${KubernetHost}"
sh "${SCP_Command} ${Project_name}-svc.yaml ${KubernetHost}:${Yaml_Path}"
}
}
stage('部署至K8S'){
echo "部署应用 ${Project_name}-deploy.yaml"
sh "${SSH_Command} ${KubernetHost} kubectl apply -f ${Yaml_Path}/${Project_name}-deploy.yaml"
if(IS_SVC == 'Yes'){
echo "部署服务 ${Project_name}-svc.yaml"
sh "${SSH_Command} ${KubernetHost} kubectl apply -f ${Yaml_Path}/${Project_name}-svc.yaml"
}
}
}
}
执行:
部署成功,验证:
kubectl get deployments.apps kubectl get svc







