打包部署service-job-admin镜像

打包部署service-job-admin镜像

备份依赖xxl-job-core

其master分支pom文件中有相关说明

因为使用了xxl-job-admin加入springCloud中 xxl-job-core版本 admin和executor不一致,
    且其中xxl-rpc依赖不同,导致只能将admin使用的版本 提取出来,不跟随开源版本更新,作为基础版本

其实就是相当于开源版本的改版。

新建本地分支

git checkout feat/spring_2.1
git checkout -b jtest

新建远程分支

gitee新建私有仓库xxl-job-core

git remote add jingmin https://gitee.com/ole12138/xxl-job-core.git

# jtest分支设置上游分支,并推送
git push -u jingmin jtest
git push -u jingmin master:master


# 推送所有(本地)分支到新仓库
#git push --all jingmin

# 推送所有分支到新仓库(会多个HEAD临时分支)
git push jingmin +refs/remotes/origin/*:refs/heads/*
# 删除远程分支HEAD
git push jingmin --delete HEAD

上传构建到nexus

mvn clean package -U -X
mvn deploy

上传私有构件com.yatai.pay:epay:1.0

jar和pom见附件

参考: https://stackoverflow.com/questions/37543120/how-to-manually-deploy-artifacts-in-nexus-repository-manager-oss-3

web登录nexus->Upload->thirdparty

选择前面提供的jar包

group id : com.yatai.pay

arifact id : epay

version: 1.0

勾选:Generate a POM file with these coordinates

备份仓库xframework-dataexchange

建本地分支

git checkout master -b jtest

新建远程分支

gitee新建私有仓库xframework-dataexchange

git remote add jingmin https://gitee.com/ole12138/xframework-dataexchange.git

# jtest分支设置上游分支,并推送
git push -u jingmin jtest
git push -u jingmin master:master


# 推送所有(本地)分支到新仓库
#git push --all jingmin

# 推送所有分支到新仓库(会多个HEAD临时分支)
git push jingmin +refs/remotes/origin/*:refs/heads/*
# 删除远程分支HEAD
git push jingmin --delete HEAD

修改xframework-parent版本为2.0.2

提交修改

git add pom.xml
git commit -m "feat: jtest分支调整xframework-parent版本"
git push

上传构件到nexus

mvn clean package -U -X
mvn deploy

备份仓库service-job-admin

新建本地分支

git checkout develop
git checkout -b jtest

新建远程仓库

gitee新建私有仓库service-job-admin

上传分支

git remote add jingmin https://gitee.com/ole12138/service-job-admin.git

# jtest分支设置上游分支,并推送
git push -u jingmin jtest
git push -u jingmin master:master
git push -u jingmin develop:develop

# 推送所有(本地)分支到新仓库
#git push --all jingmin

# 推送所有分支到新仓库(会多个HEAD临时分支)
git push jingmin +refs/remotes/origin/*:refs/heads/*
# 删除远程分支HEAD
git push jingmin --delete HEAD

调整配置

调整springcloud的bootstrap.yml

# 服务名
spring.application.name=SERVICE-JOB-ADMIN
server.port=5019
#spring.cloud.nacos.server-addr=nacos.c253e0c129d8f453a82dfb1ae4ba19613.cn-shenzhen.alicontainer.com:80
spring.cloud.nacos.server-addr=nacos-headless.nacos.svc.cluster.local:8848
spring.cloud.nacos.discovery.group=woyun
spring.cloud.nacos.discovery.namespace=765fa359-2e1b-41f3-a4b2-17c3856764fe
spring.cloud.nacos.config.namespace=765fa359-2e1b-41f3-a4b2-17c3856764fe
spring.cloud.nacos.config.group=woyun
spring.cloud.nacos.config.shared-configs[0].data-id=application.properties
spring.cloud.nacos.config.shared-configs[0].group=woyun
spring.cloud.nacos.config.shared-configs[1].data-id=rabbitmq.properties
spring.cloud.nacos.config.shared-configs[1].group=woyun
spring.cloud.nacos.config.shared-configs[2].data-id=redis.properties
spring.cloud.nacos.config.shared-configs[2].group=woyun
spring.cloud.nacos.config.shared-configs[3].data-id=mysql-job-admin.properties
spring.cloud.nacos.config.shared-configs[3].group=woyun


##注意:如果配置中心有下面的属性,下面的配置是不会生效的,因为优先级会从配置中获取

mybatis.mapper-locations=classpath*:/mybatis-mapper/*Mapper.xml
#mybatis.typeAliasesPackage=com.x.bmp.admin.core.model
mybatis.configuration.map-underscore-to-camel-case=true

application.workerId=19
application.datacenterId=0

### web

server.servlet.context-path=/job-admin

### actuator
management.server.servlet.context-path=/actuator
management.health.mail.enabled=false

### resources
spring.mvc.servlet.load-on-startup=0
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/static/

### freemarker
spring.freemarker.templateLoaderPath=classpath:/templates/
spring.freemarker.suffix=.ftl
spring.freemarker.charset=UTF-8
spring.freemarker.request-context-attribute=request
spring.freemarker.settings.number_format=0.##########


### xxl-job, email
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=xxx@qq.com
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory

### xxl-job, access token
xxl.job.accessToken=

### xxl-job, i18n (default is zh_CN, and you can choose "zh_CN", "zh_TC" and "en")
xxl.job.i18n=zh_CN

## xxl-job, triggerpool max size
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100

### xxl-job, log retention days
xxl.job.logretentiondays=30

主要调整nacos地址和命名空间

建立数据库xxl-job

mysql-job-admin.properties分布式任务系统的数据库。

调整nacos中mysql-job-admin.properties的配置。

# 数据源名称
spring.datasource.name=xxl-job
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://mysql.jtest.svc.cluster.local:3306/xxl-job?characterEncoding=utf8&useSSL=true
spring.datasource.username=bmp
spring.datasource.password=bmp8*t229sa
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 配置初始化大小、最小、最大
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
# 配置获取连接等待超时的时间
spring.datasource.maxWait=10000
# 间隔多久才进行一次检测,检测需要关闭的空闲连接
spring.datasource.timeBetweenEvictionRunsMillis=60000
# 一个连接在池中最小生存的时间
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 'ZTM' FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false

主要是连接地址。采用k8s中mysql的地址。

表结构和数据详见xxl-job.sql

数据库账号: 根据nacos中的mysql-job-admin.properties配置添加数据库和数据库账号

GRANT ALL PRIVILEGES ON *.* TO 'bmp'@'%' IDENTIFIED BY 'xxx' WITH GRANT OPTION;

调整项目pom中xframework-parent版本为2.0.2

本地调试

telepresence connect

试运行

没问题的话提交修改

git add *.properties
git commit -m "feat: jtest分支配置”

部署自动化发布

  • 登录Jenkins
  • new Item, 选择pipeline, 名称为service-job-admin
  • 配置pipeline

pipeline通用配置

discard old build, 保留2个

This project is parameterized -> Choice Parameter-> name: branchName, Choices只有一个 **/jtest

