一、概述

Git:一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。

Jenkins:一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作。

Maven:项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。

Harbor:构建企业级私有Docker镜像的仓库的开源解决方案。

Kubernetes:一个开源的,用于管理云平台中多个主机上的容器化的应用。


二、Java镜像构建

启动脚本run.sh:

  1. #!/bin/sh
  2.  
  3. java ${JVM_OPTS} ${JAVA_OPTS} -jar *.jar ${CLI_OPTS} 2>&1 | tee -a ${OUTPUT}

构建脚本Dockerfile:

  1. # 基础镜像
  2. FROM hub.jhmy.com/base/centos
  3.  
  4. # 维护者
  5. MAINTAINER leozhang
  6.  
  7. # 切换目录
  8. WORKDIR /root
  9.  
  10. # 添加环境变量
  11. ENV JDK_VERSION=jdk1.8.0_191
  12. ENV JAVA_HOME=/usr/local/$JDK_VERSION
  13. ENV PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/lib/
  14.  
  15. ENV JAVA_OPTS='' CLI_OPTS='' OUTPUT='logs/output.log'
  16. ENV JVM_OPTS='-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=2'
  17.  
  18. # 设置时区语言
  19. ENV TZ='Asia/Shanghai'
  20. ENV LANG='C.UTF-8' LANGUAGE='C.UTF-8' LC_ALL='C.UTF-8'
  21.  
  22. # 添加程序包
  23. ADD $JDK_VERSION.tar.gz /usr/local/
  24. COPY run.sh .
  25.  
  26. # 执行命令
  27. RUN chmod a+x run.sh && rm -rf `ls | grep -v "^run.sh$"` && mkdir -p /root/logs
  28.  
  29. # 构建镜像示例
  30. # docker build -t hub.jhmy.com/base/java:1.8 .
  31. # 启动容器示例
  32. # docker run -dit --name=java hub.jhmy.com/base/java:1.8

环境变量说明:

  1. JDK_VERSION:用于指定jdk包版本(需要提前下载好jdk软件包,且保证解压后名称一致)
  1. JVM_OPTS:用于指定jvm运行参数
  1. JAVA_OPTS:用于指定java自定义参数
  1. CLI_OPTS:用于指定其他命令行参数
  1. OUTPUT:用于指定服务运行日志保存路径
  2.  
  3. 注意:
    -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=2
    用于jvm自动识别容器内存限制以及自动分配内存大小(jdk10版本之后则不需要设置)

更多详情>>>容器中的JVM资源该如何被安全的限制?


三、Java项目镜像构建

增加项目依赖脚本addPlugins.py:

  1. # -*- coding:utf-8 -*-
  2. # ****************************
  3. # Author :leozhang
  4. # Date :2020/7/16
  5. # File :addPlugins.py
  6. # Description :增加POM文件依赖
  7. # ****************************
  8. import os
  9. pomplug=os.environ["PLUGINS"]
  10.  
  11. newpom = ""
  12. with open("pom.xml", "r+") as fp:
  13. for line in fp.readlines():
  14. if(line.find("<build>") != -1):
  15. line += "\n" + pomplug + "\n"
  16. newpom += line
  17.  
  18. with open("pom.xml", "r+") as f:
  19. f.write(newpom)print(newpom)

构建脚本Dockerfile:

  1. # 基础镜像
  2. FROM hub.jhmy.com/base/java:1.8
  3.  
  4. # 维护者
  5. MAINTAINER leozhang
  6.  
  7. # 工作目录
  8. WORKDIR /root
  9.  
  10. # 复制文件到镜像
  11. COPY *.jar .
  12. COPY lib/ lib/
  13.  
  14. # 查看当前目录
  15. RUN ls -l .
  16.  
  17. # 容器启动时运行命令
  18. CMD ["./run.sh"]
  19.  
  20. # 构建镜像示例
  21. # docker build -t hub.jhmy.com/test/appservice .
  22. # 启动容器示例
  23. # docker run -dit --name=appservice hub.jhmy.com/test/appservice

