特别篇 :从 0 开始创作云原生应用 (殷达)

2023-11-01

本节内容的分享主要围绕以下两方面

  1. 介绍云原生应用是什么?
  2. 介绍 Helm 和如何创作一个 Helm 应用。

一、 云原生应用是什么?

首先我们来思考一个问题:云原生应用是什么?

avatar

在生活中我们会和各种各样的应用打交道,有时候会在移动端上使用淘宝购物、使用高德导航,在 PC 端使用 word 编辑文稿、使用 Photoshop 处理相片······这些在各类平台上的应用程序对用户而言,大多数都只需要用户点击安装就可以使用了。那么对于云上的应用,或者说在我们今天的云上、在 Kubernetes 上的应用,是什么样子的呢?

想象一下,如果我们要把一个应用程序部署到云上都需要做什么呢?

avatar

首先我们要准备好它所需的环境,打包成一个 docker 镜像,把这个镜像放到 deployment 中。部署服务、应用所需要的账户、权限、匿名空间、秘钥信息,还有可持久化存储,这些 Kubernetes 的资源,简而言之就是要把一堆 yaml 配置文件布置在 Kubernetes 上。

avatar

虽然应用的开发者可以把这些镜像存放在公共的仓库中,然后把部署所需要的 yaml 的资源文件提供给用户,当然用户仍然需要自己去寻找这些资源文件在哪里,并把它们一一部署起来。倘若用户希望修改开发者提供的默认资源,比如说想使用更多的副本数,或者是修改服务端口,那他还需要自己去查:在这些资源文件中,哪些地方需要相应的修改。同时版本更替和维护,也会给开发者和用户造成很大的麻烦,所以可以看到最原始的这种 Kubernetes 的应用形态并不是非常的便利。

二、Helm 与 Helm Chart

Helm 是什么?

avatar

我们今天的主角:Helm,就在这样的环境下应用而生。开发者安装 Helm Chart 的格式,将应用所需要的资源文件都包装起来,通过模板化的方法,将一些可变的字段,比如说我们之前提到的要暴露哪一个端口、使用多少副本数量,把这些信息都暴露给用户,最后将封装好的应用包,也就是我们所说的 Helm Chart 集中存放在统一的仓库里面供用户浏览下载。

那么对于用户而言,使用 Helm 一条简单的命令就可以完成应用的安装、卸载和升级,我们可以在安装完成之后使用 kubectl 来查看一下应用安装后的 pod 的运行状态。需要注意的是,我们证明使用的是 Helm v3 的一个命令,与目前相对较为成熟的 Helm v2 是有一定的区别的。我们推荐大家在进行学习尝鲜的过程中使用这个最新的 v3 版本。

如何去创作一个 Helm 应用

avatar

站在开发者的角度上,我们应该如何去创作一个 Helm 应用呢?首先我们需要一个准备部署的镜像,这个镜像可以是一个 JAVA 程序、一个 Python 脚本,甚至是一个空的 Linux 镜像,跑几条命令。

编写 Golang 程序

avatar

如上图所示,这里我们是用 Golang 编写一个非常简单的 Hello World 的 http 服务,并且使用 docker 进行一个打包。Golang 的程序大致是长这个样子的,包括从环境变量中读取 pod、username 两个参数,在指定的端口上提取 http 服务,并返回相应的响应信息。

构建 Docker 镜像

avatar

打包用的 Dockerfile 是长这个样子的。在这里面,我们首先对 Golang 代码进行编译,然后将编译后的程序放到 03:53 的一个镜像中来缩小镜像的体积。我们看到上文所说的两个环境变量只有 port 在这里面进行一个设置,username 将会在后续作为应用的一个参数报告给用户,所以在这里面我们先不做设置,在 docker 构建好镜像之后,我们把这个镜像上传到仓库中,比如说我们可以上传到 Docker Helm,或者是阿里云镜像仓库中。

创建空白应用

avatar

准备工作都做完之后,我们可以开始今天的重头戏,也就是构建这个 Helm Chart 了。首先我们先运行 helm create 的命令,创建一个空白的应用,那么在 create 命令运行完之后,可以看到在这个 Charts 的文件夹下出现了一系列文件和文件夹。

  • Charts.yaml 的文件包含了 Helm Chart 的一些基本信息;
  • templates 文件夹内则是存放了这个应用所需要的各种 Kubernetes 的资源;
  • values.yaml 则是提供了一个默认的参数配置。
