在基于 Kubernetes 的基础设施即代码一文中,我概要地介绍了基于 Kubernetes 的 .NET Core 微服务和 CI/CD 动手实践工作坊使用的基础设施是如何使用代码描述的,以及它的自动化执行过程。

如果要查看基于 Kubernetes 的基础设施即代码架构全图,以及实现代码,请回到文章基于 Kubernetes 的基础设施即代码。

本文,我们深入探讨其中 微服务部署部分的“基础设施即代码”的实现原理。

一般来说,在一个团队,CI/CD 软件不会经常部署。与此不同,时常处于开发之中的微服务的则会经常部署。此外,在部署到集群之前,通常开发人员还需要在某个“本机”环境对其所开发的微服务进行预先测试和调试。于是,在工作坊的环境中,我们在设计微服务的“持续部署即代码”时,也模拟正常的微服务开发情景进行了相关设计。

大体上,工作坊在部署微服务时,有如下几个方面协同工作:

  • 微服务所需的公用基础设施

  • 微服务本身在 Kubernetes 上的部署配置

  • 微服务的 CI/CD 过程

其中“微服务公用基础设施”部分的自动化原理在我们第一篇文章中已有介绍,这里主要介绍后两者。

微服务的 Kubernetes 部署

之前介绍过,在需要部署微服务时,调用 dev-services 项目根目录的 provision-services.sh 脚本文件将触发微服务的部署。脚本中的实际过程,还是会使用微服务项目根目录的 k8s.yaml 来完成部署。部署时,脚本还是会利用之前介绍过的模板引擎传入变量文件。

也就是说,用于部署工作坊中的微服务的 Kubernetes 资源文件都是以单个 k8s.yaml 文件的形式在各个微服务自己的代码仓库中维护的。这体现出“微服务自己知道如何部署自己”的自助原则。工作坊的微服务大致可分为两类,一类是纯后台服务,另一类是提供 Web 界面的服务。维护微服务的团队可根据需要自行定制用于在 Kubernetes 集群上部署它自己的资源文件。如果使用 kustomize,还可以以这个文件为入口,利用嵌套、变量等功能编写更易于维护的 Kubernetes 资源文件。

微服务的 CI/CD 过程

工作坊中的微服务,它们的 CI/CD 过程同样是由微服务自身所主导的。在上一篇文章基于 Kubernetes 的 CICD 基础设施即代码中我们介绍过微服务的部署流水线在 Jenkins 启动之后就已经内置创建好了。但实际上流水线虽然创建好了,但流水线中运行的内容却确实是由微服务自己控制和维护的。

这得益于 Jenkins 中基于 Jenkinsfile 的“流水线即代码”技术。简单来说,Jenkins 在运行流水线之前,会先去微服务代码库下载这个 Jenkinsfile 文件,再根据其中的内容决定如何运行流水线。查看各个微服务的代码库就会发现,它们的根目录都存在一个 Jenkinsfile,虽然整体结构都差不多,但具体细节还是有一些差异的。

在 Jenkinsfile 中,我们声明了微服务持续集成和持续部署的几个典型阶段:

  1. 检出代码

  2. 编译应用

  3. 生成新版容器镜像

  4. 部署新版容器镜像

其中,上述第 2 步要求 Jenkins 具有支持 .NET Core SDK 的运行器(Slave)节点 dotnet;而第 3、4 步则要求 Jenkins 具有支持 kubelet 和 docker 的节点 image-builder。而它们,则是由 Jenkins 中的 Kubernetes 插件提供的支持。当流水线运行到这些步骤时,插件将负责按需地在 Kubernetes 集群上启动具有这些功能的 Slave 节点。具体的启动方法(比如,要使用的镜像、要挂载的存储等)都在“CICD 基础设施即代码”的过程中被自动写入。

