基于 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 Patterns 两本书(可直接从 Red Hat 下载)。前者深入介绍了“基础设施即代码”实践过程中的各方面设计考虑,后者详细探讨了常见的基于 Kubernetes 的操作技巧和设计方法。

相关文章:

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

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

  • 云原生

  • (译)An introduction to Kubernetes

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

  • 深入探究Kubernetes - 初识容器

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

  • Kubernetes攻略之新手上路

  • Hello Kubernetes快速交互实验手册

  • 十分钟了解Kubernetes

原文地址:https://blog.jijiechen.com/post/microservice-delivery-as-code-on-kubernetes/


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Arduino开发ESP32开发环境搭建

1.打开Arduino IDE,选择文件->首选项->设置 复制下方的ESP32板管理网址,添加到附加开发板管理器中: https://dl.espressif.com/dl/package_esp32_index.json 2.选择:工具->开发板->开发板管理器 在弹出的对话框中搜索…

.NET ORM FreeSql 第一个正式版本发布 v1.0.0

一、简介FreeSql 是 .NET 平台下的对象关系映射技术(O/RM),支持 .NetCore 2.1 或 .NetFramework 4.0 或 Xamarin。从 0.0.1 发布到今历时整整一年的迭代更新,现在终于敢发布第一个正式版。本文内容从简,介绍项目的主要功能框架,以…

Windows上搭建EMQTT服务器

1.官网下载EMQ 2.复制如图文件路径 3.打开终端cmd,输入: 再输入: 4.打开浏览器,进入:http://192.168.1.25:18083/* (localhost可打开终端输入ipconfig查看) 用户名:admin 密码:public

.NET解所有相机RAW格式照片

再聊.NET解相机RAW格式照片上次我发了一篇文章《用.NET解索尼相机ARW格式照片》,提到通过安装 SonyRawFileDecoder的方式,然后调用 WindowsImagingComponents来解析 RAW格式文件。后来我经过进一步研究、探索,发现还有更简单的办法。新的方法…

6-3 查找子串 (20 分)

本题要求实现一个字符串查找的简单函数。 函数接口定义&#xff1a; char *search( char *s, char *t );函数search在字符串s中查找子串t&#xff0c;返回子串t在s中的首地址。若未找到&#xff0c;则返回NULL。 裁判测试程序样例&#xff1a; #include <stdio.h> #d…

6-4 建立学生信息链表 (20 分)

本题要求实现一个将输入的学生成绩组织成单向链表的简单函数。 函数接口定义&#xff1a; void input();该函数利用scanf从输入中获取学生的信息&#xff0c;并将其组织成单向链表。链表节点结构定义如下&#xff1a; struct stud_node {int num; /*学号*/…

AspNetCore结合Redis实践消息队列

这是年中首发在博客园上的文章&#xff0c;个人觉得是AspNetCore结合Redis做的一次比较优秀的消息队列重构&#xff0c;其中对于点对点/发布-订阅的思路应该也是面试必考题。引言.Net TPL Dataflow是一个进程内数据流管道&#xff0c;应对高并发、低延迟的要求非常有效&#xf…

数据结构:链表(c语言)

1.链表简介&#xff1a; 链表和数组一样&#xff0c;都是存储数据&#xff0c;链表是非连续&#xff0c;非顺序的存储结构 链表是灵活的内存动态管理&#xff08;随机分配空间&#xff09;&#xff0c;删除创建结点非常方便 链表组成&#xff1a;由一系列结点组成 链表结点&…

提升Azure App Service的几个建议

本文介绍了6个技巧&#xff0c;这些技巧可以改善Azure App Service托管应用程序的性能。其中一些技巧是你现在就可以进行的配置变更&#xff0c;而其他技巧则可能需要对应用程序进行一些重新设计和重构&#xff0c; 本文的几个技巧对于常规企业部署依旧有指引作用。长话短说开发…

单向链表的逆转(数据结构)(c语言)

逆转单向链表的意思是&#xff1a;给定你一个单向链表&#xff0c;一个整数n&#xff08;n为要逆转的结点数&#xff09;&#xff0c;要求你把链表从头结点到第n个结点给逆转过来 图示&#xff1a; 给出一个单向链表&#xff0c;一个整数n4。也就是要求把该链表从头结点&#x…