Chart 配置

avatar

接下来一个一个看:

在根目录下这个 Charts.yaml 文件内声明了当前 Chart 的名称和版本和一些基本信息,那么这些信息会在 chart 被放入仓库之后,供用户浏览和检索,比如我们在这里面可以把 chart 的 description 改成 My first hello world helm chart。

在 Charts.yaml 里面,有两个和版本相关的字段,其中 version 指的是我们当前这个 chart 应用包的版本,而另外一个 appVersion 则指的是我们内部所使用的,比如说在这里面就是我们内部所使用的 Golang 这个程序,我们给它打一个 tag 这个版本。

template 文件夹

avatar

在 templates 这个文件夹下,则是存放各种部署应用所需要的 yaml 文件,比如说我们看到的 deployment 和 service。

我们当前的应用实际上只需要一个 deployment,但是有的应用可能包含多个组件,此时就需要在这个 templates 文件夹下放 deploymentA、deploymentB 等多个 yaml 文件。有时候我们还需要去配置一些 service account secret volume 的内容,也是在这里面去添加相应的内容。

在 templates 文件夹下,这个配置文件可以只是单纯的 Kubernetes.yaml 配置文件,也可以是配置文件的模板,比如说在这看到 deployment.yaml 文件里面,有很多以 {{ }} 包裹起来的变量,这些以 values 或者是 chart 开头的这些变量,都是从根目录下的 chart.yaml 以及 values.yaml 中获取出来的。

avatar

如上图所示,看到 replicaCount 实际上就是我们所要部署的副本数量,而 repository 则是指定了镜像的位置。我们之前在 docker 镜像构建中并没有设置 username 的环境变量,这里也是通过类似的方式暴露在了 values.yaml 里面。

Helm 在安装应用的时候,实际上会先去渲染 templates 这个文件夹下的模板文件,将所需要的变量都填入进去,然后再使用渲染后的 kubernetes.yaml 文件进行一个部署,而我们在创建这个 Helm Chart 的过程中,实际上并不需要考虑太多如何去渲染,因为 Helm 已经在客户端安装应用的时候帮我们把这些事情都完成了。

校验与打包

avatar

在我们准备好这些应用后,就可以使用 helm lint 命令,来粗略检查一下我们制作的这个 chart 有没有语法上的错误,如果没有问题的话,就可以使用 Helm package 命令,对我们的 chart 文件包进行一个打包。打包之后,我们就可以得到一个 tar 的应用包了,这个就是我们所要发布的一个应用。

安装测试

avatar

我们可以使用 Helm install 这个命令来尝试安装一下刚刚做好的应用包,然后使用 kubectl 来查看一下 pod 的运行状态,同样可以通过 port-forward 命令来把这个 pod 的端口映射到本地的端口上,这样就可以通过本地的这个 localhost 来访问到刚刚部署好的这个应用了。

参数覆盖

avatar

有的同学可能会有疑惑:虽然我们应用开发者把这些可配置的信息都暴露在了 values.yanl 里面,用户使用应用的时候,如果想要修改该怎么办呢?这个答案其实也很简单,用户只需要在 install 的时候使用这个 set 参数设置,把想要设置的参数覆盖掉就行了。

同样,如果用户编写自己的 my-values.yaml 文件,也可以把这个文件在 install 的时候设置起来,这样的话,文件中的参数会覆盖掉原有的一些参数。如果用户不想重新去 install 一个新的 app,而是想要升级原来的 app,他也只需要用这个 helm upgrade 的命令把这个 Helm install 这个命令替换掉就可以了。

修改 NOTES.txt

avatar

细心的同学可能会注意到,之前在执行 Helm install 的命令后,这个提示信息其实是有一些问题的,我们看一下之前所写的 deployment.yaml 这个文件,里面可以看到,两个 label 其实是有一定出入的,这个提示信息其实就是在 templates 的 notes 文件下,所以我们只需要到这个文件里面去把这里面的相应信息修改一下就可以了。

升级版本

