文章转载自:https://kuboard.cn/guide/cicd/

下图展示了当前比较典型的持续构建集成的一种做法。

在是否自动将最新版本部署到 Kubernetes 环境这个问题上,可能会有多种做法。

手工触发

当容器镜像推送到 docker registry 中之后,手工触发是否更新 Kubernetes 环境中的容器镜像。这样做的主要理由是:

  • 提交代码以及构建镜像的操作频次太高,如果每次都自动触发测试环境的部署,会使得环境总是处于一种不稳定的状态
  • 微服务环境中,部署单元比较多,开发团队可能要求将两个或者更多相互依赖的部署单元(微服务)一起更新

如果使用手工触发,在使用 Kuboard 管理 Kubernetes 的情况下,只需要熟悉 Kuboard / Kubernetes 以下几个功能即可轻松完成 CI/CD:

  • 使用私有仓库中的 docker 镜像
  • 批量调整镜像版本 可以一次性更新多个容器的镜像版本
  • 假设在标签不变的情况下,对应的容器镜像已经更新,批量删除容器组 可以在 imagePullPolicy=Always 的情况下更新 Pod 的容器镜像

自动触发

当容器镜像推送到 docker registry 中之后,自动触发是否更新 Kubernetes 环境中的容器镜像。这样做的主要理由是:

  • 更完全的自动化,将手工操作降到最低

为了支持这种做法,Kuboard 在工作负载界面中提供了 CI/CD 脚本(需更新到 Kuboard v1.0.5-beta.2 以上),如下图所示:

更新镜像版本

通过更新镜像版本的脚本,可以直接在 shell 脚本中调用 Kuboard/Kubernetes API,更新对应容器镜像的标签。完成此接口调用后,Kubernetes 将自动完成滚动更新。

界面中提供的脚本里,容器的版本是当前 Kubernetes 中已部署的版本,通常在 Jenkins/GitlabRunner 之类的工具里,需要将该脚本的镜像标签参数化。如下所示:

# 注意curl命令参数中键值对的空格问题
export BUSY_BOX_TAG=1.29
curl -X PATCH \
-H "content-type:application/strategic-merge-patch+json" \
-H "Authorization:Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJvYXJkLXVzZXItdG9rZW4tcTlnemsiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoia3Vib2FyZC11c2VyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMmQyZWRkOTAtODU2Zi00MDA2LThjNTYtOTBmNjI0MzVkZGI2Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmt1Ym9hcmQtdXNlciJ9.hGeV_w3ouydhPAEGYAXMO646-97alroek00JbM4wSIUqM64rd30WAHQLKH2OsD3DR9zg3syXhCvVIgGu_ErMpaLIWFRiAJbOXJiaB0w7Haod-gc-dpL3ABz_IBqCJf5dOP-PDKHhgAEbjEl6b7-0HPTdwHFI0MHRwF0hoUbW8BpUHCzV_UlX5CqQ7Yz51pNivXkC40x2vng6Nx7MVz8enSH_9IoGdddBhkOSdhJgUkh-drWvXFe2ayGZv1mJRZSe-sXdyQFWpPh1W0nRR_CuIEA5I7eiWlIMYuZT5-llQvEjzXg2SqGGHqcqGr2DQnoIdI24Gwnyz1THYjC4pgKPlQ" \
-d '{"spec":{"template":{"spec":{"containers":[{"name":"busybox","image":"busybox:'$BUSY_BOX_TAG'"}]}}}}' \
"http://kuboard.demo.eip.work:/k8s-api/apis/apps/v1/namespaces/example/deployments/web-busybox"
参数化
脚本中添加了 export BUSY_BOX_TAG=1.29 语句
参数化时,对变量使用单引号,如上例中,将界面中直接复制下来的脚本中 "image":"busybox:1.28" 修改为 "image":"busybox:'$BUSY_BOX_TAG'"

删除Pod

假设在标签不变的情况下,对应的容器镜像已经更新,执行 删除Pod的脚本 可以在 imagePullPolicy=Always 的情况下更新 Pod 的容器镜像。

# 注意curl命令参数中键值对的空格问题
curl -X DELETE \
-H "Content-Type:application/yaml" \
-H "Authorization:Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJvYXJkLXVzZXItdG9rZW4tcTlnemsiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoia3Vib2FyZC11c2VyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMmQyZWRkOTAtODU2Zi00MDA2LThjNTYtOTBmNjI0MzVkZGI2Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmt1Ym9hcmQtdXNlciJ9.hGeV_w3ouydhPAEGYAXMO646-97alroek00JbM4wSIUqM64rd30WAHQLKH2OsD3DR9zg3syXhCvVIgGu_ErMpaLIWFRiAJbOXJiaB0w7Haod-gc-dpL3ABz_IBqCJf5dOP-PDKHhgAEbjEl6b7-0HPTdwHFI0MHRwF0hoUbW8BpUHCzV_UlX5CqQ7Yz51pNivXkC40x2vng6Nx7MVz8enSH_9IoGdddBhkOSdhJgUkh-drWvXFe2ayGZv1mJRZSe-sXdyQFWpPh1W0nRR_CuIEA5I7eiWlIMYuZT5-llQvEjzXg2SqGGHqcqGr2DQnoIdI24Gwnyz1THYjC4pgKPlQ" \
"http://kuboard.demo.eip.work:/k8s-api/api/v1/namespaces/example/pods?labelSelector=k8s.eip.work/layer%3dweb,k8s.eip.work/name%3dweb-busybox"
YAML文件在哪儿?
- Kuboard 的设计目标是,不使用 YAML 文件,就可以轻松完成 Kubernetes 部署。
- 当您需要 复制一个新的环境 时,从已有名称空间导出 YAML 文件,再到新的名称空间或 Kubernetes 集群导入
- 将导出的 YAML 文件备份到 git,可以使部署的脚本版本化

