在基于 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 的微服务部署即代码的更多相关文章

  1. 基于kubernetes平台微服务的部署

    基于kubernetes平台微服务的部署 首先下载插件: kubernetes Continuous Deploy 然后去找 .kube/ 里的config 复制里面的内容 去添加凭据: 然后就是脚本 ...

  2. iUAP云运维平台v3.0全面支持基于K8s的微服务架构

    什么是微服务架构? 微服务(MicroServices)架构是当前互联网业界的一个技术热点,业内各公司也都纷纷开展微服务化体系建设.微服务架构的本质,是用一些功能比较明确.业务比较精练的服务去解决更大 ...

  3. 用友iuap云运维平台支持基于K8s的微服务架构

    什么是微服务架构? 微服务(MicroServices)架构是当前互联网业界的一个技术热点,业内各公司也都纷纷开展微服务化体系建设.微服务架构的本质,是用一些功能比较明确.业务比较精练的服务去解决更大 ...

  4. Java开发架构篇:领域驱动设计架构基于SpringCloud搭建微服务

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言介绍 微服务不是泥球小单体,而是具备更加清晰职责边界的完整一体的业务功能服务.领域驱动 ...

  5. QCon技术干货:个推基于Docker和Kubernetes的微服务实践

    2016年伊始,Docker无比兴盛,如今Kubernetes万人瞩目.在这个无比需要创新与速度的时代,由容器.微服务.DevOps构成的云原生席卷整个IT界.在近期举办的QCon全球软件开发大会上, ...

  6. 将微服务部署到 Azure Kubernetes 服务 (AKS) 实践

    本文是对 <.NET Tutorial - Deploy a microservice to Azure> 的翻译和实践.入门级踩坑实践,k8s 大佬请回避,以免耽误您宝贵的时间. 介绍 ...

  7. 通过Dapr实现一个简单的基于.net的微服务电商系统(三)——一步一步教你如何撸Dapr

    目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实现一个简单的基于.net的微服务电商系统(二)--通讯框架讲解 三.通过Dapr实现一个简单的基于.net的微服务电 ...

  8. 通过Dapr实现一个简单的基于.net的微服务电商系统(十三)——istio+dapr构建多运行时服务网格之生产环境部署

    之前所有的演示都是在docker for windows上进行部署的,没有真正模拟生产环境,今天我们模拟真实环境在公有云上用linux操作如何实现istio+dapr+电商demo的部署. 目录:一. ...

  9. 基于Kubernetes在AWS上部署Kafka时遇到的一些问题

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 交代一下背景:我们的后台系统是一套使用Kafka消息队列的数据处理管线 ...

随机推荐

  1. 网络安全:关于SecOC及测试开发实践简介

    前言 我们知道,在车载网络中,大部分的数据都是以明文方式广播发送且无认证接收.这种方案在以前有着低成本.高性能的优势,但是随着当下智能网联化的进程,这种方案所带来的安全问题越来越被大家所重视. 为了提 ...

  2. epx中设置断掉调试

    以前总听师傅们说,做pwn题,多调试,多调试. 师傅都说用gdb,但是我刚接触linux程序调试的时候用的是pwndbg,后来就用顺手了.但是调试一些简单程序还好,直接用pwndbg打开.但是这年头简 ...

  3. Redis缓存穿透、击穿、雪崩,数据库与缓存一致性

    Redis作为高性能非关系型(NoSQL)的键值对数据库,受到了广大用户的喜爱和使用,大家在项目中都用到了Redis来做数据缓存,但有些问题我们在使用中不得不考虑,其中典型的问题就是:缓存穿透.缓存雪 ...

  4. libevent源码学习(13):事件主循环event_base_loop

    目录开启事件主循环执行事件主循环校对时间 阻塞/非阻塞处理激活队列中的event事件主循环的退出event_base_loopexitevent_base_loopbreak开启事件主循环       ...

  5. 【LeetCode】1047. Remove All Adjacent Duplicates In String 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 栈 日期 题目地址:https://leetcode ...

  6. 【LeetCode】392. Is Subsequence 解题报告(Python)

    [LeetCode]392. Is Subsequence 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/is-subseq ...

  7. LeetCode1237找出给定方程的正整数解

    题目 给定方程f和值z,找出给定方程f(x,y)=z的正整数解x,y.f(x,y)关于x.y都是严格单调的. 题目保证 f(x, y) == z 的解处于 1 <= x, y <= 100 ...

  8. D. Persistent Bookcase(Codeforces Round #368 (Div. 2))

    D. Persistent Bookcase time limit per test 2 seconds memory limit per test 512 megabytes input stand ...

  9. python学习第一天:window安装python开发环境完整篇

    我是跟着廖雪峰老师的的博客来一步一步来进行学习和实践后记录下来的,讲的非常地详细,推荐大家一起学习https://www.liaoxuefeng.com/wiki/0014316089557264a6 ...

  10. 前端项目 node8升级到node16,代码升级汇总

    背景 公司的项目是vue项目,环境是node@8x版本的,最近我创建react hook的项目,发现至少需要node14才支持,打开官网才发现node都已经到16版本了.失策啊,失策.于是直接升级到最 ...