使用Helm优化Kubernetes下的研发体验:实现持续交付流水线

简介: 整体目标 在这一篇中,我们将使用Jenkins在此基础上构建一条完整的持续交付流水线,并且让团队不同成员能够基于该流水线展开基本的协作。开发: 持续提交代码并能够通过持续集成(CI)过程快速获取反馈,在通过CI验证后,能够自动化部署到开发环境,以便后续的进一步功能测试(手动/自动自动化测试)等; 测试: 在需要对项目功能进行验证时,可以一键部署测试环境,并且在此环境基础上可以完成功能验收(手动),以及全量的自动化验收测试等; 运维:一键部署生产环境,同时发布创建版本,以便在发布异常时能够快速回归。

整体目标

在这一篇中,我们将使用Jenkins在此基础上构建一条完整的持续交付流水线,并且让团队不同成员能够基于该流水线展开基本的协作。
  • 开发: 持续提交代码并能够通过持续集成(CI)过程快速获取反馈,在通过CI验证后,能够自动化部署到开发环境,以便后续的进一步功能测试(手动/自动自动化测试)等;
  • 测试: 在需要对项目功能进行验证时,可以一键部署测试环境,并且在此环境基础上可以完成功能验收(手动),以及全量的自动化验收测试等;
  • 运维:一键部署生产环境,同时发布创建版本,以便在发布异常时能够快速回归。

ci-cd-jenkins-helm-k8s.png

资料来源: https://dzone.com/articles/eas ... ns-he
示例项目的代码可以从 GitHub 下载,示例项目为 containerization-spring-with-helm 。接下来,我们将分阶段介绍如何通过 Jenkinsfile 定义整个过程。
pipeline-overview.png

项目构建阶段

当前阶段Jenkinsfile定义如下:


stage('Build And Test') {
 steps {

 dir('containerization-spring-with-helm') {
 sh 'docker build -t yunlzheng/spring-sample:$GIT_COMMIT .'
 }

 }
} 

Build And Test 阶段,我们直接通过源码中的Dockerfile定义了整个持续集成阶段的任务,通过docker的 Multi-Stage Builds 特性,持续集成的所有任务全部通过Dockerfile进行定义,这样无论是在本地还是持续集成服务器中,我们都可以非常方便的进行运行CI任务。
build-and-test.png

发布镜像和Helm阶段

当前阶段Jenkinsfile定义如下:
stage('Publish Docker And Helm') {
 steps {

 withDockerRegistry([credentialsId: 'dockerhub', url: '']) {
 sh 'docker push yunlzheng/spring-sample:$GIT_COMMIT'
 }

 script {
 def filename = 'containerization-spring-with-helm/chart/values.yaml'
 def data = readYaml file: filename
 data.image.tag = env.GIT_COMMIT
 sh "rm $filename"
 writeYaml file: filename, data: data
 }

 script {
 def filename = 'containerization-spring-with-helm/chart/Chart.yaml'
 def data = readYaml file: filename
 data.version = env.GIT_COMMIT
 sh "rm $filename"
 writeYaml file: filename, data: data
 }

 dir('containerization-spring-with-helm') {
 sh 'helm push chart https://repomanage.rdc.aliyun.com/helm_repositories/26125-play-helm --username=$HELM_USERNAME --password=$HELM_PASSWORD --version=$GIT_COMMIT'
 }

 }
} 

Push镜像

通过 withDockerRegistry 的上下文,Jenkins会确保docker client首先通过 credentials dockerhub 中定义的用户名和密码完成登录后,再运行 docker push 任务。这里我们使用当前代码版本的COMMIT_ID作为镜像的Tag,从而将Docker镜像版本与源码版本进行一一对应;

重写Chart镜像版本

通过 readYaml 读取chart的values.yaml内容到变量data后,通过 writeYaml 重写values.yaml中的镜像tag版本与当前构建镜像版本一致。

重写Chart版本

与镜像一样,我们希望Chart的版本与源码版本能够一一对应。

上传Chart

这里我们直接使用 阿里云效 提供的Helm仓库服务, 点击开通私有仓库服务 。通过Helm Push插件发布Chart到Helm仓库。

其中环境变量 $HELM_USERNAME $HELM_PASSWORD 是通过jenkins的Credentials加载到环境变量中:
environment {
 HELM_USERNAME = credentials('HELM_USERNAME')
 HELM_PASSWORD = credentials('HELM_PASSWORD')
} 

publish-docker-and-helm.png

部署到开发/测试环境阶段

当前阶段Jenkinsfile定义如下:
stage('Deploy To Dev') {
 steps {
 dir('containerization-spring-with-helm') {
 dir('chart') {
 sh 'helm upgrade spring-app-dev --install --namespace=dev --set ingress.host=dev.spring-example.local .'
 }
 }
 }
}

stage('Deploy To Stageing') {
 steps {
 input 'Do you approve staging?'
 dir('containerization-spring-with-helm') {
 dir('chart') {
 sh 'helm upgrade spring-app-staging --install --namespace=staging --set ingress.host=staging.spring-example.local .'
 }
 }
 }
} 

在Jenkinsfile中我们分别定义了两个阶段 Deploy To Dev Deploy To Stageing 。我们通过Kubernetes的命名空间划分单独的开发环境和测试环境。并且通过覆盖ingress.host确保能够通过ingress域名 dev.spring-example.local staging.spring-example.local 访问到不同环境。 对于Staging环境而言,通过 input 确保该流程一定是通过人工确认的。

