部署到 K8S
持续集成是敏捷开发的重要实践之一,它倡导团队通过自动化构建工具频繁地验证软件可用性,从而尽早发现集成错误并集中精力改善软件质量。
本文将使用 CODING DevOps 与腾讯云容器服务(下称 TKE)实践 Ruby + Sinatra 应用开发。本文涵盖单元测试、构建 Docker 镜像、推送到制品库、部署到 K8s 集群等环节,讲述如何实现项目的自动化构建、测试、发布、部署。
前置准备
将制品库凭证录入至 TKE
因 K8s 集群从制品库拖取镜像需要访问凭证,需要将 CODING 项目中的 Docker 制品仓库的配置凭据导入至 TKE。输入密码后复制系统自动生成的访问令牌:
设置凭证中包含三重信息:
- 库域名:
StrayBirds-docker.pkg.coding.net
- 用户名:
ruby****
- 密码:
1261*****
在 TKE 集群中点击「集群」→「配置管理」→「Secret」,将制品仓库凭据进行录入。
录入集群凭据
持续集成提供默认构建机,其出口 IP 地址为固定网段地址。可通过查阅持续集成-默认构建节点获取最新 IP 地址列表。
- 复制集群 APIServer 信息中的
Kubeconfig
,将其录入至「项目设置」->「开发者选项」->「凭据管理」中。凭据类型选择「Kubernetes 凭据」并勾选所有持续集成计划授权。
在集群中创建 Deployment
为方便将应用部署 K8s 集群中,需要先创建 Deployment 工作负载,之后就可以通过持续集成任务反复将新构建的应用镜像部署到 K8s 集群上。
点击「工作负载」→「Deployment」中的新建按钮。
由于现在还没有构建物镜像,此处选用 nginx 镜像进行代替,以确保 Deployment 正常运行。
在访问设置中填写所需开放的容器端口,确认无误后完成 Workload 创建。
配置构建计划
点击项目左侧菜单栏中的「持续集成」功能,轻点右上角的「创建构建计划」按钮,选择「自定义构建过程」模板。
Ruby + Sinatra 应用持续集成过程分成 6 个阶段:
- 开始阶段
- 运行单元测试
- 构建 Docker 镜像
- 推送到制品库
- 部署到 K8s 集群
1. 开始阶段
此阶段是默认生成的,几乎所有持续集成的构建计划都会包含此阶段。在这个阶段中可以配置一些全局使用的参数,例如构建基础环境、环境变量等。本实践需要在此处添加 3 个环境变量,以便被后续阶段所引用。
-
CODING_DOCKER_REG_HOST
:制品库主机,用于登录制品库。 -
DOCKER_IMAGE_NAME
:Docker 镜像名称,用于构建和推送镜像。 -
TKE_CLUSTER_CREDENTIAL_ID
:TKE 集群凭据 ID。
你可以参考下图进行命令填写或替换:
TKE 的集群凭据 ID 填写在上文中录入的 Kubernetes 凭据。
2. 配置单元测试阶段
「检出」阶段不作修改。在图形化编辑器中点击蓝色 + 号新建阶段,命名为单元测试。在步骤中添加「执行 Pipeline 脚本」,填写下文中的示例测试代码:
docker.image('ruby:2.6').withRun('-v $(pwd):/app -w /app') { c ->
sh 'bundle install'
sh 'rake test'
}
3. 构建 Docker 镜像阶段
新建阶段并命名为构建 Docker 镜像。在步骤中添加「执行 Pipeline 脚本」,填写下文中的示例代码:
docker.build("${env.DOCKER_IMAGE_NAME}:${env.GIT_BUILD_REF}")
此处涉及的环境变量已在「开始阶段」中进行配置,而标签所内置的环境变量 GIT_BUILD_REF
的值对应检出代码步骤中的 Git 修订版本号。
4. 推送到制品库阶段
新建阶段并命名为构建 Docker 镜像。在步骤中添加「执行 Pipeline 脚本」,填写下文中的示例代码:
docker.withRegistry("https://${env.CODING_DOCKER_REG_HOST}", "${env.CODING_ARTIFACTS_CREDENTIALS_ID}") {
docker.image("${env.DOCKER_IMAGE_NAME}:${env.GIT_BUILD_REF}").push()
}
5. 部署到 K8s 集群
新建阶段并命名为部署到 K8s 集群,在步骤中添加「执行 Pipeline 脚本」,填写下文中的示例代码:
stage('部署到 K8S') {
steps {
withKubeConfig([credentialsId: "${env.TKE_CLUSTER_CREDENTIAL_ID}"]) {
sh "kubectl patch deployment ruby-sinatra --patch '{\"spec\": {\"template\": {\"spec\": {\"containers\": [{\"name\": \"ruby-sinatra\", \"image\": \"${env.DOCKER_IMAGE_NAME}:${env.GIT_BUILD_REF}\"}], \"imagePullSecrets\": [{\"name\": \"ruby-sinatra-reg\"}]}}}}'"
}
}
}
这句话的含义是,修改名为 ruby-sinatra 的 deployment, 将其中的容器名为 ruby-sinatra 的镜像修改为 ${env.DOCKER_IMAGE_NAME}:${env.GIT_BUILD_REF}, 并修改改 deployment 的 imagePullSecrets 并将值设置为 ruby-sinatra-reg。
如果您只是想修改镜像可以改成下列命令:
sh "kubectl set image deployment/ruby-sinatra ruby-sinatra=${env.DOCKER_IMAGE_NAME}:${env.GIT_BUILD_REF}"
完成配置后,点击「立即构建」按钮手动触发构建过程。待整个流程运行完成后,可以查看每一步的运行日志。
配置自动化触发规则
在持续集成设置中还可以配置多种自动化触发规则,如果默认配置无法满足需求,还可自行配置所需的规则,点击了解更多详情。
查看构建产物
持续集成运行完成后,可以看到构建产物已自动上传至制品仓库中。
查看部署结果
构建计划运行成功后,可以前往 TKE 控制台查看 Deployment 的部署状态。
以上是一个简单的自动化部署示例项目。
在阅读中是否遇到以下问题?*
您希望我们如何改进?*
如果您希望得到回复,请留下您的邮箱地址。