cicd的结合组件

需要代码仓库如gitlab、github。包构建工具Maven等,持续集成工具如jenkins,github/cicd。结合自己脚本实现重复式任务自动化。

传统服务发布流程:

提交代码到仓库使用maven工具构建包,发布到指定服务器上(正式测试等),调用脚本或ansible执行发布。

传统存在问题:

传统服务常见的是通过负载均衡器更新单个服务测试好在挂载。需要部署多个环境,重复性操作。通过k8s可以把多个环境放置不同的namespace中,通过yaml文件去指定不同namespace,ingress-controller来控制不同域名。实现分流测试。

容器部署:

git提交代码maven构建,然后build镜像,将镜像push到私有库。k8s运行进行健康检查。多个环境只需构建一次即可。有不同环境相关东西,可以写入configmap中挂载进去,比如不同环境连接数据库,不要写死地址,通过环境变量去拿相应的地址。k8s传入需要的环境变量。上线后可以通过service version实现A B版本权重分流测试,或通过controller-ingress进行分流及AB版本测试。

环境安装:

宿主机环境安装git、maven、jenksion

jenkins 官网下载地址:jenkins.io

下载包后直接后台运行

  1. nohup java -jar jenkins.war --httpPort=8081 &

进入jenkins后台

创建一个新的job

构建一个流水线pipeline管道

通过script去构建cicd

###通过点击右侧可以出现一个构建基本模板。更多语法可以参考pipeline语法。

定义Pipoline script

  1. node {
  2. env.BUILD_DIR = "/root/build-workspace" #定义build目录
  3. env.MODULE = "web-demo" #定义当前名称
  4. env.HOST = "www.cswjh.com" #定义ingress 域名
  5. stage('Preparation') { // for display purposes
  6. // Get some code from a GitHub repository
  7. git 'http://172.17.166.172/root/k8s-web-demo.git' #拷贝代码
  8. }
  9. stage('maven build'){//build images
  10.  
  11. sh "mvn -pl ${MODULE} -am clean package" #构建包
  12. }
  13. stage('build images'){//build docker images
  14.  
  15. sh "/root/script/build-image-web.sh" #执行build 及push脚本
  16. }
  17. stage('Deplay'){//kubectl apply
  18.  
  19. sh "/root/script/deploy.sh" #k8s部署
  20. }
  21.  
  22. }