虽然在工作坊中,我们各个示例微服务的流水线的结构都大致类似;但在实际项目中,有了上述特性的支持,各个团队可以自己定制自己的微服务的流水线形态。举例来说,在上述第 3 步,生成容器镜像时,会用到 Dockerfile。与 Jenkinsfile 一样,其中调用的 Dockerfile 也同样是自己维护的。因此,微服务团队能够很轻松地对 Dockerfile 进行定制,即使要使用不同的编程语言平台也都能轻松掌控。

在现在这种体系下,微服务团队对自己的 CI/CD 过程几乎具有完全的掌握能力。

总结

在部署微服务的公用基础设施及微服务本身的过程中,我们也结合使用了不同的自动化技术:

  1. 借助 Pod 附加执行(exec),可以直接在容器中执行程序。我们在 SqlServer 部署完成之后,向其中导入数据库结构和种子数据时用到了这种技术

  2. 借助 Jenkins 上的 Kubernetes 插件定制 Jenkins 按需启动的运行器(Slave)节点的运行

  3. 使用 Dockerfile 自由定制运行微服务所用的容器

  4. 使用 Jenkinsfile 配合由 Jenkins 提供的流水线和 Groovy 脚本语法可以轻松实现“流水线即代码”

作为这一系列的最后一篇,这里也简单回顾一下工作坊对“基础设施即代码”的实践。目前,这个系列基本上涵盖了从 CI/CD 基础设施,到微服务的持续部署的两个关键环节,这也是开发团队经常会打交道的两个环节。工作坊的场景相对比较简单,并没有实现诸如存储、数据库迁移和流量切换等高级话题,也没有考虑安全性和与周边工具的集成等领域,更没有涉及 Kubernetes 集群本身以及它可能依赖的基础平台的更广泛意义上的“基础设施即代码”。所以,如果希望把工作坊的实践应用到实际项目中,还需要经过一系列改进。

基于“基础设施即代码”的实践,可以直接把能够运行的基础设施配置代码本身当作操作文档。这一思想不仅有助于快速而可靠地构建基础设施,它还能够让开发人员拥有更多灵活性,促进跨部门协作时关于职责划分的新讨论,最终有助于团队间能力的融合,共同组建 DevOps 能力。

作为拓展素材,我推荐学习基础设施即代码和 Kubernetes Patterns 两本书(可直接从 Red Hat 下载)。前者深入介绍了“基础设施即代码”实践过程中的各方面设计考虑,后者详细探讨了常见的基于 Kubernetes 的操作技巧和设计方法。

相关文章:

  • 基于 Kubernetes 的基础设施即代码

  • 基于 Kubernetes 的 CICD 基础设施即代码

  • 云原生

  • (译)An introduction to Kubernetes

  • 程序员修神之路--kubernetes是微服务发展的必然产物

  • 深入探究Kubernetes - 初识容器

  • 使用Helm将ASP.NET Core应用程序部署到Kubernetes容器集群

  • Kubernetes攻略之新手上路

  • Hello Kubernetes快速交互实验手册

  • 十分钟了解Kubernetes