pipeline具体配置

  • pipeline defination: pipeline script from SCM
    • SCM: git
      • repositories: https://gitee.com/ole12138/delopy-k8s.git
      • credentials: xxx/xxx
      • branchToBuild: */jtest
      • Addtional behaviors:
        • Sparse Checkout paths: service/jtest/Jenkinsfile
        • Checkout to sub-directory: jenkins
      • Script Path: service/jtest/Jenkinsfile

应用并保存

build with parameters。 选中choice开始构建。

Jenkins配置Config File Provider

不出意外的话,前面的构建会失败。是由于Jenkins中缺了k8s中部署对应镜像的service-job-k8s.yaml配置文件。

Dashboard->Manage Jenkins->Managed files(由Config File Provider插件提供)->Add a new Config

Custom file

id自动生成,这里是 6d21975b-1637-4fbd-bfaf-692f8d1a86f5

名称 service-job-k8s.yaml

内容

apiVersion: apps/v1
kind: Deployment
##元数据信息
metadata:
  name: <PROJECT_NAME>
  ##命名空间
  namespace: <NAME_SPACE>
  labels:
    app: <PROJECT_NAME>
spec:
  selector:
    matchLabels:
      app : <PROJECT_NAME>
  ##设置历史版本数量
  revisionHistoryLimit: 3
  ##滚动升级策略
  ##Kubernetes在等待设置的时间后才进行升级
  minReadySeconds: 5
  strategy:
    #    type: Recreate
    type: RollingUpdate
    rollingUpdate:
      ## 升级过程最多可以比原先设置多出的POD数量 Kubernetes会先启动1一个新的Pod后才删掉一个旧的
      maxSurge: 1
      ## 升级过程中最多有多少个POD处于无法提供服务的状态
      maxUnavailable: 1
  ##代表2个副本
  replicas: 1
  template:
    metadata:
      labels:
        app: <PROJECT_NAME>
    spec:
      #affinity:
      #  nodeAffinity:
      #    requiredDuringSchedulingIgnoredDuringExecution:
      #      nodeSelectorTerms:
      #        -  matchExpressions:
      #             -  key: node_env
      #                operator: In
      #                values:
      #                  - jtest
      ##重启策略
      #      Always:当容器失效时,由kubelet自动重启该容器。
      #      OnFailure:当容器终止运行且退出码不为0时,由kubelet自动重启该容器。
      #      Never:不论容器运行状态如何,kubelet都不会重启该容器。
      restartPolicy: Always
      ##挂载容器外面
      #      volumes:
      #        - name: <PROJECT_NAME>-log
      #          hostPath:
      ##            type: Directory
      #            path: /applogs/<NAME_SPACE>
      imagePullSecrets:
        - name: harbor-secret
      containers:
        ##容器名称
        - name: <PROJECT_NAME>-container
          ##镜像拉取策略
          imagePullPolicy: Always
          ##容器镜像地址
          image: harbor.ole121238.cn/<repoNamespace>/<PROJECT_NAME>:<BUILD_TAG>
          ## 环境变量设置
          env:
            - name: TZ
              value: Asia/Shanghai
            ##元数据获取POD名称到环境变量
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: SRV_NAME
              value: <PROJECT_NAME>
          #          lifecycle:
          #            postStart:
          #              exec:
          #                command:
          #                  - /bin/sh
          #                  - '-c'
          #                  - >-
          #                    rm -rf /applogs &&
          #                    mkdir -p /home/mount/<NAME_SPACE>/${POD_NAME} && ln -s
          #                    /home/mount/<NAME_SPACE>/${POD_NAME}
          #                    /applogs
          ##  containerPort 容器监听端口 、hostPort 容器所在主机监听端口
          ports:
            - name: <PORT_NAME>-con-port
              containerPort: <projectPort>
          ##挂载容器
          #          volumeMounts:
          #            - mountPath: /home/mount/<NAME_SPACE>
          ##              subPath: server-zuul.log
          #              name: <PROJECT_NAME>-log
          ##资源限制和请求限制
          resources:
            ##请求限制容器启动的初始可用CPU/内存
            requests:
              memory: <REQUEST_MEMORY>
              cpu: <REQUEST_CPU>
            ##资源请求限制
            limits:
              memory: <LIMIT_MEMORY>
              cpu: <LIMIT_CPU>
            ##健康检查
            #(就绪检查)可读探针会去连接容器的8067端,如果连接成功,则该 Pod 将被标记为就绪状态。
            #然后Kubelet将每隔10秒钟执行一次该检查
          readinessProbe:
            tcpSocket:
              port: <projectPort>
            ##指定kubelet在该执行第一要等待5秒钟。
            initialDelaySeconds: 60
            periodSeconds: 60
            ##(存活检查)存活探针容器启动15秒后,去尝试连接容器的8067端,如果liveness probe失败,容器将重新启动
          livenessProbe:
            tcpSocket:
              port: <projectPort>
            initialDelaySeconds: 240
            periodSeconds: 120

