如何使用容器镜像服务 TCR 轻松实现容器 DevOps
作者周明,腾讯云容器产品工程师。目前主要负责腾讯云TKE、TCR等产品控制台的相关研发工作。
概述
当你使用云厂商提供的容器服务部署业务服务后,是否对交付部署全链路的效率有更高的需求,例如实现基于容器的 DevOps 服务,自动化地完成镜像构建以及集群内容器的镜像版本更新。腾讯云容器镜像服务 TCR 提供云原生应用交付流水线功能,全链路可追踪、可观测、可自主配置,让用户可以轻松实现代码提交变更后,自动触发镜像的构建和推送,并将镜像更新到容器服务 TKE、弹性容器服务 EKS 等平台创建的集群中,完成最终的交付,为企业级用户在腾讯云上提供一体化云原生 DevOps 解决方案。本文主要介绍如何使用容器镜像服务 TCR 轻松实现容器 DevOps。
容器镜像服务简介
容器镜像服务(Tencent Container Registry,TCR)是腾讯云提供的安全独享、高性能的容器镜像托管分发服务,支持 Docker 镜像、Helm Chart 存储分发及镜像安全扫描,为企业级客户提供了细颗粒度的访问权限管理和网络访问控制。
容器DevOps业务流程
DevOps 是 Development 和 Operations 的组合词,代表着重视「软件开发人员(Dev)」和「IT 运维技术人员(Ops)」之间沟通合作的文化;旨在透过自动化「软件交付」和「架构变更」的流程,使得构建、 测试、发布软件的过程能够更加地快捷、频繁和可靠。TCR 与容器服务 TKE、CODING DevOps 等产品无缝集成,在腾讯云上提供一体化云原生 DevOps 解决方案,容器 DevOps 的基本业务流程如图所示。
如何使用容器镜像服务轻松实现容器 DevOps
前提条件
准备 TCR 企业版实例,创建镜像仓库。
前往实例列表页面,新建企业版实例,关于如何创建可参考文档创建企业版实例,并在生成的实例中创建一个镜像仓库。
准备 TKE 标准集群,并部署容器应用
前往 容器服务控制台,新建 TKE 标准集群,可参考文档 创建集群。
当前容器服务 TKE 已支持在控制台内选择容器镜像服务 TCR 企业版镜像创建工作负载。同时,TKE 标准集群可安装 TCR 专属插件,实现内网及免密拉取 TCR 企业版内镜像,参考文档 使用 TCR 企业版实例内容器镜像创建工作负载。
开通 CODING DevOps 服务。
场景一:代码变动后自动构建镜像,并触发部署
操作场景
支持用户配置流水线,在代码变更后,自动构建镜像,并触发自动部署到容器平台。
操作步骤
配置交付流水线
登录容器镜像服务 TCR 控制台,选择左侧导航栏中的【交付流水线】,在“交付流水线”页面中,单击【新建】。
在“基本信息”步骤中,配置以下参数,然后单击【下一步:镜像配置】。
- 流水线名称:设置交付流水线名称。
- 流水线描述:为交付流水线添加描述信息,创建后可修改。
在“镜像配置”步骤中,配置以下参数,单击【下一步:应用部署】。
镜像仓库:选择交付流水线关联的镜像仓库,将自动配置镜像构建及推送,用于托管应用部署所需要的镜像。
镜像版本过滤
:支持对执行交付流水线中镜像的版本进行限制,可以过滤掉不需要执行部署的镜像版本。
- 直接部署任意版本:推送到镜像仓库的任意版本镜像都会被部署。
- 仅部署指定名称版本:需指定镜像版本,多个版本可以使用逗号分隔,非指定版本不会部署。
- 仅部署指定规则版本:需输入正则表达式。
镜像来源:支持平台构建镜像和本地推送镜像。平台构建镜像允许用户关联不同代码托管平台的代码仓库,当代码变动时自动触发交付流水线,完成自动构建、推送镜像以及应用部署;本地推送镜像支持用户在手动推送镜像时,也能触发应用部署。场景一中我们选择平台构建镜像。
代码源、代码仓库:选择用于构建镜像的代码仓库,流水线将拉取该代码仓库内源代码进行编译及构建,首次选择需要授权。目前已支持GitHub、公有GitLab、私有GitLab、码云以及工蜂等代码托管平台。
触发规则
:镜像构建被自动触发的规则条件。目前支持以下四种场景:
- 推送到指定分支触发:需指定分支。
- 推送新标签时触发构建:新建标签并推送时触发。
- 推送到分支时触发构建:推送至任意分支时触发,无需指定分支。
- 符合分支或标签规则时构建:需输入正则表达式,例如
^refs/heads/master$
,可匹配 master 分支进行触发。
Dockerfile 路径:镜像构建执行的操作基于代码仓库内的 Dockerfile,需指定该 Dockerfile 文件的路径。如不指定,默认为代码仓库根目录下名为 Dockerfile 的文件。
构建目录:镜像构建执行的工作目录,即上下文环境(context),默认为代码仓库的根目录。
版本规则:定义镜像构建生成的镜像名称,即镜像版本(tag)。支持配置自定义前缀,并组合加入“分支/标签”,“更新时间”,“commit号” 三个环境变量。其中,更新时间为执行 docker tag 指令时构建服务的系统时间。
在“应用部署”步骤中,配置以下参数,单击【确定】。
- 部署平台:交付流水线同时支持容器服务 TKE,弹性容器服务 EKS 及边缘容器服务 Edge。本文以容器服务 TKE 为例。
- 部署地域:目标集群所在地域。选择已创建的 TKE 标准集群所在地域。
- 部署集群:目标集群。选择已创建的 TKE 标准集群。
- 部署方式:当前仅支持 “更新已有工作负载”。
- 命名空间:已部署应用所在的命名空间。
- 工作负载:已部署应用的关联工作负载。
- Pod容器:已部署应用的工作负载内的 Pod 容器。
完成以上配置后,可在“交付流水线” 列表页查看新建的流水线。
更新容器应用
完成以上配置后,即可在更新应用代码后,自动触发镜像构建,推送及应用更新。
更新源代码
更新源代码,并提交至远端代码仓库。
执行流水线
源代码推送完成后,如符合镜像配置中镜像构建的触发条件,将触发流水线执行。可点击流水线查看该流水线执行记录,并查看具体步骤进度。
- Checkout:检出代码。
- Docker Build:基于镜像构建配置进行镜像构建,并为生成的镜像打上指定规则的Tag,如 v-{tag}-{date}-{commit}。
- Docker Push:推送镜像,自动推送至关联镜像仓库内。
- Deploy To TKE:使用最新推送的镜像更新关联工作负载及Pod 内同名镜像。
查看应用更新状态
前往容器服务 TKE 控制台,进入上述集群及工作负载详情页,并选择修订历史,可查看应用更新状态。如下图所示,v1版本是一开始手动部署的nginx镜像,流水线执行完成后更新为 v2 版本,使用的是自动构建出来的新的镜像。
可以直接访问该应用服务,查看是否已更新。通过查看 Servce 暴露到公网的地址,查看结果,可以看到服务已经更新。
场景二: 本地推送镜像后,自动触发部署
操作场景
在某些场景可能不需要使用 TCR 镜像自动构建能力,但又希望可以在推送镜像后能够自动部署到容器平台。TCR 支持用户配置本地推送镜像后,通过触发器的能力,自动触发镜像部署。
操作步骤
配置交付流水线
参考场景一配置新建一条交付流水线,与场景一的区别在“镜像配置”步骤中,将”镜像来源“选择为”本地推送镜像“。
更新容器应用
完成配置后,即可在本地使用命令行指令推送镜像,触发自动部署。
本地推送镜像
通过快捷指令我们可以登录腾讯云容器镜像服务 Docker Registry 并向 Registry 中推送镜像。例如这里推送一个 nginx 镜像。
执行流水线
本地推动镜像完成后,如符合镜像配置中镜像构建的触发条件,将触发流水线执行,由于此时镜像已经准备好,因此流水线只需要执行自动部署。
查看应用更新状态
同场景一,我们可以前往容器服务 TKE 控制台,进入上述集群及工作负载详情页,并选择修订历史,可查看应用更新状态,也可直接访问该应用服务,查看是否已更新。
总结
本文分两个场景介绍了如何使用容器镜像服务 TCR 实现容器 DevOps。场景一是代码变动后,自动触发镜像构建以及应用部署;场景二是本地推送镜像后自动触发应用部署。想要快速上手使用容器镜像服务 TCR、容器服务 TKE 实践 CD 流程,本文是个很好的参考。
【腾讯云原生】云说新品、云研新术、云游新活、云赏资讯,扫码关注同名公众号,及时获取更多干货!!
如何使用容器镜像服务 TCR 轻松实现容器 DevOps的更多相关文章
- 云原生交付加速!容器镜像服务企业版支持 Helm Chart
2018 年 6 月,Helm 正式加入了 CNCF 孵化项目:2018 年 8 月,据 CNCF 的调研表明,有百分之六十八的开发者选择了 Helm 作为其应用包装方案:2019 年 6 月,阿里云 ...
- Registry 容器镜像服务端细节
引言 通常我们在使用集群或者容器的时候,都会接触到存储在本地的镜像,也或多或少对本地镜像存储有一定的了解.但是服务端的镜像存储细节呢?本文主要介绍容器镜像的服务端存储结构,对于自建镜像服务或是对容器镜 ...
- .Net Core in Docker - 使用阿里云Codepipeline及阿里云容器镜像服务实现持续集成(CI)
前面已经介绍过了 .Net Core 程序发布到 Docker 容器的内容.但是每次通过 SSH 链接到服务器敲命令,运行脚本也是挺麻烦的一件事.程序员是最懒的,能让电脑解决的问题绝不手动解决,如果当 ...
- 容器镜像服务联手 IDE 插件,实现一键部署、持续集成与交付
容器技术提供了一种标准化的交付方式,将应用的代码以及代码环境依赖都打包在一起,成为一个与环境无关的交付物,可以被用在软件生命周期的任何阶段,彻底改变了传统的软件交付方式. 甚至可以说,是在容器技术之后 ...
- 容器镜像服务 联手 IDE 插件,实现一键部署、持续集成与交付
容器技术提供了一种标准化的交付方式,将应用的代码以及代码环境依赖都打包在一起,成为一个与环境无关的交付物,可以被用在软件生命周期的任何阶段,彻底改变了传统的软件交付方式. 甚至可以说,是在容器技术之后 ...
- [Docker镜像] 关于阿里云容器镜像服务的使用(以天池比赛提交镜像为例)
最近在参加天池比赛,由于比赛需要使用阿里云容器镜像服务完成线上预测任务,所以花费了3-4天的时间了解并使用Docker完成相关镜像操作,在此分享下我学习的内容,以下是本文的目录结构: 介绍 镜像 容器 ...
- 使用Aliyun Docker 容器镜像/注册表服务
1.前往阿里云容器镜像服务创建相关资源. 2.登录你的仓库,账户名+公共地址 docker login --username=xxxxxxxxx@aliyun.com registry.cn-hang ...
- docker基础属性简介包含镜像 容器 registry服务等概念及关系
Docker 镜像 我们都知道,操作系统分为内核和用户空间.对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持.而 Docker 镜像(Image),就相当于是一个 r ...
- 正式开放 | 阿里云 10 亿级镜像服务正式支持 Helm Charts,云原生交付再加速!
作者 | 阿里巴巴高级开发工程师 谢于宁(予栖) 2018 年 6 月,Helm 正式加入了 CNCF 孵化项目: 2018 年 8 月,据 CNCF 的调研表明,有百分之六十八的开发者选择了 Hel ...
随机推荐
- 老猿学5G扫盲贴:NEF、NRF、AF、UPF以及DN的功能
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 NEF:Network Exposure Function ,网络开放 ...
- 被老猿误解的Python匿名函数lambda
在<第2.3节 Python运算符大全>老猿这样描述lambda:"上述运算符中有个lambda,这是个lambda就是用来定义一个匿名函数的.老猿认为用处不大,具体内容大家可以 ...
- PyQt(Python+Qt)学习随笔:QTreeWidgetItem项是否禁用disable、隐藏isHidden和允许选中isSelected
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 树型部件QTreeWidget的项QTreeWidgetItem对象具有是否禁用disable.是否 ...
- 自学linux——21. NFS服务器的搭建
NFS服务器的搭建 1.NFS的认识 NFS(Network File System即网络文件系统)服务最大的功能就是可以透过网络,让不同的机器.不同的操作系统.可以彼此分享文件,可以将远程 Linu ...
- baby sqli 联合查询加入数据 手工注入
0x00 BabySQli 原题目描述:刚学完sqli,我才知道万能口令这么危险,还好我进行了防护,还用md5哈希了密码! 登陆页面,查看源码后点进search.php看到一段可疑的句子MMZFM42 ...
- 性能测试学习之路 (一)认识jmeter(性能测试流程 && 性能测试通过标准 &&jmeter体系结构)
性能测试是通过自动化的测试工具模拟多种正常.峰值以及异常负载条件来对系统的各项性能指标进行测试. 1 性能测试技能树 性能测试是一项综合性的工作,致力于暴露性能问题,评估系统性能趋势.性能测试工作实质 ...
- 团队作业 需求改进&系统设计
PaChat聊天系统 一.需求&原型改进: 1.针对课堂讨论环节老师和其他组的问题及建议,对修改选题及需求进行修改 问题1:功能划分条理不够清晰. 修改1:改为流程图的形式. 问题2:功能不能 ...
- 在iframe中获取另一个iframe中的元素
$(top.parent.iframeId).contents().find("#selector") //iframeId为iframe的id名称
- 题解-CF1282E The Cake Is a Lie
题面 CF1282E The Cake Is a Lie \(T\) 组测试数据.每次给一个 \(n\) 边形的三角剖分,求节点顺序和剖分顺序. 数据范围:\(3\le n\le 10^5\),\(\ ...
- Acwing 405. 将他们分好队
大型补档计划 题目链接 看到分成两组,想到二分图判定 + 染色. 二分图的特点是两个有矛盾的点连一条边,考虑在这道题中,如果 \(a, b\) 中有一个人不认识对方(或者两个人互不认识),就不可能分在 ...