k8s交付实战-流水线构建dubbo服务

目录

  • k8s交付实战-流水线构建dubbo服务
    • 1 jenkins流水线准备工作
      • 1.1 参数构建要点
      • 1.2 创建流水线
        • 1.2.1 创建流水线
        • 1.2.2 添加10个构建参数
        • 1.2.3 添加完成效果如下:
        • 1.2.4 添加pipiline代码
      • 1.3 用流水线完成dubbo-service的构建
        • 1.3.1 选择参数化构建
        • 1.3.2 填写完成效果如下
        • 1.3.3 执行构建并检查
    • 2 交付dubbo-service到k8s
      • 2.1 准备资源清单
        • 2.1.1 创建depeloy清单
      • 2.2 创建k8s资源
        • 2.2.1 创建app名称空间
        • 2.2.2 创建secret资源
        • 2.2.3 应用资源清单
    • 3 交付dubbo-monitor监控服务到k8s
      • 3.1 制作dobbo-monitor镜像
        • 3.1.1 下载源码
        • 3.1.2 修改配置文件:
        • 3.1.3 优化Dockerfile启动脚本
        • 3.1.4 构建并上传
      • 3.2 创建资源配置清单
        • 3.2.1 准备目录
        • 3.2.2 创建deploy资源文件
        • 3.2.3 创建service资源文件
        • 3.2.4 创建ingress资源文件
      • 3.3 创建dobbo-miniotr服务
        • 3.3.1 应用资源配置清单
        • 3.3.2 添加dns解析
        • 3.3.3 访问monitor的web页面
    • 4 构建dubbo-consumer服务
      • 4.1 构建docker镜像
        • 4.1.1 获取私有仓库代码
        • 4.1.2 配置流水线
        • 4.1.3 查看构建结果
      • 4.2 准备资源配置清单:
        • 4.2.1 创建deploy资源清单
        • 4.2.2 创建service资源清单
        • 4.2.3 创建ingress资源清单
      • 4.3 创建K8S资源
        • 4.3.1 应用资源配置清单:
        • 4.3.2 验证启动结果
        • 4.3.3 添加dns解析
      • 4.4 模拟版本升级
        • 4.4.1 修改dp.yaml资源配置清单
        • 4.4.2 应用修改后的资源配置清单
        • 4.4.3 使用浏览器验证

          1 jenkins流水线准备工作

          1.1 参数构建要点

          jenkins流水线配置的java项目的十个常用参数:
参数名 作用 举例或说明
app_name 项目名 dubbo_demo_service
image_name docker镜像名 app/dubbo-demo-service
git_repo 项目的git地址 https://x.com/x/x.git
git_ver 项目的git分支或版本号 master
add_tag 镜像标签,常用时间戳 191203_1830
mvn_dir 执行mvn编译的目录 ./
target_dir 编译产生包的目录 ./target
mvn_cmd 编译maven项目的命令 mvc clean package -Dmaven.
base_image 项目的docker底包 不同的项目底包不一样,下拉选择
maven maven软件版本 不同的项目可能maven环境不一样

除了base_image和maven是choice parameter,其他都是string parameter

1.2 创建流水线

1.2.1 创建流水线

创建名为dubbo-demo的流水线(pipeline),并设置Discard old builds 为如下

Discard old builds选项
Days to keep builds 3
Max # of builds to keep 30

1.2.2 添加10个构建参数