CI/CD集成的更多相关文章

  1. Kubernetes+Jenkins+Nexus+Gitlab进行CI/CD集成

    前面已经完成了 二进制部署Kubernetes集群,下面进行CI/CD集成. 一.流程说明 应用构建和发布流程说明: 1.用户向Gitlab提交代码,代码中必须包含Dockerfile: 2.将代码提 ...

  2. 物联网架构成长之路(47)-利用GitLab实现CI持续集成

    0.前言 前段时间,考虑到要练习部署一套CI/CD的系统.一开始考虑到Jenkins,随着这两天的了解,发现最新版的GitLab已经提供有CI/CD集成了.所以本次博客,干脆一步到位,直接用GitLa ...

  3. 普通用户使用CI/CD权限使用

    根据文章:授权用户访问名称空间 (https://www.cnblogs.com/sanduzxcvbnm/p/15015576.html) 进行有关操作后,普通用户点击 会报错如下信息: 解决办法: ...

  4. Jenkins和Gitlab CI/CD自动更新k8s中pod使用的镜像说明

    Jenkins 使用Jenkins的话,完成的工作主要有如下步骤: 1.从Gogs或Gitlab仓库上拉取代码 2.使用Maven编译代码,打包成jar文件 3.根据jar文件使用相对应的Docker ...

  5. 手把手详解持续集成之GitLab CI/CD

    一.环境准备 首先需要有一台 GitLab 服务器,然后需要有个项目:这里示例项目以 Spring Boot 项目为例,然后最好有一台专门用来 Build 的机器,实际生产中如果 Build 任务不频 ...

  6. CI/CD持续集成/持续部署 敏捷开发

    敏捷软件开发(英语:Agile software development),又称敏捷开发,是一种从1990年代开始逐渐引起广泛关注的一些新型软件开发方法,是一种应对快速变化的需求的一种软件开发能力.它 ...

  7. GitLab CI/CD持续集成设置

    GitLab CI/CD持续设置 官方文档地址(https://docs.gitlab.com/ee/ci/README.html) GitLab CI.CD功能非常完善,只需要简单几步,就可以完成项 ...

  8. 02: CI(持续集成)/CD(持续交付/持续部署)

    1.1 持续集成.持续交付 介绍   参考博客:https://www.cnblogs.com/cay83/p/8856231.html 1.传统交付 1. 传统软件的开发与交付的周期都很漫长,从需求 ...

  9. CI / CD /CD 持续集成 持续交付 持续部署

    CI / CD /CD 持续集成 持续交付 持续部署 CI CD 是啥?干了啥? CI continuous integration 持续集成 CD continuous delivery 持续交付 ...

随机推荐

  1. Java 内存模型,或许应该这么理解

    大家好,我是树哥. 在前面一段时间,我连续写了几篇关于并发编程的文章: 从 CPU 讲起,深入理解 Java 内存模型! - 陈树义的博客 深入理解 happens-before 原则 - 陈树义的博 ...

  2. C语言-typedef和#define

    1.关键字 typedef 为一个数据类型起一个新的别名,typedef 的用法一般为: typedef OldName NewName; 需要强调的是,typedef 是赋予现有类型一个新的名字,而 ...

  3. File类的概述和File类的静态成员变量

    File类概述:java.io.File类 文件和目录路径名的抽象表示形式 java把电脑中的文件和文件夹(目录)封账为了一个File类,我们可以使用File类对文件和文件夹进行操作 默认情况下,ja ...

  4. 练习-使用日期时间相关的API ,计算出一个人已经出生了多长时间

    程序分析:(1)使用Scanner类获取出生日期(2)使用DataFormat类中的方法parse,把字符串的出生日期解析为Data格式的出生日期(3)把Data格式的出生日期转化为毫秒值(4)获取当 ...

  5. APISpace 号码实时查询API接口 免费好用

    最近公司项目有一个号码实时查询的小功能,想着如果用现成的API就可以大大提高开发效率,所以在网上的API商店搜索了一番,发现了 APISpace,它里面的号码实时查询API非常符合我的开发需求.   ...

  6. 从零开始搭建Vue2.0项目(一)之快速开始

    从零开始搭建Vue2.0项目(一)之项目快速开始 前言 该样板适用于大型,严肃的项目,并假定您对Webpack和有所了解vue-loader.确保还阅读vue-loader的文档,了解常见的工作流程配 ...

  7. MySQL sql优化(摘抄自文档)

    前言 有人反馈之前几篇文章过于理论缺少实际操作细节,这篇文章就多一些可操作性的内容吧. 注:这篇文章是以 MySQL 为背景,很多内容同时适用于其他关系型数据库,需要有一些索引知识为基础. 优化目标 ...

  8. 在Mac Os(苹果)上用手机抓包软件Charles抓取微信小程序中的高清无水印视频

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_118 手机抓包是一名测试工程师常备的技能,比如我想查看一个接口请求的参数.返回值,还有移动设备上的http请求.https请求,这 ...

  9. MySQL Test Run 测试框架介绍

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 介绍 MySQL Test Run 简称MTR,是MySQL官方提供的自动化测试框架,执行脚本在发布路径的mysql-te ...

  10. Docker 容器虚拟化

    Docker 容器虚拟化 1.虚拟化网络 Network Namespace 是 Linux 内核提供的功能,是实现网络虚拟化的重要功能,它能创建多个隔离的网络空间,它们有独自网络栈信息.不管是虚拟机 ...