镜像构建脚本buildImage.sh:

  1. #!/bin/sh
  2. # creator: leozhang
  3. # up-date: 2020/03/21
  4. # description: buildImage.sh
  5.  
  6. # 公共参数
  7. env=$1
  8. name=$2
  9. tag=$3
  10. file=$4
  11.  
  12. # 设置仓库地址和账户
  13. harbor=hub.jhmy.com
  14. username=jenkins
  15. password=$(echo Q2hpc2NkY0AxMjMK | base64 -d)
  16.  
  17. # 修改镜像名称为小写
  18. image=${harbor}/${env}/$(echo ${name} | tr '[A-Z]' '[a-z]')
  19.  
  20. # 默认名Dockerfile
  21. if [ ! "${file}" ] ;then
  22. file=Dockerfile
  23. fi
  24.  
  25. # 构建镜像
  26. echo "************* build image ***************"
  27. docker build -t ${image}:${tag} -f ${file} .
  28.  
  29. echo "************* push image ***************"
    # 登录仓库
  30. docker login -u ${username} -p ${password} https://${harbor}
  31. # 上传镜像
    docker push ${image}:${tag}
  32.  
  33. # 如果非latest标签,则更新latest标签镜像
  34. if [ "${tag}" != "latest" ]; then
  35. docker tag ${image}:${tag} ${image}:latest
  36. docker push ${image}:latest
  37. fi
    # 登出仓库
  38. docker logout https://${harbor}

四、Java项目容器化部署

Deployment文件:

  1. apiVersion: apps/v1 # 资源版本
  2. kind: Deployment #资源类型
  3. metadata: #资源元数据:名称、命名空间等
  4. name: appservice
  5. namespace: default
  6.  
  7. spec:
  8. replicas: 3 #副本数
  9. selector: #选择器
  10. matchLabels:
  11. app: appservice
  12.  
  13. template: #Pod模板
  14. metadata: #Pod元数据:标签、注解等
  15. labels:
  16. app: appservice
  17. annotations:
  18. version: ""
  19.  
  20. spec: #Pod配置:名称、镜像、拉取策略、端口等
  21. containers:
  22. - name: appservice
  23. image: hub.jhmy.com/test/appservice:latest
  24. imagePullPolicy: Always
  25.  
  26. env: #环境变量
  27. - name: JAVA_OPTS
  28. value: "-Dprops=/root/appservice.properties -Dlogpath=/root/logs"
  29. ports:
  30. - name: dubbo
  31. containerPort: 20114
  32.  
  33. resources: #资源限制:cpu、mem
  34. limits:
  35. memory: 2Gi
  36. cpu: 1
  37.  
  38. livenessProbe: #就绪检测&生存检测:初始时间、超时、检测方式等
  39. initialDelaySeconds: 60
  40. timeoutSeconds: 10
  41. tcpSocket:
  42. port: 20114
  43. readinessProbe:
  44. initialDelaySeconds: 20
  45. timeoutSeconds: 10
  46. tcpSocket:
  47. port: 20114
  48.  
  49. volumeMounts: #存储挂载
  50. - name: config
  51. mountPath: /root/appservice.properties
  52. subPath: appservice.properties
  53. - name: log
  54. mountPath: /root/logs
  55.  
  56. volumes: #存储声明:服务配置、持久化存储请求、本地存储
  57. - name: config
  58. configMap:
  59. name: appservice
  60. - name: log
  61. hostPath:
  62. path: /home/ymt/logs/appservice
  63. type: DirectoryOrCreate
  64.  
  65. #affinity: #节点亲和性
  66. # nodeAffinity:
  67. # requiredDuringSchedulingIgnoredDuringExecution:
  68. # nodeSelectorTerms:
  69. # - matchExpressions:
  70. # - key: app
  71. # operator: In
  72. # values:
  73. # - appservice

ConfigMap文件:

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: appservice
  5. namespace: default
  6. data:
  7. appservice.properties: |-
  8. server.port=20114
       ......
    ......
    ......

Service文件:

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: apprestserver
  5. namespace: default
  6. spec:
  7. selector:
  8. app: apprestserver
  9. ports:
  10. - name: rest
  11. port: 20114

五、Jenkins持续部署