This project is parameterized点击Add Parameter,分别添加如下10个参数

  1. #第1个参数
  2. 参数类型 : String Parameter
  3. Name : app_name
  4. Description : 项目名 eg:dubbo-demo-service
  5. #第2个参数
  6. 参数类型 : String Parameter
  7. Name : image_name
  8. Description : docker镜像名 eg: app/dubbo-demo-service
  9. #第3个参数
  10. 参数类型 : String Parameter
  11. Name : git_repo
  12. Description : 仓库地址 eg: https://gitee.com/xxx/xxx.git
  13. #第4个参数
  14. 参数类型 : String Parameter
  15. Name : git_ver
  16. Description : 项目的git分支或版本号
  17. #第5个参数
  18. 参数类型 : String Parameter
  19. Name : add_tag
  20. Description :
  21. docker镜像添加标签组合的一部分,如
  22. $git_ver_$add_tag=master_191203_1830
  23. #第6个参数
  24. 参数类型 : String Parameter
  25. Name : mvn_dir
  26. Default Value : ./
  27. Description : 执行mvn编译的目录,默认是项目根目录, eg: ./
  28. #第7个参数
  29. 参数类型 : String Parameter
  30. Name : target_dir
  31. Default Value : ./target
  32. Description : 编译产生的war/jar包目录 eg: ./dubbo-server/target
  33. #第8个参数
  34. 参数类型 : String Parameter
  35. Name : mvn_cmd
  36. Default Value : mvn clean package -Dmaven.test.skip=true
  37. Description : 编译命令,常加上-e -q参数只输出错误
  38. #第9个参数
  39. 参数类型 : Choice Parameter
  40. Name : base_image
  41. Choices :
  42. base/jre7:7u80
  43. base/jre8:8u112
  44. Description : 项目的docker底包
  45. #第10个参数
  46. 参数类型 : Choice Parameter
  47. Name : maven
  48. Choices :
  49. 3.6.1
  50. 3.2.5
  51. 2.2.1
  52. Description : 执行编译使用maven软件版本

1.2.3 添加完成效果如下:

K8S(09)交付实战-通过流水线构建dubbo服务 - 图1

1.2.4 添加pipiline代码

流水线构建所用的pipiline代码语法比较有专门的生成工具
以下语句的作用大致是分为四步:拉代码->构建包->移动包-打docker镜像并推送

  1. pipeline {
  2. agent any
  3. stages {
  4. stage('pull') { //get project code from repo
  5. steps {
  6. sh "git clone ${params.git_repo} ${params.app_name}/${env.BUILD_NUMBER} && cd ${params.app_name}/${env.BUILD_NUMBER} && git checkout ${params.git_ver}"
  7. }
  8. }
  9. stage('build') { //exec mvn cmd
  10. steps {
  11. sh "cd ${params.app_name}/${env.BUILD_NUMBER} && /var/jenkins_home/maven-${params.maven}/bin/${params.mvn_cmd}"
  12. }
  13. }
  14. stage('package') { //move jar file into project_dir
  15. steps {
  16. sh "cd ${params.app_name}/${env.BUILD_NUMBER} && cd ${params.target_dir} && mkdir project_dir && mv *.jar ./project_dir"
  17. }
  18. }
  19. stage('image') { //build image and push to registry
  20. steps {
  21. writeFile file: "${params.app_name}/${env.BUILD_NUMBER}/Dockerfile", text: """FROM harbor.zq.com/${params.base_image}
  22. ADD ${params.target_dir}/project_dir /opt/project_dir"""
  23. sh "cd ${params.app_name}/${env.BUILD_NUMBER} && docker build -t harbor.zq.com/${params.image_name}:${params.git_ver}_${params.add_tag} . && docker push harbor.zq.com/${params.image_name}:${params.git_ver}_${params.add_tag}"
  24. }
  25. }
  26. }
  27. }

K8S(09)交付实战-通过流水线构建dubbo服务 - 图2

1.3 用流水线完成dubbo-service的构建

记得先在harbor中创建私有仓库app

1.3.1 选择参数化构建

进入dubbo-demo后,选择的参数化构建build with parameters ,填写10个构建的参数

参数名 参数值
app_name dubbo-demo-service
image_name app/dubbo-demo-service
git_repo https://gitee.com/noah-luo/dubbo-demo-service.git
git_ver master
add_tag 200509_0800
mvn_dir ./
target_dir ./dubbo-server/target
mvn_cmd mvn clean package -Dmaven.test.skip=true
base_image base/jre8:8u112
maven 3.6.1

1.3.2 填写完成效果如下

K8S(09)交付实战-通过流水线构建dubbo服务 - 图3

1.3.3 执行构建并检查

填写完以后执行bulid
第一次构建需要下载很多依赖包,时间很长,抽根烟,喝杯茶
经过漫长的等待后,已经构建完成了
点击打开 Blue Ocean查看构建历史及过程:
K8S(09)交付实战-通过流水线构建dubbo服务 - 图4
检查harbor是否已经有这版镜像:
K8S(09)交付实战-通过流水线构建dubbo服务 - 图5

2 交付dubbo-service到k8s