广东职业教育信息化研究会2019年会暨区块链专题研讨会

兹定于2019年12月28日&#xff08;星期六&#xff09;上午9:30召开广东职业教育信息化研究会2019年会暨专题研讨会&#xff0c;本次会议由广东职业教育信息化研究会主办&#xff0c;华南师范大学网络教育学院协办。会议地址&#xff1a;广州市天河区中山大道西55号华南师范大学…

Serial.println()和Serial.print() (Arduino编程)

Arduino的输出基本就用到两个函数&#xff1a;print和println 区别是后者比前者多了回车换行 Serial.println(data)从串行端口输出数据&#xff0c;跟随一个回车&#xff08;ASCII 13或’r’&#xff09;和一个换行符&#xff08;ASCII 10或’n’&#xff09;&#xff0c;这个…

如何快速融入一个团队?

作者&#xff1a;邹溪源&#xff0c;长沙资深互联网从业者&#xff0c;架构师社区特邀嘉宾&#xff01;一我们难免需要离开一个圈子&#xff0c;加入一个陌生的集体。毋庸置疑&#xff0c;离开熟知的圈子&#xff0c;走向未知的圈子难免会产生许多畏惧甚至情怯&#xff0c;这都…

使用Arduino开发ESP32:wifi基本功能使用

1.建立网络&#xff08;AP&#xff09; 2.连接网络&#xff08;STA&#xff09; 3.扫描网络 1.建立网络&#xff08;AP&#xff09; 只需两步&#xff1a;1.引用WiFi库include<WiFi.h> 2.启动AP网络WiFi.softAP(ssid) 将下面代码上传到模块中&#xff1a; #include &l…

关于C#异步编程你应该了解的几点建议

前段时间写了一篇关于C#异步编程入门的文章&#xff0c;你可以点击《C#异步编程入门看这篇就够了》查看。这篇文章我们来讨论下关于C#异步编程几个不成文的建议&#xff0c;希望对你写出高性能的异步编程代码有所帮助。注&#xff1a;本文的很多内容都是学习《Effective C#》的…

数据库分区

一、分区原理分区并不是生成新的数据表&#xff0c;而是将表的数据均衡分摊到不同的硬盘&#xff0c;系统或是不同服务器存储介子中&#xff0c;实际上还是一张表。要实现这一功能&#xff0c;首先要了解数据库对水平分区表进行分区存储的原理。数据库分区和分表相似&#xff0…

(Arduino编程)Serial(串行通信)函数

串行端口用于Arduino和个人电脑或其他设备进行通信。所有Arduino控制器都有至少一个串行端口&#xff08;也称为UART或者USART&#xff09;。个人电脑可以通过USB端口与Arduino的引脚0(RX)和引脚1(TX) 进行通信。所以当Arduino的引脚0和引脚1用于串行通信功能时&#xff0c;Ard…

Arduino_esp32_WiFi代码

#include<WiFi.h>const char* ssid"BlackWalnut"; const char* password"blackwalnut";void setup() {Serial.begin(115200);while(WiFi.status()!WL_CONNECTED){delay(2500);WiFi.begin(ssid,password);Serial.println("正在连接...");}S…

如何在 C# 平台调用云开发?

▌关于作者苏震巍&#xff0c;云开发Linker计划成员&#xff0c;《微信开发深度解析》作者、Senparc.Weixin 微信 SDK 作者、微软最有价值专家&#xff08;MVP&#xff09;、盛派网络创始人兼首席架构师、微软 Ignite 技术大会讲师、从事软件及互联网研发已有26年&#xff0c;发…

如何打造组织级敏捷,你想知道的都在这里!

“敏捷是适应和响应变化的能力……敏捷组织将变化视为机遇&#xff0c;而不是威胁。” — Jim Highsmith注&#xff1a;Highsmith 在软件开发和 IT 行业有着超过 30 年的经验&#xff0c;曾是敏捷宣言的签署人之一&#xff0c;敏捷联盟的发起人和第一任理事&#xff0c;在很多行…