Pipeline任务脚本:

  1. def NOW = new Date().format("yyyyMMddHHmmss")
  2. def SERVER = env.JOB_BASE_NAME.toLowerCase()
  3. pipeline {
  4. agent any
  5. // parameters {
  6. // string(name: 'TAG', defaultValue: 'latest', description: '镜像标签' )
  7. // string(name: 'BRANCH', defaultValue: 'test_0629', description: '分支名称' )
  8. // string(name: 'URL', defaultValue: 'http://10.88.88.226:8090/jhmy/source/wx_v1/appdataservicetemp.git', description: '项目地址' )
  9. // string(name: 'PLUGINS', defaultValue: '<plugins> <plugin> ...... </plugin> </plugins> ', description: '相关依赖' )
  10. //
  11.  
  12. environment {
  13. ENV="test"
  14. MVN="/application/mvnBranch/bin/mvn"
  15. SCRIPT="${JENKINS_HOME}/workspace/Docker/updateConfigs/script"
  16. }
  17.  
  18. stages {
  19. stage('Git Clone') {
  20. steps {
  21. git branch: '${BRANCH}', credentialsId: 'yf3b_gitlab', url: '${URL}'
  22. }
  23. }
  24.  
  25. stage('Clean Package') {
  26. steps {
  27. sh "python ${SCRIPT}/addPlugins.py"
  28. sh "${MVN} clean package -Dmaven.test.skip=true"
  29. }
  30. post { success { archiveArtifacts "target/*.jar" } }
  31. }
  32.  
  33. stage('Build Image') {
  34. steps {
  35. dir('target') {
  36. sh "cp ${SCRIPT}/Dockerfile-jar Dockerfile"
  37. sh "sh ${SCRIPT}/buildImage.sh ${ENV} ${SERVER} ${TAG}"
  38. }
  39. }
  40. }
  41.  
  42. stage('Rolling Update') {
  43. steps {
  44. sh "kubectl config use-context k8s-ymt"
  45. sh """kubectl patch deployment ${SERVER} --patch '{"spec":{"template":{"metadata":{"annotations":{"version":"${NOW}"}}}}}'"""
  46. sh "sleep 30 && kubectl get pod -o wide | grep ${SERVER}"
  47. }
  48. }
  49.  
  50. stage('Clean up') {
  51. steps { deleteDir() }
  52. }
  53. }
  54. }

作者:Leozhanggg

出处:https://www.cnblogs.com/leozhanggg/p/12069994.html

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