2.1 准备资源清单

创建清单操作都在7.200上操作

  1. mkdir /data/k8s-yaml/dubbo-server/
  2. cd /data/k8s-yaml/dubbo-server

2.1.1 创建depeloy清单

  1. cat >dp.yaml <<EOF
  2. kind: Deployment
  3. apiVersion: extensions/v1beta1
  4. metadata:
  5. name: dubbo-demo-service
  6. namespace: app
  7. labels:
  8. name: dubbo-demo-service
  9. spec:
  10. replicas: 1
  11. selector:
  12. matchLabels:
  13. name: dubbo-demo-service
  14. template:
  15. metadata:
  16. labels:
  17. app: dubbo-demo-service
  18. name: dubbo-demo-service
  19. spec:
  20. containers:
  21. - name: dubbo-demo-service
  22. image: harbor.zq.com/app/dubbo-demo-service:master_200509_0800
  23. ports:
  24. - containerPort: 20880
  25. protocol: TCP
  26. env:
  27. - name: JAR_BALL
  28. value: dubbo-server.jar
  29. imagePullPolicy: IfNotPresent
  30. imagePullSecrets:
  31. - name: harbor
  32. restartPolicy: Always
  33. terminationGracePeriodSeconds: 30
  34. securityContext:
  35. runAsUser: 0
  36. schedulerName: default-scheduler
  37. strategy:
  38. type: RollingUpdate
  39. rollingUpdate:
  40. maxUnavailable: 1
  41. maxSurge: 1
  42. revisionHistoryLimit: 7
  43. progressDeadlineSeconds: 600
  44. EOF

需要根据自己构建镜像的tag来修改image dubbo的server服务,只向zk注册并通过zk与dobbo的web交互,不需要对外提供服务 因此不需要service资源和ingress资源

2.2 创建k8s资源

创建K8S资源的操作,在任意node节点上操作即可

2.2.1 创建app名称空间

业务资源和运维资源等应该通过名称空间来隔离,因此创建专有名称空间app

  1. kubectl create namespace app

2.2.2 创建secret资源

我们的业务镜像是harbor中的私有项目,所以需要创建docker-registry的secret资源:

  1. kubectl -n app \
  2. create secret docker-registry harbor \
  3. --docker-server=harbor.zq.com \
  4. --docker-username=admin \
  5. --docker-password=Harbor12345

2.2.3 应用资源清单

  1. kubectl apply -f http://k8s-yaml.zq.com/dubbo-server/dp.yaml

3分钟后检查启动情况

  1. # 检查pod是否创建:
  2. ~]# kubectl -n app get pod
  3. NAME READY STATUS RESTARTS AGE
  4. dubbo-demo-service-79574b6879-cxkls 1/1 Running 0 24s
  5. # 检查是否启动成功:
  6. ~]# kubectl -n app logs dubbo-demo-service-79574b6879-cxkls --tail=2
  7. Dubbo server started
  8. Dubbo 服务端已经启动

到zk服务器检查是否有服务注册

  1. sh /opt/zookeeper/bin/zkCli.sh
  2. [zk: localhost:2181(CONNECTED) 0] ls /
  3. [dubbo, zookeeper]
  4. [zk: localhost:2181(CONNECTED) 1] ls /dubbo
  5. [com.od.dubbotest.api.HelloService]

3 交付dubbo-monitor监控服务到k8s

dobbo-monitor源码地址: https://github.com/Jeromefromcn/dubbo-monitor.git
dubbo-monitor是监控zookeeper状态的一个服务,另外还有dubbo-admin,效果一样

3.1 制作dobbo-monitor镜像

制作镜像在管理机7.200上操作

3.1.1 下载源码

  1. cd /opt/src
  2. wget https://github.com/Jeromefromcn/dubbo-monitor/archive/master.zip
  3. yum -y install unzip
  4. unzip master.zip
  5. mv dubbo-monitor-mster /data/dockerfile/dubbo-monitor
  6. cd /data/dockerfile/dubbo-monitor

3.1.2 修改配置文件:

