jenkins持续构建k8s服务
本文章只支持公司内部自研k8s集群使用,这里记录下来方便后续查看
·
jenkins持续构建k8s服务
本文默认您已经完成以下步骤:
- k8s集群安装(本司使用rancher 部署k8s)
- jenkins自动化部署工具安装
- harbor镜像仓库安装
一、准备工作
1.1 自动化部署流程
1.2 jenkins凭证配置
- 配置gitlab凭证
- k8s平台配置harbor凭证(证书没有的话问harbor相关人员要)
1.3 configmap配置
具体配置如下:
key | value | 说明 |
---|---|---|
config_serverid | FREGATA-SERVER-CONFIG | 配置中心name |
eureka_address | http://ycloud-eureserver-0.default-default-registrydns-com.ycloud:10010/eureka/ | 注册中心地址 |
eureka_client_use_DNS | true | 开启dns |
eureka_port | 10010 | 注册中心端口 |
kafka_bootstrap_servers | ycloud-kafka-0.ycloud-kafka-hs.ycloud.svc.cluster.local:30802 | kafka信息 |
rabbitmq_address | ycloud-rabbitmq.ycloud | mq信息 |
rabbitmq_password | yclouddev | mq密码 |
rabbitmq_port | 5672 | mq端口 |
rabbitmq_username | yclouddev | mq账号 |
zipkin_server | http://zipkin-server.ycloud.svc.cluster.local:8880 | 链路追踪地址 |
eureka_address配置地址参考:https://blog.csdn.net/han949417140/article/details/106242264
1.4 jenkins自动部署模板配置
/*用于开发的脚本,命名规范遵循"项目名_dev*/
/*=======================参数定义区start======================*/
/*
需要在页面显示的参数
实际执行的参数值是界面上填写的值。若需要在页面显示参数,打开对应参数的注释,同时注释掉下面的所有行“map.put”
*/
properties([
parameters([
choice(
choices: ['dev'],
description: '流水线类型',
name: 'PP_TYPE'
),
//gitlab代码仓库地址(必配)
text(defaultValue: 'http://192.168.101.94:8081/Data-Middleground-Develop-Area/product-code/service/dataMiddle-multipleCheck.git',
description: '必填,执行部署的项目源代码仓库地址',
name: 'PJ_URL'
),
text(
//分支(必配)
defaultValue: 'guohai',
description: '必填,执行部署的目标源代码项目仓库的分支名称',
name: 'PJ_BRANCH'
),
credentials(
//jenkins凭证id,参考上文jenkins凭证配置(必配)
defaultValue: 'hld_git_cert',
description: '必填,登录项目仓库使用的凭据ID,在持续交付中心凭据管理页面创建',
name: 'PJ_KEY',
required: true,
credentialType: 'com.cloudbees.plugins.credentials.common.StandardCredentials'
),
choice(
//k8s集群名称,需要登录k8s集群查看集群名称(必配)
choices: ['tag:guohai-dev'],
description: '必填,应用部署的K8S集群名称,格式要求【名称:tag】,tag要与对应集群的持续交付中心slave端tag一致',
name: 'K8S_API_SERVER'
),
choice(
choices: ['false', 'true'],
description: '仅执行部署,选择true以后:不会进行编译打包,选项:NEED_SCA、NEED_JUNIT不生效,需在执行过程选择chart版本;false会执行从源码到部署',
name: 'ONLY_DEPLOY'
),
choice(
choices: ['false', 'true'],
description: '是否需要服务调试。默认为false,表示当前服务不开启服务调试',
name: 'NEED_SERVICE_DEBUG'
),
//---------------------------部署前测试--------------------------
choice(
choices: ['false', 'true'],
description: '是否需要执行静态代码检查,true需要,false不需要',
name: 'NEED_SCA'
),
choice(
choices: ['false', 'true'],
description: '后端项目是否需要执行Junit单元测试,true需要,false不需要',
name: 'NEED_JUNIT'
),
choice(
choices: ['false', 'true'],
description: '是否需要执行镜像扫描',
name: 'NEED_IMAGE_SCAN'
),
//---------------------------部署后测试--------------------------
choice(choices: ['false', 'true'], description: '是否需要执行ZAP安全测试', name: 'NEED_SAFE_TEST'),
choice(choices: ['High', 'Medium', 'Low'], description: '执行ZAP安全测试的等级', name: 'ATK_LEVEL'),
//---------------------------私服配置--------------------------
//空值时使用CommonEnv.groovy中的配置。如果项目有自己的npm私服,在这里配置私服地址。可支持配置多个地址。
choice(
choices: ['', 'lugia:https://registry.npm.taobao.org/'],
description: '前端项目自定义npm私服',
name: 'NRM_LIB'
)
]),
//---------------------------自动触发配置(可选)--------------------------
/*
确定放入不显示区域能否执行
webhook配置:该配置实现在gitlab端代码有提交,则使用提交的配置信息重新构建项目
pipelineTriggers的使用参考:https://github.com/jenkinsci/gitlab-plugin#job-trigger-configuration
*/
pipelineTriggers([
[
$class : 'GitLabPushTrigger',
branchFilterType : 'All',
triggerOpenMergeRequestOnPush : "never",
skipWorkInProgressMergeRequest: true,
secretToken : '44fcdbc7c1e0c77c607b7f63c67458de',
branchFilterType : "NameBasedFilter",
includeBranchesSpec : "master", //这个分支push才会触发webhook,与PJ_BRANCH参数的值要一致
excludeBranchesSpec : "",
]
])
])
//============================以下参数在页面不显示=====================================
def DOCKERGROUP = "ex-dataservice"//harbor产物仓库的项目名
def REPLICAS = "1"//副本数量
def NAMESPACE = "bcloud"//k8s命名空间
def GROUP = "com.yss"//用于区分不同业务线应用同名而设置的前缀
def RELEASEDIR = "dist"//前端项目编译之后的目录,不建议修改
def CONTAINER_JVM_FLAGS = "" //后端项目JVM运行参数,如果为空值则使用默认配置
//---------------------------项目访问配置--------------------------
/*
【参数说明】
是否需要开启ipvs负载均衡。
默认为true,表示开启ipvs负载均衡。
*/
def NEED_IPVS_LOADBALANCE = "false"
/*
【参数说明】
ipvs负载均衡时访问应用的虚拟IP
1.当NEED_IPVS_LOADBALANCE选择为true时生效。
2.默认为空值,此时系统会自动分配虚拟IP;
3.如果用户需要使用固定的IP,需要配置该参数。
【注意】用户配置该参数时,需要在“运营实施中心”查看可用的虚拟IP。
*/
def LOADBALANCE_VIP = ""
/*
【参数说明】
1)部署前后端项目对应的域名;
2)如果后端服务需要使用https方式访问,需要与k8s集群中导入的证书绑定的域名一致;
*/
def MYDOMAIN1 = "yss-datamiddle-multiplecheck.com"
/*
【参数说明】
1.前端项目时置空;
2.后端项目不使用证书时,为空值;
3.后端项目使用应用自签名证书时,需要将证书导入集群,并配置该参数,引用导入证书的名称。(导入证书方法参考《运营实施中心使用手册》5.5.2章节。)
4.后端项目使用泛域名证书时,不配置该参数,为空值。
*/
def SECRETNAME1 = ""
/*
【参数说明】
1.前端项目使用https协议访问时的域名,推荐和MYDOMAIN1相同;
2.后端项目使用扩展自定义监听端口(CONTAINERPORT2)时使用的域名,推荐使用与MYDOMAIN1不同的域名;
3.后端项目如果需要使用https方式访问,且使用应用独立证书,需要与k8s集群中导入的证书绑定的域名一致;
*/
def MYDOMAIN2 = "udf-yss-datamiddle-multiplecheck.com"
/*
【参数说明】
1.前后端项目使用自定义自签名证书时,需要将证书导入集群,并配置该参数,引用导入证书的名称。(导入证书方法参考《运营实施中心使用手册》5.5.2章节。)
2.使用云平台自动生成共有证书时,不配置该参数,为空值。
3.使用公有证书时,不配置该参数,为空值。
4.前端项目使用https方式访问时,传入在k8s集群中导入的证书名称;前端项目可以通过IP:PORT方式、域名方式访问;
【注意】后端项目推荐不使用证书访问,或者使用泛域名证书访问。
*/
def SECRETNAME2 = ""
/*
【参数说明】
1.后端项目应用端口,覆盖bootstrap.yaml配置文件的server.port参数;
2.前端项目对应http端口;
3.推荐使用40000-50000端口。
*/
def CONTAINERPORT1 = "30180"
/*
【参数说明】
1.前端项目对应https访问端口;
2.后端项目扩展自定义监听端口,覆盖bootstrap.yaml配置文件的server.port2参数;
3.gRPC项目grpc访问端口;
4.推荐使用40000-50000端口。
*/
def CONTAINERPORT2 = "30181"
/*
【参数说明】服务部署节点标签设置
在kubernetes集群节点上添加标签,标签格式为cloud.app.yss.[key] = business。
用户在这里填入“key”值。演示项目可直接设置为“demo”。
*/
def NODE_LABEL = "demo"
/*
【参数说明】配置中心配置文件标识
1.后端项目使用配置中心的配置文件标识;
2.如果该参数为空就为当前流水线类型,当前流水线有dev, test, release,类型;
3.例如:CONFIG_CENTER_PROFILE = "xxx",使用配置中心配置文件为:[项目名]-xxx.yaml。
*/
def CONFIG_CENTER_PROFILE = ""
/*
【参数说明】后端项目执行接口测试,性能测试,安全测试使用的服务名称(前端项目仅涉及安全测试)。
参数范围:gateway网关服务名称或者服务自身的服务名。
*/
def TEST_SERVICE = "yss-datamiddle-multiplecheck"
/*
【参数说明】该配置用于指定前端项目需要使用容器外资源的目录,默认为空,表示不使用容器外资源。
该参数值需要与用户在nginx配置文件中使用的外部资源访问路径一致。
*/
def EXTERNAL_STATIC_RESOURCE_PATH = ""
/*===================参数定义区end============================*/
def nodeTag = ""
if (null != env.K8S_API_SERVER && env.K8S_API_SERVER != "") {
nodeTag = env.K8S_API_SERVER.split(":")[1]
echo nodeTag
}
if (null == env.PP_TYPE) {
node {
stage('任务参数配置') {
echo "首次执行只会导入任务默认参数,请修改参数后再执行任务"
}
}
return
}
/*将参数放入需要传入共享库的map*/
def map = [:]
/*
SPRING_PROFILES_ACTIVE:本地应用开发使用的配置文件标识(不推荐使用)
需要与项目resources目录下bootstrap.yml文件的一致,如:bootstrap-dev.yml,就填写dev。
默认为空值,默认使用bootstrap.yml。
*/
map.put('SPRING_PROFILES_ACTIVE', '')
map.put('CONFIG_CENTER_PROFILE', CONFIG_CENTER_PROFILE)
map.put('DOCKERGROUP', DOCKERGROUP)
map.put('REPLICAS', REPLICAS)
map.put('NAMESPACE', NAMESPACE)
map.put('GROUP', GROUP)
map.put('NODE', nodeTag)
map.put('NEED_API_TEST', 'false')
map.put('NEED_PM_TEST', 'false')
map.put('NEED_SAFE_TEST', 'false')
//配置服务对外访问地址,一般为集群主节点ip(必配)
map.put('EXTERNALIP', '192.168.101.84')
map.put('NEED_IPVS_LOADBALANCE', NEED_IPVS_LOADBALANCE)
map.put('LOADBALANCE_VIP', LOADBALANCE_VIP)
map.put('MYDOMAIN1', MYDOMAIN1)
map.put('SECRETNAME1', SECRETNAME1)
map.put('MYDOMAIN2', MYDOMAIN2)
map.put('SECRETNAME2', SECRETNAME2)
map.put('CONTAINERPORT1', CONTAINERPORT1)
map.put('CONTAINERPORT2', CONTAINERPORT2)
map.put('RELEASEDIR', RELEASEDIR)
map.put('PP_TYPE', "${PP_TYPE}")
map.put('NODE_LABEL', NODE_LABEL)
//以下APPNAME参数待扩展,暂不支持使用。
def APPNAME = ""//子项目名称,应用于maven子工程
map.put('APPNAME', APPNAME)
map.put('TEST_SERVICE', TEST_SERVICE)
map.put('EXTERNAL_STATIC_RESOURCE_PATH', EXTERNAL_STATIC_RESOURCE_PATH)
map.put('CONTAINER_JVM_FLAGS', CONTAINER_JVM_FLAGS)
map.put('NEED_MAVENDEPOLY', false)
//以下参数项,在自动识别工具无法正常识别时,以key--value形式写入map
//map.put('BUILD_TYPE','maven')//编译类型
//map.put('PROJECTNAME',PROJECTNAME)//应用名称
//map.put('APPJARNAME',APPJARNAME)//jar包全名
//map.put('DEPLOYMENTNAME',DEPLOYMENTNAME)//k8s发布名称
//map.put('VERSION',VERSION)//应用版本
//引用共享库
def cicdLib = "yss-cicd-basic"
map.put('CICDLIB', cicdLib)
library cicdLib
//第一个参数代码执行哪个流水线,目前支持:开发/测试/发布/生产dev/test/release/product
BasicLib("${PP_TYPE}", map)
二、 jenkins配置自动化部署
2.1 jenkins加载模板配置
- 新建任务–>流水线
- 流水线配置
配置完成之后保存、应用 - 加载配置
- 出现如下图代表模板配置加载成功
- 查看已加载配置
- 配置gitlab钩子函数
具体配置参考:gitlab钩子函数
至此 jenkins配置完成,点击立即构建之后会自动编译项目打jar包、生成镜像文件并上传harbor镜像仓库,之后会自动启动一个k8s pod。
三、k8s配置
configmap和harbor凭证都已经在上文创建完成,这里只需要修改一下pod对应的yaml 凭证配置
- 构建之后k8s集群会创建一个pod并启动咱们的服务
没有修改harbor凭证配置之前报错如下: - 调整harbor凭证配置
- 重新部署pod
- 查看pod内信息
- 配置前端nginx负载
配置模板:
user root;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
upstream mysvr{
# 后台pom.xml中parent.artifactId值
server yss-datamiddle-multiplecheck:30180;
}
# HTTP server
server {
listen 80; #http访问的端口
server_name localhost; #设置访问域名,不要设置IP
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /usr/local/nginx/http;
try_files $uri $uri/ /index.html last;
index index.html index.htm;
}
location /yapi/api {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_pass http://192.168.101.84:30180/;
proxy_pass http://mysvr/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# HTTPS server
server {
listen 443 ssl; #https访问的端口
server_name localhost; #使用域名访问,不使用IP访问
ssl_certificate /etc/nginx/ssl/tls.crt; #自签名证书路径,证书名称可以修改,路径 /etc/nginx/ssl/保持不变
ssl_certificate_key /etc/nginx/ssl/tls.key; #自签名证书路径,证书名称可以修改,路径 /etc/nginx/ssl/保持不变
location / {
root /usr/local/nginx/http;
try_files $uri $uri/ /index.html last;
index index.html index.htm;
}
location /yapi/api {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_pass http://192.168.101.84:30180;
proxy_pass http://mysvr/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
四、验证
- 访问接口
五、常见错误
5.1 dns异常
bootstrap.yaml添加配置:
eureka.client.eureka-server-d-n-s-name: registrydns.com
5.2 服务连不上注册中心
bootstrap.yaml添加配置:
eureka.client. eureka-server-u-r-l-context: eureka
具体配置可以参考:微服务项目开发手册
更多推荐
已为社区贡献6条内容
所有评论(0)