使用 helm upgrade 命令可以在特定命名空间下部署或者升级已有的Chart:
helm upgrade spring-app-staging --install --namespace=staging --set ingress.host=staging.spring-example.local .

deploy-to-dev.png
deploy-to-staging.png

部署到生产环境阶段

当前阶段Jenkinsfile定义如下:
stage('Deploy To Production') {
 steps {
 input 'Do you approve production?'

 script { 
 env.RELEASE = input message: 'Please input the release version',
 ok: 'Deploy',
 parameters: [
 [$class: 'TextParameterDefinition', defaultValue: '0.0.1', description: 'Cureent release version', name: 'release']
 ]
 }

 echo 'Deploy and release: $RELEASE'

 script {
 def filename = 'containerization-spring-with-helm/chart/Chart.yaml'
 def data = readYaml file: filename
 data.version = env.RELEASE
 sh "rm $filename"
 writeYaml file: filename, data: data
 }

 dir('containerization-spring-with-helm') {
 dir('chart') {
 sh 'helm lint'
 sh 'helm upgrade spring-app-prod --install --namespace=production --set ingress.host=production.spring-example.local .'
 }
 sh 'helm push chart https://repomanage.rdc.aliyun.com/helm_repositories/26125-play-helm --username=$HELM_USERNAME --password=$HELM_PASSWORD --version=$RELEASE'
 }

 }
} 

在最后一个 Deploy To Production 阶段中,与Dev和Stageing的部署不同在于当人工确认部署测试环境之后,我们需要用户手动输入当前发布的版本,以确保对当前发布的Chart版本能完成一个基线的定义:
release-version.png
这里,我们需要确保当前定义的版本是符合Sem规范的,因此这里使用了 helm lint 对Chart定义进行校验。

小结

通过代码提交版本(COMMIT_ID)关联了源码版本,镜像版本以及Chart版本。同时对于正式发布的软件版本而言,单独定义了正式发布的版本号。对于实践持续交付的研发团队而言,我们可以通过上述一条流水线基本实现软件交付的整个生命周期。而对于传统交付模式的团队,则可以通过将上述过程分拆到多条流水线(开发流水线,测试流水线,发布流水线)来适应自己的发布模式。

回到我们的总体目标而言,通过基础设施及代码的方式,我们定义了一个相对完备且自描述的应用。通过流水线即代码的方式,定义了应用的端到端交付过程。通过Docker定义项目的构建过程,通过Helm实现Kubernetes下应用的发布管理,通过Jenkinsfile定义了软件的整个交付过程,并且不同职能的团队成员,可以方便的在此基础上实现协作。最后借用《持续交付》的话“提前并频繁地做让你感到痛苦的事!“ ,希望大家都能够Happy Coding。

本文转自DockOne-使用Helm优化Kubernetes下的研发体验:实现持续交付流水线

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
1月前
|
运维 监控 Android开发
应用研发平台EMAS产品常见问题之流水线符号表无法下载如何解决
应用研发平台EMAS(Enterprise Mobile Application Service)是阿里云提供的一个全栈移动应用开发平台,集成了应用开发、测试、部署、监控和运营服务;本合集旨在总结EMAS产品在应用开发和运维过程中的常见问题及解决方案,助力开发者和企业高效解决技术难题,加速移动应用的上线和稳定运行。
应用研发平台EMAS产品常见问题之流水线符号表无法下载如何解决
|
2月前
|
运维
计算巢如何使用fluxcd在ack部署helm chart
为支持helm服务运维管理功能,现在改用fluxcd的方式进行helm chart部署,这里计算巢对fluxcd进行部署helm chart的过程进行了封装,封装成了ROS公共模块MODULE::ACS::ComputeNest::FluxOciHelmDeploy,下面将主要介绍下怎么使用这个模块在计算巢中进行Helm Chart的部署。
36 3
|
2月前
|
存储 Kubernetes 容器
百度搜索:蓝易云【Kubernetes使用helm部署NFS Provisioner】
现在,你已经成功使用Helm部署了NFS Provisioner,并且可以在Kubernetes中创建使用NFS存储的PersistentVolumeClaim。
44 10
|
4月前
|
Kubernetes 安全 Ubuntu
k8s学习-CKS真题-Dockerfile和deployment优化
k8s学习-CKS真题-Dockerfile和deployment优化
73 0
|
6月前
|
Kubernetes 应用服务中间件 Linux
helm安装和使用-通过helm部署k8s应用
helm安装和使用-通过helm部署k8s应用
|
6月前
|
存储 Kubernetes API
【K8S系列】第十一讲:包管理神器-Helm
【K8S系列】第十一讲:包管理神器-Helm
106 0
|
6月前
|
存储 边缘计算 数据管理
Docker 存储驱动解析:选择最适合你的存储方案,优化容器化部署性能和数据管理
Docker 存储驱动解析:选择最适合你的存储方案,优化容器化部署性能和数据管理
144 0
|
1月前
|
存储 Kubernetes 分布式数据库
利用Helm在K8S上部署 PolarDB-X 集群(详细步骤--亲测!!!)
利用Helm在K8S上部署 PolarDB-X 集群(详细步骤--亲测!!!)
92 0
|
6月前
|
Kubernetes 网络虚拟化 Perl
k8s常用的网络插件优化方案|干货
k8s常用的网络插件优化方案|干货
|
6月前
|
Kubernetes jenkins 持续交付
jenkins结合k8s构建流水线如何提升运行性能和构建效率
jenkins结合k8s构建流水线如何提升运行性能和构建效率