avatar

接下来我们回到 chart.yaml 的文件中,更新一下这个 version 字段,重新做一个打包,这样我们就可以对原来部署好的应用做这样一个版本升级了。

应用上传

avatar

制作完成的这个应用应该如何和其他人做分享呢?

Helm 官方是通过了 CHARTMUSEUM 这样一个工具,用这个工具,大家可以来构建自己的 chart 仓库,但是自己维护一个 chart 成本会比较高,另外对于使用户而言,如果它使用每一个应用的开发者都有自己的一个仓库的话,那这个用户他就需要去把这些所有的仓库都加入到自己的检索列表里面,这个非常麻烦,非常不利于应用的传播和分享。

三、开放云原生应用中心

应用来源

avatar

我们团队最近推出了一个开放云原生应用中心:Cloud Native App Hub。在这里面,我们同步了各种非常流行的应用,同时还提供了一个开发者上传自己应用的一个渠道。

提交应用

在开放云原生应用中心,应用主要是来自两个渠道:

  • 一方面我们会定期从一些国外知名的 Helm 仓库同步 chart 资源,同时将其内部使用的一些 docker 镜像也一并做这样的替换。
  • 另一方面,我们和 Helm 官方库一样,在 GitHub 上,也接受开发者通过 push request 的形式提交自己的应用。

avatar

感兴趣的同学可以移步我们的云原生应用中心位于 GitHub 上的 chart 仓库,仿照刚才所讲的 chart 制作流程创作自己的 chart,然后提交 push request。

结束语

最后欢迎大家使用 Helm 和阿里云来进行云原生应用的开发。如果有问题或者希望深入交流讨论的同学,可以扫码加入我们的 Kubernetes 钉钉技术大群,和大牛们一起探索技术。今天的介绍就到这里,谢谢大家。

avatar

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

特别篇 :从 0 开始创作云原生应用 (殷达) 的相关文章