---

#添加自动弹性扩缩容
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: <PROJECT_NAME>-autoscal
  namespace: <NAME_SPACE>
spec:
  maxReplicas: 3
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: <PROJECT_NAME>
  targetCPUUtilizationPercentage: 80

---
apiVersion: v1
kind: Service
metadata:
  ##定义服务名称
  name: <SERVICE_NAME>
  namespace: <NAME_SPACE>
  labels:
    app: <PROJECT_NAME>
spec:
  selector:
    ##这里对应上面定义的labels标签
    app: <PROJECT_NAME>
    ##service类型:
    ## ClusterIp : 集群内部IP暴露服务
    ## NodePort : 通过每个 Node 节点上的 IP 和静态端口(NodePort)暴露服务
    ## LoadBalancer 使用云提供商的负载局衡器,可以向外部暴露服务
    ## ExternalName 通过返回 CNAME 和它的值,可以将服务映射到 externalName 字段的内容(例如, foo.bar.example.com)
  #type: NodePort
  type: ClusterIP
  ##端口号设置
  ports:
    - protocol: TCP
      port: <projectPort>
      targetPort: <projectPort>
      name: <PORT_NAME>-service-port

这里主要改了下service的type,改成了clusterIP。

另外改了下pod健康检查的时延。

调整deploy-k8s项目中Jenkinsfile配置

调整deploy-k8s项目下service/jtest/Jenkinsfile中service-job-admin判断语句下configFileProvider语句中configFile的fileId, 改为上面添加的文件的id

提交deploy-k8s项目中修改的文件service/jtest/Jenkinsfileservice/jtest/Jenkinsfile

构建成功后到k8s中看下jtest空间是否有对应的depoyment及pod跑起来。

nacos 看下服务列表jtest空间下有没有出现新的服务

访问地址

http://service-job-admin.jtest.svc.cluster.local:5019/job-admin

http://service-job-admin:5019/job-admin

账号密码

admin
woyunsoft123

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注