解读与部署(三):基于 Kubernetes 的微服务部署即代码
在基于 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 的微服务部署即代码的更多相关文章
- 基于kubernetes平台微服务的部署
基于kubernetes平台微服务的部署 首先下载插件: kubernetes Continuous Deploy 然后去找 .kube/ 里的config 复制里面的内容 去添加凭据: 然后就是脚本 ...
- iUAP云运维平台v3.0全面支持基于K8s的微服务架构
什么是微服务架构? 微服务(MicroServices)架构是当前互联网业界的一个技术热点,业内各公司也都纷纷开展微服务化体系建设.微服务架构的本质,是用一些功能比较明确.业务比较精练的服务去解决更大 ...
- 用友iuap云运维平台支持基于K8s的微服务架构
什么是微服务架构? 微服务(MicroServices)架构是当前互联网业界的一个技术热点,业内各公司也都纷纷开展微服务化体系建设.微服务架构的本质,是用一些功能比较明确.业务比较精练的服务去解决更大 ...
- Java开发架构篇:领域驱动设计架构基于SpringCloud搭建微服务
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言介绍 微服务不是泥球小单体,而是具备更加清晰职责边界的完整一体的业务功能服务.领域驱动 ...
- QCon技术干货:个推基于Docker和Kubernetes的微服务实践
2016年伊始,Docker无比兴盛,如今Kubernetes万人瞩目.在这个无比需要创新与速度的时代,由容器.微服务.DevOps构成的云原生席卷整个IT界.在近期举办的QCon全球软件开发大会上, ...
- 将微服务部署到 Azure Kubernetes 服务 (AKS) 实践
本文是对 <.NET Tutorial - Deploy a microservice to Azure> 的翻译和实践.入门级踩坑实践,k8s 大佬请回避,以免耽误您宝贵的时间. 介绍 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(三)——一步一步教你如何撸Dapr
目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实现一个简单的基于.net的微服务电商系统(二)--通讯框架讲解 三.通过Dapr实现一个简单的基于.net的微服务电 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十三)——istio+dapr构建多运行时服务网格之生产环境部署
之前所有的演示都是在docker for windows上进行部署的,没有真正模拟生产环境,今天我们模拟真实环境在公有云上用linux操作如何实现istio+dapr+电商demo的部署. 目录:一. ...
- 基于Kubernetes在AWS上部署Kafka时遇到的一些问题
作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 交代一下背景:我们的后台系统是一套使用Kafka消息队列的数据处理管线 ...
随机推荐
- InnoDB学习(四)之RedoLog和UndoLog
BinLog是MySQL Server层的日志,所有的MySQL存储引擎都支持BinLog.BinLog可以支持主从复制和数据恢复,但是对事务的ACID特性支持比较差.InnoDB存储引擎引入Redo ...
- 离散数学3.1&&3.3
离散数学 当前所使用的数字电脑是离散的,二进制指令,传输到内存 早先使用的模拟电脑是连续的 判断是否是命题(两个步骤)[不要跳步骤] 陈述句 要么是真命题要么是假命题 真假性 真:用T或1表示,假:用 ...
- ES6解构赋值的简单使用
相较于常规的赋值方式,解构赋值最主要的是'解构'两个字,在赋值的过程中要清晰的知道等号右边的结构. 先简单地看一下原来的赋值方式. var a=[1,2] 分析一下这句代码的几个点: (1)变量申明和 ...
- 使用 Nocalhost 开发 Kubernetes 中的 APISIX Ingress Controller
本文作者:黄鑫鑫 - Nocalhost 项目核心开发者 腾讯云 CODING DevOps 研发工程师.硕士毕业于中山大学数据科学与计算机学院,曾负责过平安云主机及国家超算中心容器云平台等相关业务, ...
- [BUUCTF]PWN——gyctf_2020_borrowstack
gyctf_2020_borrowstack 附件 步骤: 例行检查,64位程序,开启NX保护 本地运行一下程序,看看大概的情况 64位ida载入,直接从main函数开始看程序, buf可以溢出0x1 ...
- [BUUCTF]REVERSE——刮开有奖
刮开有奖 附件 步骤: 例行检查,无壳,32位程序 32位ida载入,shift+f12检索程序里的字符串,看到了一个base64加密的特征字符串,猜想这题用到了base64加密 从main函数开始看 ...
- CF977C Less or Equal 题解
Content 给定一个 \(n\) 个数的数列 \(a_1,a_2,a_3,...,a_n\) 和一个数 \(k\),试找出这样的一个数 \(x\),使得数列中有 \(k\) 个数小于等于 \(x\ ...
- java数据类型:集合存储元素类型限制<泛型> ;自定义类指定泛型<T> 以及限制用法;派生子类泛型<T> super(泛型内参数); 泛型通配符?以及?限制用法
问题背景 Java 集合有个缺点,把一个对象"丢进"集合里之后,集合就会"忘记"这个对象的数据类型,当再次取出该对象时 该对象的编译类型就变Object类型(其 ...
- ACwing1216. 饮料换购
题目: 乐羊羊饮料厂正在举办一次促销优惠活动.乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去(但不允许暂借或赊账). 请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于 ...
- c++读取文件操作和写入文件
在C++中与读取文件和写入文件简单操作有关的类分别有ifstream(文件读入).ofstream(文件写出).fstream (文件读入和写出). 名称 作用 ifstream 文件读入 ofstr ...