直接覆盖它原始的配置
其实它原本就没什么内容,只是修改了addr,端口,目录等

  1. cat >dubbo-monitor-simple/conf/dubbo_origin.properties <<'EOF'
  2. dubbo.container=log4j,spring,registry,jetty
  3. dubbo.application.name=simple-monitor
  4. dubbo.application.owner=
  5. dubbo.registry.address=zookeeper://zk1.zq.com:2181?backup=zk2.zq.com:2181,zk3.zq.com:2181
  6. dubbo.protocol.port=20880
  7. dubbo.jetty.port=8080
  8. dubbo.jetty.directory=/dubbo-monitor-simple/monitor
  9. dubbo.statistics.directory=/dubbo-monitor-simple/statistics
  10. dubbo.charts.directory=/dubbo-monitor-simple/charts
  11. dubbo.log4j.file=logs/dubbo-monitor.log
  12. dubbo.log4j.level=WARN
  13. EOF

3.1.3 优化Dockerfile启动脚本

  1. # 修改jvm资源限制(非必须)
  2. sed -i '/Xmx2g/ s#128m#16m#g' ./dubbo-monitor-simple/bin/start.sh
  3. sed -i '/Xmx2g/ s#256m#32m#g' ./dubbo-monitor-simple/bin/start.sh
  4. sed -i '/Xmx2g/ s#2g#128m#g' ./dubbo-monitor-simple/bin/start.sh
  5. # 修改nohup为exec不能改去掉改行最后的&符号
  6. sed -ri 's#^nohup(.*) &#exec\1#g' ./dubbo-monitor-simple/bin/start.sh
  7. # 删除exec命令行后面所有行
  8. sed -i '66,$d' ./dubbo-monitor-simple/bin/start.sh

3.1.4 构建并上传

  1. docker build . -t harbor.zq.com/infra/dubbo-monitor:latest
  2. docker push harbor.zq.com/infra/dubbo-monitor:latest

3.2 创建资源配置清单

3.2.1 准备目录

  1. mkdir /data/k8s-yaml/dubbo-monitor
  2. cd /data/k8s-yaml/dubbo-monitor

3.2.2 创建deploy资源文件

  1. cat >dp.yaml <<EOF
  2. kind: Deployment
  3. apiVersion: extensions/v1beta1
  4. metadata:
  5. name: dubbo-monitor
  6. namespace: infra
  7. labels:
  8. name: dubbo-monitor
  9. spec:
  10. replicas: 1
  11. selector:
  12. matchLabels:
  13. name: dubbo-monitor
  14. template:
  15. metadata:
  16. labels:
  17. app: dubbo-monitor
  18. name: dubbo-monitor
  19. spec:
  20. containers:
  21. - name: dubbo-monitor
  22. image: harbor.zq.com/infra/dubbo-monitor:latest
  23. ports:
  24. - containerPort: 8080
  25. protocol: TCP
  26. - containerPort: 20880
  27. protocol: TCP
  28. imagePullPolicy: IfNotPresent
  29. imagePullSecrets:
  30. - name: harbor
  31. restartPolicy: Always
  32. terminationGracePeriodSeconds: 30
  33. securityContext:
  34. runAsUser: 0
  35. schedulerName: default-scheduler
  36. strategy:
  37. type: RollingUpdate
  38. rollingUpdate:
  39. maxUnavailable: 1
  40. maxSurge: 1
  41. revisionHistoryLimit: 7
  42. progressDeadlineSeconds: 600
  43. EOF

3.2.3 创建service资源文件

  1. cat >svc.yaml <<EOF
  2. kind: Service
  3. apiVersion: v1
  4. metadata:
  5. name: dubbo-monitor
  6. namespace: infra
  7. spec:
  8. ports:
  9. - protocol: TCP
  10. port: 8080
  11. targetPort: 8080
  12. selector:
  13. app: dubbo-monitor
  14. EOF

3.2.4 创建ingress资源文件

  1. cat >ingress.yaml <<EOF
  2. kind: Ingress
  3. apiVersion: extensions/v1beta1
  4. metadata:
  5. name: dubbo-monitor
  6. namespace: infra
  7. spec:
  8. rules:
  9. - host: dubbo-monitor.zq.com
  10. http:
  11. paths:
  12. - path: /
  13. backend:
  14. serviceName: dubbo-monitor
  15. servicePort: 8080
  16. EOF

3.3 创建dobbo-miniotr服务

3.3.1 应用资源配置清单

