背景

Helm 是一个 Kubernetes 的包管理工具,有点类似于 Mac 上的 brewPython 中的 PIP;可以很方便的帮我们直接在 kubernetes 中安装某个应用。

比如我们可以直接使用以下命令方便的在 k8s 集群安装和卸载 MySQL

helm install my-sql oci://registry-1.docker.io/bitnamicharts/mysql -n mysql

helm uninstall my-mysql -n mysql

对于一些复杂的应用使用 Helm 一键安装会更简单,以 Pulsar 举例:



它有着多个组件,比如 bookkeeper、zookeeper、broker、proxy 等,各个组件还有着依赖关系。

如果我们手动安装流程会比较繁琐,而使用 Helm 时便非常简单:

helm repo add apache https://pulsar.apache.org/charts

helm install my-pulsar apache/pulsar --version 3.0.0 -n pulsar

当然他也只是帮我们生成了部署所需要的 yaml 文件,也没有太多黑科技。

升级

看似简单的工具我在实际线上使用的时候也踩过一个坑,最大的一个问题就是某次升级 Pulsar 的时候生成的 yaml 文件是空的,导致整个集群被删除了。

还好最后使用 helm rollback version 将集群恢复过来了,我们的持久化数据也还在。

而出现这个问题的原因是我执行了下面这个命令:

helm upgrade pulsar ./charts/pulsar --version 2.9.2 -f charts/pulsar/values-2.10.3.yaml -n pulsar

我们是将 pulsarHelm-Chart 源码下载到本地,然后修改 value.yaml 的方式执行升级的。

当时执行命令的时候没有注意,在一个没有 values-2.10.3.yaml 文件的目录下执行的,导致生成的 yaml 文件是空的,也就导致 k8s 在 pulsar 这个 namespace 下删除了所有的资源。

模拟升级

为了避免今后再次出现类似的问题,需要在升级前先模拟升级:

helm upgrade pulsar ./charts/pulsar --version 2.9.2 -f charts/pulsar/values-2.10.3.yaml -n pulsar --dry-run --debug > debug.yaml

其中关键的 dry-rundebug 参数可以指定模拟升级和输出详细的内容。

这样我们就可以在升级前先查看 debug.yaml 里的内容是不是符合我们的预期。

对比升级

但这样并不能直观的看出哪些地方是我们修改的,还好社区已经有了相关的插件,可以帮我们高亮显示修改的地方。

helm plugin install https://github.com/databus23/helm-diff

我们先安装好这个 helm 插件。

然后在升级前先使用该插件:

helm diff upgrade pulsar ./charts/pulsar --version 2.9.2 -f charts/pulsar/values-2.10.3.yaml -n pulsar

这样就可以高亮显示出修改的内容。

不用担心这个命令会直接升级,它会自动加上 --dry-run --debug 参数。

更多命令可以参考官方文档:

https://github.com/databus23/helm-diff

Helm 功能很强,在操作生产环境的时候必须得谨慎,都是血淋淋的教训啊。

