jenkins持续构建k8s服务

it2025-08-15  15

jenkins持续构建k8s服务

本文默认您已经完成以下步骤:

k8s集群安装(本司使用rancher 部署k8s)jenkins自动化部署工具安装harbor镜像仓库安装

一、准备工作

1.1 自动化部署流程

1.2 jenkins凭证配置

配置gitlab凭证 k8s平台配置harbor凭证(证书没有的话问harbor相关人员要)

1.3 configmap配置

具体配置如下:

keyvalue说明config_serveridFREGATA-SERVER-CONFIG配置中心nameeureka_addresshttp://ycloud-eureserver-0.default-default-registrydns-com.ycloud:10010/eureka/注册中心地址eureka_client_use_DNStrue开启dnseureka_port10010注册中心端口kafka_bootstrap_serversycloud-kafka-0.ycloud-kafka-hs.ycloud.svc.cluster.local:30802kafka信息rabbitmq_addressycloud-rabbitmq.ycloudmq信息rabbitmq_passwordyclouddevmq密码rabbitmq_port5672mq端口rabbitmq_usernameyclouddevmq账号zipkin_serverhttp://zipkin-server.ycloud.svc.cluster.local:8880链路追踪地址

eureka_address配置地址参考:https://blog.csdn.net/han949417140/article/details/106242264

1.4 jenkins自动部署模板配置

git模板项目地址: https://github.com/HLDBanana/template-java.git /*用于开发的脚本,命名规范遵循"项目名_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

具体配置可以参考:微服务项目开发手册

最新回复(0)