微服务开发及部署_基于 Kubernetes 的微服务部署即代码相关推荐

  1. 基于实战开发垂直搜索引擎_基于DDD的微服务设计和开发实战

    作者:欧创新.邓頔.文艺 你是否还在为微服务应该拆多小而争论不休?到底如何才能设计出收放自如的微服务?怎样才能保证业务领域模型与代码模型的一致性?或许本文能帮你找到答案. 本文是基于 DDD 的微服务 ...

  2. 基于 Kubernetes 的微服务项目设计与实现

    作者:xiaojiaqi 来源:https://github.com/xiaojiaqi/deploy-microservices-to-a-Kubernetes-cluster 随着互联网的发展,后 ...

  3. 使用 Istio 实现基于 Kubernetes 的微服务应用

    近两年,随着容器.Kubernetes 等技术的兴起,微服务被广泛提及并被大量使用.本文旨在让读者了解 Istio,通过它与 Kubernetes 相结合,大幅降低微服务的复杂度,以便让开发人员更关注 ...

  4. 基于Kubernetes的微服务自动化运维

    作者:禅与计算机程序设计艺术 基于Kubernetes的微服务自动化运维 本文将介绍如何使用Kubernetes进行微服务自动化运维,提高团队的工作效率和服务的可靠性.本文将阐述微服务自动化运维的实现 ...

  5. VMware、Pivotal和Google Cloud协力推出全新基于Kubernetes的容器服务——Pivotal Container Service(PKS)...

    本文讲的是VMware.Pivotal和Google Cloud协力推出全新基于Kubernetes的容器服务--Pivotal Container Service(PKS)[编者的话]定制化应用不再 ...

  6. 【树莓派】服务配置相关3:基于Ubuntu Server的服务配置

    该文接续之前写过的两篇: [树莓派]服务配置相关 [树莓派]服务配置相关2:基于RPi Desktop的服务配置 这是我个人用来进行树莓派盒子安装配置的脚本,对于外部其他博友,可以部分参考,但不需要逐 ...

  7. 基于 Kubernetes 的微服务部署即代码

    在基于 Kubernetes 的基础设施即代码一文中,我概要地介绍了基于 Kubernetes 的 .NET Core 微服务和 CI/CD 动手实践工作坊使用的基础设施是如何使用代码描述的,以及它的 ...

  8. ddd 访问权限_基于DDD的微服务设计和开发实战

    作者:欧创新.邓頔.文艺 你是否还在为微服务应该拆多小而争论不休?到底如何才能设计出收放自如的微服务?怎样才能保证业务领域模型与代码模型的一致性?或许本文能帮你找到答案. 本文是基于 DDD 的微服务 ...

  9. kuboard使用mysql_基于 Kubernetes 的微服务图形化管理界面 Kuboard

    Kuboard介绍 Kubernetes 容器编排已越来越被大家关注,然而学习 Kubernetes 的门槛却依然很高,主要体现在这几个方面:集群的安装复杂 Kubernetes相较于容器,引入了许多 ...

最新文章

  1. ❤比较两种模糊特效❤filter: blur(10px)和backdrop-filter: blur(10px)的区别
  2. 太多人关注,太少人理解,这就是“量子计算”
  3. 如何理解Excel数组公式{=sum(1/countif(B8:K9,B8:K9))}
  4. mysql存储过程入门_MySQL入门之存储过程
  5. Thymeleaf一些标签的传字符串/message/消息
  6. How to Use Command to Execute Git Push with Review from Sean
  7. 一条来自 GitHub 重磅消息!
  8. 内核并发控制---信号量 (来自网易)
  9. 你为什么不敢重构代码?听高手亲授秘笈!
  10. 数据分析需要权衡哪些要素?
  11. caffe 将数据(非图像和图像)转成lmdb格式的数据
  12. 小程序使用腾讯API定位的全过程(详细)
  13. java宿舍管理系统代码_JAVA学生宿舍管理系统
  14. matlab多行注释快捷键。
  15. VisualSVN Server SVN仓库迁移备份
  16. 2018秋招面经-后端开发
  17. 运筹系列63:使用ALNS求解大规模TSP问题
  18. 改进left函数,截取varchar需要的字符串长度
  19. 微软亚洲研究院“牵手”莲花山视觉研究院
  20. pom 备注_POMGH-25POMGH-25

热门文章

  1. Nginx应用场景之反向代理
  2. 使用java IO来读写文件
  3. 正确注释@return让PHPstorm动态返回类
  4. 特斯拉Model 3再次升级,将中控部分功能转移至方向盘按钮
  5. 《Beginning Linux Programming》读书笔记(四)
  6. Linux Ubuntu jdk(环境变量)配置
  7. 《从问题到程序:用Python学编程和计算》——1.3 程序开发
  8. jquery实现输入框动态增减的实例代码
  9. SSH远程管理OpenSSH使用
  10. 调整心态,正确应对所学技术的失宠?(至F#,SL的学习者们)