build-image-web.sh

  1. #!/bin/bash
  2. if [ ${BUILD_DIR} == "" ];then #判断jenkins 默认定义的变量 build目录是否生效
  3. echo "env 'BUILD_DIR' is not set"
  4. exit 1
  5. fi
  6.  
  7. DOCKER_DIR=${BUILD_DIR}/${JOB_NAME} #在build目录下创建一个工作目录 工作目录以jenkins默认变量 name命名
  8.  
  9. echo "${DOCKER_DIR}" #输出当前docker 工作目录
  10.  
  11. if [ ! -d ${DOCKER_DIR} ];then #判断目录是否存在 不存在则建立
  12. mkdir -p ${DOCKER_DIR}
  13. fi
  14.  
  15. echo "docker workspace: ${DOCKER_DIR}" #docker 工作目录
  16.  
  17. JENKINS_DIR=${WORKSPACE}/${MODULE} #定义jenksin目录 取jenksin默认变量 jenksion的工作目录下的预定义web-demo目录
  18.  
  19. echo "jenkins workspace: ${JENKINS_DIR}" #输出目录变量是否生效
  20.  
  21. if [ ! -f ${JENKINS_DIR}/target/*.war ];then #查看工作目录下 是否存在war包 无war包则退出
  22. echo "target/*.war not found"
  23. exit 1
  24. fi
  25.  
  26. cd ${DOCKER_DIR} #跳转docker build 目录
  27.  
  28. rm -rf * #删除上个构建留下东西
  29.  
  30. unzip -oq ${JENKINS_DIR}/target/*.war -d ./ROOT #将war包解压到当前文件中 或使用docker 中
  31.  
  32. mv ${JENKINS_DIR}/Dockerfile . ##将jenksion web-demo工作目录下的Dockerfile 移动到docker build工作目录中
  33.  
  34. if [ -d ${JENKINS_DIR}/dockerfiles ];then #如果存在dockerfiles目录也移动到当前目录中 dockerfiles中包含了启动脚本文件 及前台运行命令
  35. mv ${JENKINS_DIR}/dockerfiles .
  36. fi
  37.  
  38. VERSION=$(date +%Y%m%d%H) #为镜像生成时间序列
  39.  
  40. IMAGE_NAME=172.17.166.217/kubenetes/${JOB_NAME}:${VERSION} #为镜像命名 以时间序列为版本号
  41.  
  42. echo "${IMAGE_NAME}" > ${WORKSPACE}/IMAGE #将镜像版本输入一个文件进行存储方便k8s .yaml取到
  43.  
  44. echo "building image:${IMAGE_NAME}" #输出images 信息
  45.  
  46. docker build -t ${IMAGE_NAME} . #构建dockerfile
  47.  
  48. docker push ${IMAGE_NAME} #镜像上传到版本库中

build-image-web.sh

deploy.sh

  1. #!/bin/bash
  2.  
  3. name=${JOB_NAME} #jenkins 当前job名称
  4. image=$(cat ${WORKSPACE}/IMAGE) #镜像地址及名称
  5. host=${HOST} #ingress 域名
  6.  
  7. echo "deploying ... name: ${name} ,image: ${image},host: ${host}" #查看当前变量是否生效
  8.  
  9. rm -f web.yaml #删除当前目录下web.yaml文件
  10.  
  11. cp $(dirname "${BASH_SOURCE[0]}")/template/web.yaml ./ #将模板文件导入到当前目录下
  12.  
  13. sed -i "s,{{name}},${name},g" web.yaml #替换模板文件中name名称
  14. sed -i "s,{{image}},${image},g" web.yaml #替换模板文件中image 地址
  15. sed -i "s,{{host}},${host},g" web.yaml #替换ingress中域名
  16.  
  17. kubectl apply -f web.yaml #执行kubernetes部署
  18.  
  19. cat web.yaml #查看文件是否定义成功
  20.  
  21. #健康检查
  22. sleep 5
  23. count=60
  24. success=0
  25. IFS="," #转换为数组
  26. while [ ${count} -gt 0 ]
  27. do
  28. replicas=$(kubectl get deployments.apps ${name} -o go-template='{{.status.replicas}},{{.status.updatedReplicas}},{{.status.readyReplicas}},{{.status.availableReplicas}}') #查看当前replicas数值
  29. echo "replicas: ${replicas}"
  30. arr=(${replicas})
  31. if [ "${arr[0]}" == "${arr[1]}" -a "${arr[1]}" == "${arr[2]}" -a "${arr[2]}" == "${arr[3]}" ];then #查看replicas各项数值是否相等
  32. echo "health check success"
  33. success=1
  34. break
  35. fi
  36. ((count--))
  37. sleep
  38. done
  39.  
  40. if [ ${success} -ne 1 ];then
  41. echo "health check failed"
  42. exit 1
  43. fi

deploy.sh

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: {{name}}
  5. spec:
  6. selector:
  7. matchLabels:
  8. app: {{name}}
  9. replicas: 4
  10. template:
  11. metadata:
  12. labels:
  13. app: {{name}}
  14. spec:
  15. containers:
  16. - name: {{name}}
  17. image: {{image}}
  18. ports:
  19. - containerPort: 8080
  20. ---
  21. #service
  22. apiVersion: v1
  23. kind: Service
  24. metadata:
  25. name: {{name}}
  26. spec:
  27. ports:
  28. - port: 80
  29. protocol: TCP
  30. targetPort: 8080
  31. selector:
  32. app: {{name}}
  33. type: ClusterIP
  34.  
  35. ---
  36. #ingress
  37. apiVersion: networking.k8s.io/v1
  38. kind: Ingress
  39. metadata:
  40. name: {{name}}
  41. spec:
  42. rules:
  43. - host: {{host}}
  44. http:
  45. paths:
  46. - pathType: Prefix
  47. path: /
  48. backend:
  49. service:
  50. name: {{name}}
  51. port:
  52. number: 80

web.yaml

github安装

  1. # GitLab Server 的搭建
  2.  
  3. 参考 https://about.gitlab.com/installation
  4.  
  5. ## 1. 准备工作
  6.  
  7. Centos7为例,准备一台至少内存为4G的机器。
  8.  
  9. ## 2. 安装依赖软件
  10.  
  11. ```
  12. sudo yum install -y git vim gcc glibc-static telnet
  13. sudo yum install -y curl policycoreutils-python openssh-server
  14. sudo systemctl enable sshd
  15. sudo systemctl start sshd
  16.  
  17. sudo yum install postfix
  18. sudo systemctl enable postfix
  19. sudo systemctl start postfix
  20. ```
  21.  
  22. ## 3. 设置gitlab安装源
  23.  
  24. 如果在国内的话,可以尝试使用清华大学的源。
  25.  
  26. 新建 /etc/yum.repos.d/gitlab-ce.repo,内容为
  27.  
  28. ```
  29. [gitlab-ce]
  30. name=Gitlab CE Repository
  31. baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
  32. gpgcheck=0
  33. enabled=1
  34. ```
  35.  
  36. 如果在国外的话,可以使用
  37.  
  38. ```
  39. curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
  40. ```
  41.  
  42. ## 4. 安装GitLab
  43.  
  44. 关于域名,如果要是设置域名,则如下,这个域名可以是真实购买的域名,如果您要把gitlab安装到公网比如阿里云上的话。
  45.  
  46. 如果只是想本地测试,则可以像下面一样,设置一个example的域名,然后记得在本地你的笔记本设置host,如果是MAC就在 /etc/hosts里添加 一行 `192.168.211.10 gitlab.example.com`
  47.  
  48. ```
  49. sudo EXTERNAL_URL="http://gitlab.example.com" yum install -y gitlab-ce
  50. ```
  51.  
  52. 如果不想设置域名,或者想将来再考虑,可以直接
  53.  
  54. ```
  55. sudo yum install -y gitlab-ce
  56. ```
  57.  
  58. 安装完成以后,运行下面的命令进行配置
  59.  
  60. ```
  61. sudo gitlab-ctl reconfigure
  62. ```
  63.  
  64. ## 5. 登陆和修改密码
  65.  
  66. 打开http://gitlab.example.com/ 修改root用户密码,然后使用root和新密码登陆。
  67.  
  68. ![gitlab](img/gitlab-1.png)

gitlab-service安装

k8s入坑之路(16)kubernetes中CICD/基于宿主机jenkins的更多相关文章

  1. k8s入坑之路(7)kubernetes设计精髓List/Watch机制和Informer模块详解

    1.list-watch是什么 List-watch 是 K8S 统一的异步消息处理机制,保证了消息的实时性,可靠性,顺序性,性能等等,为声明式风格的API 奠定了良好的基础,它是优雅的通信方式,是 ...

  2. k8s入坑之路(15)kubernetes共享存储与StatefulSet有状态

    共享存储 docker默认是无状态,当有状态服务时需要用到共享存储 为什么需要共享存储: 1.最常见有状态服务,本地存储有些程序会把文件保存在服务器目录中,如果容器重新启停则会丢失. 2.如果使用vo ...

  3. k8s入坑之路(10)kubernetes coredns详解

    概述 作为服务发现机制的基本功能,在集群内需要能够通过服务名对服务进行访问,那么就需要一个集群范围内的DNS服务来完成从服务名到ClusterIP的解析. DNS服务在kubernetes中经历了三个 ...

  4. k8s入坑之路(2)kubernetes架构详解

    每个微服务通过 Docker 进行发布,随着业务的发展,系统中遍布着各种各样的容器.于是,容器的资源调度,部署运行,扩容缩容就是我们要面临的问题.   基于 Kubernetes 作为容器集群的管理平 ...

  5. 【转载】k8s入坑之路(2)kubernetes架构详解

    每个微服务通过 Docker 进行发布,随着业务的发展,系统中遍布着各种各样的容器.于是,容器的资源调度,部署运行,扩容缩容就是我们要面临的问题. 基于 Kubernetes 作为容器集群的管理平台被 ...

  6. k8s入坑之路(11)kubernetes服务发现

    kubernetes访问场景 1.集群内部访问 2.集群内部访问外部 3.集群外部访问内部 1.集群内部访问 1.pod之间直接ip通讯(利用calico通过路由表经过三层将ip流量转发)由于容器之间 ...

  7. k8s入坑之路(4)kubenetes安装

    三种安装方法: 1.kubeadm 2.kubespray 3.二进制安装 kubespray安装kubernetes集群 优点: 1.kuberspray对比kubeadm更加简洁内部集成了kube ...

  8. k8s入坑之路(13)服务迁移(定时任务 微服务 传统服务)

    定时任务迁移kubernetes 服务迁移步骤 1.安装好java 2.安装好maven 项目打包 mvn package 测试传参运行 java -cp cronjob-demo-1.0-SNAPS ...

  9. k8s入坑之路(9)k8s网络插件详解

    Flannel: 最成熟.最简单的选择 Calico: 性能好.灵活性最强,目前的企业级主流 Canal: 将Flannel提供的网络层与Calico的网络策略功能集成在一起. Weave: 独有的功 ...

随机推荐

  1. Nginx系列(6)- nginx: [error] CreateFile() "D:\nginx-1.20.1/logs/nginx.pid" failed (2: The system cannot find the file specified)

    背景 修改nginx配置文件nginx.conf后,想要重启nginx使配置生效.cmd进入nginx安装目录,输入命令: nginx -s reload 报错:nginx: [error] Crea ...

  2. Linux系列(9) - whoami和whatis

    whoami 作用:当前你登录的用户是谁 whatis [命令] 作用:查询[命令]是干嘛的 我们试一下对文件和目录whatis行不行,结果发现不行:但是有没有发现对命令whatis也不行,为什么呢: ...

  3. Shell系列(21)- 字符截取命令printf

    作用 printf是标准格式输出命令,控制输出格式,不会自动加入换行符.awk会用到该条命令 命令 printf '输出类型输出格式' 输出内容 #''双引号不能少,输出类型和输出格式之间没有空格 输 ...

  4. golang 开发环境 配置 go语言 liteIDE

    Mac: * 下载go安装包 go语言中文网 ** 通过源码编译安装需要先安装go1.4 wget https://studygolang.com/dl/golang/go1.10.3.src.tar ...

  5. 一文让你彻底理解group by和聚合函数

    知道group by是进行分组查询,但是一直觉得对其理解得不够透彻,在网上扒了一篇文章,我认为写得非常好. 为什么不能够select * from Table group by id,为什么一定不能是 ...

  6. 使用Postman做接口测试(学生信息的6个接口)

    使用postman做接口测试,案例中涉及到接口有:获取学生信息.登录.添加学生信息.学生金币充值.获取所有学生信息.文件上传. 一.获取学生信息(get请求) 请求方式选择:get 直接在访问地址栏中 ...

  7. 『Python』matplotlib实现GUI效果

    1. 类RadioButtons的使用方法 类似单选框 import numpy as np import matplotlib.pyplot as plt import matplotlib as ...

  8. P4755-Beautiful Pair【笛卡尔树,线段树】

    正题 题目链接:https://www.luogu.com.cn/problem/P4755 题目大意 \(n\)个数字的一个序列,求有多少个点对\(i,j\)满足\(a_i\times a_j\le ...

  9. bootstrap inputfile 使用-上传,回显

    近期用bootstrap 做前端的上传,功能涉及到上传时就是召网上的教程随便弄一搜一大把,但是做到修改页面时候不知道页面该如何回显,折腾了一阵子才完成遂记录下来希望能给看到的小伙伴有点启发吧. 首先是 ...

  10. redis分片集群安装部署

    redis分片集群安装与部署 分片集群的优势 高可用.且方便扩展. 数据分片,多节点提供服务,提高性能,数据提供冗余备份. 分片集群部署 只需更改配置文件 部署架构:6个节点,3主3从.数据集分为3片 ...