使用 Helm 管理应用的一些 Tips的更多相关文章

  1. 如何使用vs将asp.net core项目添加容器支持并发布docker镜像到私有dockerhub和添加k8s/helm管理

    这篇文章介绍一下,如何使用VS2017给asp.net core添加容器支持,并发布镜像到私有docker hub,然后用chart管理容器镜像的操作流程. 话不多说,just do it. 新建项目 ...

  2. 使用helm管理复杂kubernetes应用

    1. 查看仓库: $ helm repo list NAME URL stable https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/ch ...

  3. Helm神器,让管理Kubernetes像yum安装包一样简单

    目录 一.什么是Helm 二.安装 1.安装helm客户端 2.安装Tiller 3.创建服务端 4.给Tiller授权 5.为 Tiller 设置帐号 6.验证Tiller是否安装成功 三.Helm ...

  4. Helm包管理

    Helm Kubernetes 包管理工具 Helm 可以帮助我们管理 Kubernetes 应用程序 - Helm Charts 可以定义.安装和升级复杂的 Kubernetes 应用程序,Char ...

  5. Helm学习笔记

    Helm学习笔记 Helm 是 Kubernetes 生态系统中的一个软件包管理工具.本文将介绍 Helm 中的相关概念和基本工作原理,并通过一个具体的示例学习如何使用 Helm 打包.分发.安装.升 ...

  6. kubernetes学习笔记之十四:helm入门

    1.Helm的简介 Helm是Kubernetes的一个包管理工具,用来简化Kubernetes应用的部署和管理.可以把Helm比作CentOS的yum工具. Helm有如下几个基本概念: Chart ...

  7. helm 部署

    Helm 基本概念 Helm 可以理解为 Kubernetes 的包管理工具,可以方便地发现.共享和使用为Kubernetes构建的应用,它包含几个基本概念 Chart:一个 Helm 包,其中包含了 ...

  8. 如何在Ubuntu里安装Helm

    Helm是什么?在战网上玩过暗黑破坏神2代的程序员们应该还记得,Helm是国度的意思. 而在计算机领域,Helm是什么? Helm是Kubernetes的一个包管理工具,有点像nodejs的npm,U ...

  9. kubernetes实战篇之helm完整示例

    系列目录 构建一个 Helm Chart 下面我们通过一个完整的示例来学习如何使用 Helm 创建.打包.分发.安装.升级及回退Kubernetes应用. 创建一个名为 mychart 的 Chart ...

  10. helm chart应用使用示例

    有两种方法 一是按照正常流程直接用yaml文件的形式发布应用到k8s集群上 二是把生成好的yaml文件发布到kubeapps应用商店,在应用商店中操作发布应用到k8s集群中 这里采用第二种方式的变种方 ...

随机推荐

  1. 前端自定义弹框组件、自定义弹框内容alertView popup组件

    快速实现前端自定义弹框.自定义弹框内容alertView popup组件, 请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=12491 效果图 ...

  2. Dotnet9网站回归Blazor重构,访问速度飞快,交互也更便利了!

    大家好,我是沙漠尽头的狼. Dotnet9网站回归Blazor重构,访问速度确实飞快,同时用上Blazor的交互能力,站长也同步添加了几个在线工具,这篇文章分享下Blazor的重构过程,希望对大家网站 ...

  3. 如何将mp4文件解复用并且解码为单独的.yuv图像序列以及.pcm音频采样数据?

    一.初始化解复用器 在音视频的解复用的过程中,有一个非常重要的结构体AVFormatContext,即输入文件的上下文句柄结构,代表当前打开的输入文件或流.我们可以将输入文件的路径以及AVFormat ...

  4. 深入解析Redis的LRU与LFU算法实现

    作者:vivo 互联网服务器团队 - Luo Jianxin 重点介绍了Redis的LRU与LFU算法实现,并分析总结了两种算法的实现效果以及存在的问题. 一.前言 Redis是一款基于内存的高性能N ...

  5. RabbitMQ 多消费者 使用单信道和多信道区别

    RabbitMQ 多个消费者共用一个信道实例 与 每个消费者使用不同的信道实例 区别: 1. 多个消费者共用一个信道实例:这种方式下,多个消费者共享同一个信道实例来进行消息的消费. 优点:这样可以减少 ...

  6. 【WebRtc】获取音视频数据

    首页截图 获取音视频 关键Code 获取摄像头数据 /** * 获取流数据 */ openUserMeida() { var that = this // 判断是否支持获取媒体数据 if (!navi ...

  7. Java解析CSV文件并导出数据

    Java解析CSV文件并导出筛选过得数据 pom.xml引入jar包 <!--csv--> <dependency> <groupId>com.opencsv< ...

  8. Sharding-Sphere使用HikariCP连接池连接Ojdbc6报Driver does not support get/set network timeout for connections. (oracle.jdbc.driver.T4CConnection.getNetworkTimeout()I)

    HikariCP连接Ojdbc6报错Driver does not support get/set network timeout for connections. (oracle.jdbc.driv ...

  9. Spring的Bean标签配置(一)

    Bean标签基本配置 由于配置对象交由Spring来创建 默认情况下它调用的的是类中的无参构造函数,如果没有无参构造函数则不会创建成功 id:唯一标识符号,反射是通过无参构造创建对象的. class: ...

  10. TypeScript:Type 'boolean' is not assignable to type 'never'.

    问题原因 当我们声明一个空数组而不显示键入它并尝试向其中添加元素时,会发生该错误. 解决方案 声明数组类型即可 参考链接 https://bobbyhadz.com/blog/typescript-a ...