随机推荐

  • 自定义Dynamics 365实施和发布业务解决方案 - 7. 报表

    在每个组织中 决策者都依赖于各种报告来推动业务取得成功 因此 每个软件开发项目都需要开发报告 Dynamics365配备了最先进的报告功能 这些报告的范围从简单的查询到具有复杂查询的更高级的报告 此外 Dynamics365的一个关键功能是
  • Qt 串口发送0x00

    应用场景 大恒光电的平移台 GCD 040101M 先看看要发什么东西 这是串口监听软件截取的结果 绿色的字 串口协议主要包括三个部分 前面是固定的 后面是key 后面是 0x00 最后面是数据 错误版本1 bool MoveStage w
  • Windows10点击睡眠之后不锁屏?

    一些用户反馈自己在使用win10系统笔记本电脑过程中 突然碰到了无法睡眠的情况 不管是盖上屏幕还是在系统中选择睡眠 电脑都无法进行睡眠 根本没有任何反应 该怎么办呢 接下来 系统城小编就为大家带来该问题的具体解决方法 首先可以按方法一进行设
  • Deepin 系统安装并开启本地远程使Windos系统访问

    思路 1 系统安装 2 安装xrdp Linux和Windows间的远程桌面访问 coder i 的博客 CSDN博客 linux远程连接windows桌面 sudo apt install xrdp 然后启动xrdp服务 sudo sys
  • 关于stm32的GPIO的操作

    首先先了解一下输出的模式 比较常用的是 推挽输出 1 GPIO Mode AIN 模拟输入 2 GPIO Mode IN FLOATING 浮空输入 3 GPIO Mode IPD 下拉输入 4 GPIO Mode IPU 上拉输入 5 G
  • 字符流

    import java io FileNotFoundException import java io FileReader import java io FileWriter import java io IOException publ
  • 线性代数(17)——坐标转换

    坐标转换 空间的基与坐标系 任意坐标系与标准坐标系之间的转换 任意坐标系之间的转换 标准单位矩阵作为桥梁 结论验证 不使用单位坐标系为桥梁的情况 空间的基与坐标系 坐标系是理解空间的基的一个视角 如果只到了一个坐标系也相当于知道了空间中的一
  • 【axmol】基于Cocos2d-x 4.0的持续维护的游戏引擎介绍

    Axmol引擎 A Multi platform Engine for Desktop XBOX UWP and Mobile games A radical fork of Cocos2d x 4 0 Axmol是基于Cocos2d x
  • 【小程序】手动实现switch开关中带文字效果(开关左右文字相同/不同都可以)

    最终效果 左右文字宽度相同 左右文字宽度不同 左右长度相同 效果 配合wx show切换 注意 左右长度相同的话可以设置合适的相同的宽度 html
  • 五. go 常见数据结构实现原理之 string, iota

    目录 一 string 其它问题 二 iota 几个小问题 原理 一 string golang中对string的解释 8比特字节的集合 可以为空 长度为0 但不会是nil string对象不可以修改 查看string 数据结构 strin
  • C语言中的正则表达式:匹配和替换

    当你在C语言中需要进行字符串匹配和替换操作时 正则表达式是一个强大的工具 在C语言中 可以使用正则表达式库来处理正则表达式的匹配和替换操作 下面是一个使用C语言中的正则表达式的示例教程 首先 你需要包含适当的头文件 c include
  • Python之异步处理

    同步处理 也被称为是阻塞式处理 是指程序执行到某个位置 会一直等待该命令执行完毕 然后继续执行后续逻辑 异步处理 是指一段程序由多个线程或进程同时执行 从而提高软件性能 一 多线程 线程是计算机调度的基本单位 一个进程至少有一个线程 线程是
  • 计算机网络分为哪些子网,计算机网络-划分子网

    IP地址 IP地址是给因特网上的每一个主机 或路由器 的每一个接口分配一个在全世界范围是唯一的32位标识符 层次化IP地址将32位的IP地址分为网络ID和主机ID IP地址分类 分为ABCDE类地址 二进制与十进制的关系 从上图看出128以
  • 这三个普通程序员,几个月就成功转型AI,他们的经验是...

    动辄50万的毕业生年薪 动辄100万起步价的海归AI高级人才 普通员到底应不应该转型AI工程师 普通程序员到底应该如何转型AI工程师 以下 AI科技大本营精选了三个特别典型的普通程序员成功转型AI的案例 也是知乎上点赞量相当高的案例 第一案
  • 学生没有教育邮箱如何享受Jetbrains全家桶优惠(白嫖)

    学生没有教育邮箱如何享受Jetbrains全家桶优惠 白嫖 Lan 2020 04 26 10 05 351 人阅读 0 条评论 首先来一波成功图 提交申请一个星期之后终于发来了这封邮件 每次申请可以使用一年 一年之后还是学生可以继续申请
  • Vue 使用 mockjs (返回数据、get、post 请求)

    1 安装 mockjs axios 一般默认自带 没有就安装下 附 mockjs 官网 mockjs github npm install mockjs axios 一般默认自带 npm install axios 2 启动项目 根据项目环
  • C/C++

    文章目录 2 2 C语言常用关键字及运算符操作 关键字 参考 麦子学院 嵌入式C语言高级 2 2 C语言常用关键字及运算符操作 重点 掌握C语言的常用关键宇及其应用场景 使用技巧 关键字 编译器 预先定义了一定意义的字符串 32个 size
  • qt安装到指定目录

    qt everywhere src 5 12 3安装到指定目录 默认情况下 QT会自动安装到 usr local Qt目录 这对于项目工具的归类来说 总是感觉很别扭 本文仅记录自己安装的过程 同时原理可借鉴给其他的工具归类 下载qt eve
  • 传感器课程作业 车载激光雷达

    高分辨率车载3D激光雷达介绍 1 车载3D激光雷达的背景 化石能源的日渐枯竭以及气候环境的恶化使得绿色节能可持续发展理念普世流行 其中交通减排是节能减排的主要途径 加之碳中和目标的提出 新能源汽车替代传统燃油车已然成为不可逆转的趋势 各国大
  • 特别篇 :从 0 开始创作云原生应用 (殷达)

    本节内容的分享主要围绕以下两方面 介绍云原生应用是什么 介绍 Helm 和如何创作一个 Helm 应用 一 云原生应用是什么 首先我们来思考一个问题 云原生应用是什么 在生活中我们会和各种各样的应用打交道 有时候会在移动端上使用淘宝购物 使