Kubernetes实战总结 - DevOps实现的更多相关文章

  1. Kubernetes实战 - 从零开始搭建微服务 - 1.5 提高可用性-发布多节点的Node/Express网络应用程序

    1.5 提高可用性-发布多节点的Node/Express网络应用程序 Kubernetes实战 - 从零开始搭建微服务 前言 在上一篇文章中,已经学习了如何简单地开发一个单层网络应用.[Kuberne ...

  2. 2020 最新 Kubernetes实战指南

    1.Kubernetes带来的变革   对于开发人员 由于公司业务多,开发环境.测试环境.预生产环境和生产环境都是隔离的,而且除了生产环境,为了节省成本,其他环境可能是没有日志收集的,在没有用k8s的 ...

  3. 新书推荐《再也不踩坑的Kubernetes实战指南》

      <再也不踩坑的Kubernetes实战指南>终于出版啦.目前可以在京东.天猫购买,京东自营和当当网预计一个星期左右上架. 本书贴合生产环境经验,解决在初次使用或者是构建集群中的痛点,帮 ...

  4. kubernetes实战(二十六):kubeadm 安装 高可用 k8s v1.16.x dashboard 2.x

    1.基本配置 基本配置.内核升级.基本服务安装参考https://www.cnblogs.com/dukuan/p/10278637.html,或者参考<再也不踩坑的Kubernetes实战指南 ...

  5. kubernetes实战(二十七):CentOS 8 二进制 高可用 安装 k8s 1.16.x

    1. 基本说明 本文章将演示CentOS 8二进制方式安装高可用k8s 1.16.x,相对于其他版本,二进制安装方式并无太大区别.CentOS 8相对于CentOS 7操作更加方便,比如一些服务的关闭 ...

  6. kubernetes实战(二十八):Kubernetes一键式资源管理平台Ratel安装及使用

    1. Ratel是什么? Ratel是一个Kubernetes资源平台,基于管理Kubernetes的资源开发,可以管理Kubernetes的Deployment.DaemonSet.Stateful ...

  7. kubernetes实战(二十九):Kubernetes RBAC实现不同用户在不同Namespace的不同权限

    1.基本说明 在生产环境使用k8s以后,大部分应用都实现了高可用,不仅降低了维护成本,也简化了很多应用的部署成本,但是同时也带来了诸多问题.比如开发可能需要查看自己的应用状态.连接信息.日志.执行命令 ...

  8. kubernetes实战(三十):CentOS 8 二进制 高可用 安装 k8s 1.17.x

    1. 基本说明 本文章将演示CentOS 8二进制方式安装高可用k8s 1.17.x,相对于其他版本,二进制安装方式并无太大区别. 2. 基本环境配置 主机信息 192.168.1.19 k8s-ma ...

  9. Kubernetes实战 - 从零开始搭建微服务 1 - 使用kind构建一个单层架构Node/Express网络应用程序

    使用kind构建一个单层架构Node/Express网络应用程序 Kubernetes实战-从零开始搭建微服务 1 前言 准备写一个Kubernetes实战系列教程,毕竟cnblogs作为国内最早的技 ...

随机推荐

  1. Redis五种数据类型应用场景

    目录 1.1 回顾 2.1 应用场景 2.1.1 String 2.1.2 Hash 2.1.3 List 2.1.4 Zet 2.1.5 zset 3.1 小结 1.1 回顾 Redis的五种数据类 ...

  2. Dubbo想要个网关怎么办?试试整合Spring Cloud Gateway

    一.背景 在微服务架构中 API网关 非常重要,网关作为全局流量入口并不单单是一个反向路由,更多的是把各个边缘服务(Web层)的各种共性需求抽取出来放在一个公共的"服务"(网关)中 ...

  3. caffe的python接口学习(2)生成solver文件

    caffe在训练的时候,需要一些参数设置,我们一般将这些参数设置在一个叫solver.prototxt的文件里面 有一些参数需要计算的,也不是乱设置. 假设我们有50000个训练样本,batch_si ...

  4. node+ajax实战案例(3)

    3.用户注册实现 3.1.注册用户功能的实现逻辑 1 用户在表单上输入注册信息 2 点击注册后,收集用户在表单上输入的注册信息并且发送给后台 3 后台接收用户发送过来的注册信息 4 后台需要处理数据并 ...

  5. 【数位dp+状压】XHXJ 's LIS

    题目 define xhxj (Xin Hang senior sister(学姐)) If you do not know xhxj, then carefully reading the enti ...

  6. 理解与使用Javascript中的回调函数

    在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因 ...

  7. 6.30集训模拟赛4(炸裂的一天qwq)

    T1浇水: 题目描述 在一条长n米,宽m米米的长方形草地上放置着k个喷水装置.假设长方形草地的坐标范围为[ 0 , 0 ] ~ [ n , m ],那么第 i 个喷水装置的位置为(ai,m/2),也就 ...

  8. java语言基础-start

    计算机基础 1.1 计算机以二进制存储数据 十进制数据转成二进制数据:使用除以2获取余数的方式 二进制数据转成十进制数据:使用8421编码的方式 1.2 字节 位(bit):一个数字0或者一个数字1, ...

  9. 如何针对 iPhone X 设计网站?

    在全面屏的 iPhone X 上,不需要而外的代码,Safari 可以非常完美的展示现有的网站.整个网站的内容都会自动地展示在一个“安全区域”内,并不会被四周的圆角或者“小刘海”遮挡住. Safari ...

  10. 成熟度模型:企业规模化推广敏捷和DevOps利器

    摘要: 本文介绍了成熟度模型在软件开发行业的应用,重点阐述了成熟度模型对于敏捷和DevOps在企业中进行规模化推广的价值,探讨了成熟度模型的设计原则,并对于如何明智使用成熟度模型给出了建议. 导言 在 ...