在任意node节点

  1. kubectl apply -f http://k8s-yaml.zq.com/dubbo-monitor/dp.yaml
  2. kubectl apply -f http://k8s-yaml.zq.com/dubbo-monitor/svc.yaml
  3. kubectl apply -f http://k8s-yaml.zq.com/dubbo-monitor/ingress.yaml

验证:

  1. ~]# kubectl -n infra get pod
  2. NAME READY STATUS RESTARTS AGE
  3. dubbo-monitor-d9675688c-sctsx 1/1 Running 0 29s
  4. jenkins-7cd8b95d79-6vrbn 1/1 Running 0 3d2h

3.3.2 添加dns解析

这个服务是有web页面的,创建了ingress和service资源的,所以需要添加dns解析

  1. vi /var/named/zq.com.zone
  2. dobbo-monitor A 10.4.7.10

重启并验证

  1. systemctl restart named
  2. dig -t A dubbo-monitor.zq.com @10.4.7.11 +short

3.3.3 访问monitor的web页面

访问dubbo-monitor.zq.com
K8S(09)交付实战-通过流水线构建dubbo服务 - 图6
这里已经可以看到我们之前部署的dubbo-demo-service服务了,启动了两个进程来提供服务。
至此,dubbo-monitor监控服务已经部署完成。

4 构建dubbo-consumer服务

4.1 构建docker镜像

4.1.1 获取私有仓库代码

之前创建的dubbo-service是微服务的提供者,现在创建一个微服务的消费者
使用git@gitee.com:noah-luo/dubbo-demo-web.git这个私有仓库中的代码构建消费者
先从[https://gitee.com/sunx66/dubbo-demo-service](https://gitee.com/sunx66/dubbo-demo-service)这里fork到自己仓库,在设为私有
并修改zk的配置

4.1.2 配置流水线

之前已经在jenkins配置好了流水线,只需要填写参数就行了。

参数名 参数值
app_name dubbo-demo-consumer
image_name app/dubbo-demo-consumer
git_repo git@gitee.com:noah-luo/dubbo-demo-web.git
git_ver master
add_tag 200506_1430
mvn_dir ./
target_dir ./dubbo-client/target
mvn_cmd mvn clean package -Dmaven.test.skip=true
base_image base/jre8:8u112
maven 3.6.1

4.1.3 查看构建结果

如果构建不报错,则应该已经推送到harbor仓库中了,这时我们直接再给镜像一个新tag,以便后续模拟更新

  1. docker tag \
  2. harbor.zq.com/app/dubbo-demo-consumer:master_200506_1430 \
  3. harbor.zq.com/app/dubbo-demo-consumer:master_200510_1430
  4. docker push harbor.zq.com/app/dubbo-demo-consumer:master_200510_1430

查看harbor仓库
K8S(09)交付实战-通过流水线构建dubbo服务 - 图7

4.2 准备资源配置清单:

先准备目录

  1. mkdir /data/k8s-yaml/dubbo-consumer
  2. cd /data/k8s-yaml/dubbo-consumer

4.2.1 创建deploy资源清单

  1. cat >dp.yaml <<EOF
  2. kind: Deployment
  3. apiVersion: extensions/v1beta1
  4. metadata:
  5. name: dubbo-demo-consumer
  6. namespace: app
  7. labels:
  8. name: dubbo-demo-consumer
  9. spec:
  10. replicas: 1
  11. selector:
  12. matchLabels:
  13. name: dubbo-demo-consumer
  14. template:
  15. metadata:
  16. labels:
  17. app: dubbo-demo-consumer
  18. name: dubbo-demo-consumer
  19. spec:
  20. containers:
  21. - name: dubbo-demo-consumer
  22. image: harbor.zq.com/app/dubbo-demo-consumer:master_200506_1430
  23. ports:
  24. - containerPort: 8080
  25. protocol: TCP
  26. - containerPort: 20880
  27. protocol: TCP
  28. env:
  29. - name: JAR_BALL
  30. value: dubbo-client.jar
  31. imagePullPolicy: IfNotPresent
  32. imagePullSecrets:
  33. - name: harbor
  34. restartPolicy: Always
  35. terminationGracePeriodSeconds: 30
  36. securityContext:
  37. runAsUser: 0
  38. schedulerName: default-scheduler
  39. strategy:
  40. type: RollingUpdate
  41. rollingUpdate:
  42. maxUnavailable: 1
  43. maxSurge: 1
  44. revisionHistoryLimit: 7
  45. progressDeadlineSeconds: 600
  46. EOF

注意修改镜像的tag

4.2.2 创建service资源清单

  1. cat >svc.yaml <<EOF
  2. kind: Service
  3. apiVersion: v1
  4. metadata:
  5. name: dubbo-demo-consumer
  6. namespace: app
  7. spec:
  8. ports:
  9. - protocol: TCP
  10. port: 8080
  11. targetPort: 8080
  12. selector:
  13. app: dubbo-demo-consumer
  14. EOF

4.2.3 创建ingress资源清单

  1. cat >ingress.yaml <<EOF
  2. kind: Ingress
  3. apiVersion: extensions/v1beta1
  4. metadata:
  5. name: dubbo-demo-consumer
  6. namespace: app
  7. spec:
  8. rules:
  9. - host: dubbo-demo.zq.com
  10. http:
  11. paths:
  12. - path: /
  13. backend:
  14. serviceName: dubbo-demo-consumer
  15. servicePort: 8080
  16. EOF

4.3 创建K8S资源

4.3.1 应用资源配置清单:

  1. kubectl apply -f http://k8s-yaml.zq.com/dubbo-consumer/dp.yaml
  2. kubectl apply -f http://k8s-yaml.zq.com/dubbo-consumer/svc.yaml
  3. kubectl apply -f http://k8s-yaml.zq.com/dubbo-consumer/ingress.yaml
  4. # 查看容器启动成功没
  5. ~]# kubectl get pod -n app
  6. NAME READY STATUS RESTARTS AGE
  7. dubbo-demo-consumer-b8d86bd5b-wbqhs 1/1 Running 0 6s
  8. dubbo-demo-service-79574b6879-cxkls 1/1 Running 0 4h39m

4.3.2 验证启动结果

查看log,是否启动成功:

  1. ~]# kubectl -n app logs --tail=2 dubbo-demo-consumer-b8d86bd5b-wbqhs
  2. Dubbo client started
  3. Dubbo 消费者端启动

检查dubbo-monitor是否已经注册成功:
K8S(09)交付实战-通过流水线构建dubbo服务 - 图8

4.3.3 添加dns解析

  1. vi /var/named/zq.com.zone
  2. dubbo-demo A 10.4.7.10
  3. # 重启服务
  4. systemctl restart named
  5. # 验证
  6. ~]# dig -t A dubbo-demo.zq.com @10.4.7.11 +short
  7. 10.4.7.10

浏览器访问[http://dubbo-demo.zq.com/hello?name=lg](http://dubbo-demo.zq.com/hello?name=lg)
K8S(09)交付实战-通过流水线构建dubbo服务 - 图9

4.4 模拟版本升级

接下来我们模拟升级发版,之前已经用同一个镜像打了不同的tag并推送到从库
当然正常发版的顺序是:

  1. 提交修改过的代码的代码块
  2. 使用jenkins构建新镜像
  3. 上传到私有harbor仓库中
  4. 更新de文件并apply

    4.4.1 修改dp.yaml资源配置清单

    修改harbor镜像仓库中对应的tag版本:
    1. sed -i 's#master_200506_1430#master_200510_1430#g' dp.yaml

    4.4.2 应用修改后的资源配置清单

    当然也可以在dashboard中进行在线修改:
    1. kubectl apply -f http://k8s-yaml.zq.com/dubbo-consumer/dp.yaml
    2. ~]# kubectl -n app get pod
    3. NAME READY STATUS RESTARTS AGE
    4. dubbo-demo-consumer-84f75b679c-kdwd7 1/1 Running 0 54s
    5. dubbo-demo-service-79574b6879-cxkls 1/1 Running 0 4h58m
    K8S(09)交付实战-通过流水线构建dubbo服务 - 图10

    4.4.3 使用浏览器验证

    使用浏览器验证:http://dubbo-demo.zq.com/hello?name=lg
    在短暂的超时后,即可正常访问
    至此,我们一套完成的dubbo服务就已经交付到k8s集群当中了,并且也演示了如何发版。