Helm V3使用指北

前言

什么是 Helm?Helm 是云原生领域最火热的应用管理工具。众所周知 Kubernetes 是自动化的容器管理平台,然而 Kubernetes 并没有抽象出应用的概念,通常应用的描述是非常复杂的,一个应用可能是由多种资源组成。例如一个典型的前后端分离的应用包含以下资源:

  1. web-application-deployment.yaml,前端 Web 服务。
  2. web-service.yaml,前端服务访问入口。
  3. backend-server-deployment.yaml,后端服务。
  4. backend-server-configmap.yaml,后端服务配置。
  5. backend-mysql.yaml,后端服务依赖的 Mysql 实例。
  6. backend-mysql-service.yaml,Mysql 实例访问入口。

我们通过多次 kubectl apply -f 上述资源,但是后续无法有效管理应用所包含的资源。这也正是 Helm 要解决的难题,更好地帮助用户定义、部署以及管理应用。

Helm核心概念

Chart

Helm 采用 Chart 的格式来标准化描述一个应用(K8S 资源文件集合),Chart 有自身标准的目录结构,可以将目录打包成版本化的压缩包进行部署。就像我们下载一个软件包之后,就可以在电脑上直接安装一样,同理 Chart 包可以通过 Helm 部署到任意的 K8S 集群中。

Config

Config 指应用配置参数,在 Chart 中由 values.yaml 和命令行参数组成。Chart 采用 Go Template 的特性 + values.yaml 对部署的模板文件进行参数渲染,也可以通过 Helm Client 的命令
--set key=value 的方式进行参数赋值。

Repository

类似于 Docker Hub,Helm 官方、阿里云等社区都提供了 Helm Repository,我们可以通过 helm repo add 导入仓库地址,便可以检索仓库并选择别人已经制作好的 Chart 包,开箱即用。

Release

Release 代表 Chart 在集群中的运行实例,同一个集群的同一个 Namespace 下 Release 名称是唯一的。Helm 围绕 Release 对应用提供了强大的生命周期管理能力,包括 Release 的查询、安装、更新、删除、回滚等。

Helm V2 & V3 架构设计

Helm V2 到 V3 经历了较大的变革,其中最大的改动就是移除了 Tiller 组件,所有功能都通过 Helm CLI 与 ApiServer 直接交互。Tiller 在 V2 的架构中扮演着重要的角色,但是它与 K8S 的设计理念是冲突的。

  1. 围绕 Tiller 管理应用的生命周期不利于扩展。
  2. 增加用户的使用壁垒,服务端需要部署 Tiller 组件才可以使用,侵入性强。
  3. K8S 的 RBAC 变得毫无用处,Tiller 拥有过大的 RBAC 权限存在安全风险。
  4. 造成多租户场景下架构设计与实现复杂。
image

基本使用

Chart目录结构

image

每个 Chart 固定由 charts 目录、templates 目录、Chart.yaml 等必要的内容组成。Chart 的描述形式是非常灵活的,是可以嵌套多层 Chart 的,但是并不推荐这么写。

模板管理

  • 创建 Chart 骨架

    helm create ./chart-demo
    
  • Chart 打包

    helm package ./chart-demo
    
  • 获取 Chart 包元数据信息

    helm inspect chart ./chart-demo
    
  • 本地渲染模板文件

    helm template ${chart-demo-release-name} --namespace ${namespace} ./chart-demo
    
  • 查询 Chart 依赖信息

    helm dependency list ./chart-demo
    

模板部署

  • 查询 Release 列表

    helm list --namespace ${namespace}
    
  • Chart 安装

    helm install ${chart-demo-release-name} ./chart-demo --namespace ${namespace}
    
  • Chart 版本升级

    helm upgrade ${chart-demo-release-name} ./chart-demo-new-version --namespace ${namespace}
    
  • Chart 版本回滚

    helm rollback ${chart-demo-release-name} ${revision} --namespace ${namespace}
    
  • 查看 Release 历史版本

    helm history ${chart-demo-release-name} --namespace ${namespace}
    

第三方仓库

  • 添加第三方仓库

    helm repo add stable http://kubernetes-charts.storage.googleapis.com/
    
  • 检索第三方仓库

    helm search repo ${keyword}
    

一些最佳实践

Job 无法重新执行

Job 更新后想重新升级版本,结果发现 Job 资源冲突。有以下解决办法:

  1. 发布产品层解析 Chart,控制 Job 资源的清理。
  2. 采用 Helm 的 hook 机制,来干预 Release 生命周期的执行点。比较推荐这种做法。

Helm 定义的 hooks

名称 说明
pre-install 在模板渲染后,K8S 创建资源之前执行
post-install 资源加载至 K8S 后执行
pre-delete K8S 删除资源之前执行
post-delete 删除 Release 资源后执行
pre-upgrade 在模板渲染后,资源加载至 K8S 之前执行
post-upgrade 在所有资源升级后执行升级
pre-rollback 模板渲染后,资源已回滚之前,在回滚请求上执行
post-rollback 在修改所有资源后执行回滚请求

hook 删除策略

名称 说明
hook-succeeded hook 成功执行后删除
hook-failed hook 执行期间失败删除
before-hook-creation 创建新 hook 之前删除以前的 hook

hooks 的常用场景

  1. 安装 Chart 之前执行数据库初始化工作。
  2. 安装 Chart 之前加在 ConfigMap 或者 Secret。
  3. 删除 Release 之前执行清理工作,实现优雅下线。

hooks 实现 Job 资源管理

  • Chart 目录结构

      test-job
      ├── Chart.yaml
      ├── charts
      └── templates
          ├── hooks
          │   └── pi-job.yaml
          └── deployment.yaml
    
  • pi-job.yaml

      apiVersion: batch/v1
      kind: Job
      metadata:
        name: pi
        annotations:
          "helm.sh/hook": "pre-install,pre-upgrade,pre-rollback"
          "helm.sh/hook-delete-policy": "before-hook-creation"
          "helm.sh/hook-weight": "-5" # 字符串类型,可以为正数或者负数,在每个执行周期的时间点会对 hook 进行排序
      spec:
        template:
          spec:
            containers:
              - name: pi
                image: perl
                command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
            restartPolicy: Never
        backoffLimit: 4
    

ConfigMap/Secret 更新不生效

部署好的应用,再次变更 ConfigMap/Secret 后,Workload 并无法感知。有以下解决办法:

  1. 应用程序实现定时读取 ConfigMap/Secret 的功能,更新配置参数。

  2. 在 Workload 模板文件的 spec.template.metadata 中加入如下内容,只要有 ConfigMap/Secret 的变更,都会触发 Pod 的重建。

    annotations:
        checksum/config: {{ include (print $.Chart.Name "/templates/" $.Chart.Name "-configmap.yaml") . | sha256sum }}
    

应用发布顺序依赖

虽然 Chart 可以通过 requirements.yaml 来管理依赖关系,并按照顺序下发模板资源,但是并无法控制子 Chart 之间的发布顺序。例如服务 B 部署必须依赖服务 A 的资源全部 Ready。可以通过自定义子 Chart 之间的依赖顺序,在产品层控制每个子 Chart 的发布过程。

总结与展望

Helm 在云原生技术体系中提供了强大应用管理能力,Helm + K8S 使得复杂应用的部署成本大幅度降低。V3 版本社区也在快速地迭代当中,完全拥抱 K8S 的设计理念,你完全可以像 Kubectl 一样使用 Helm。

Helm 在企业级的落地需要考虑诸多因素,如技术风险能力、无损发布、资源依赖等等,这些虽然看上去并不是 Helm 所管辖的范畴,但都是生产环境稳定落地需要解决的问题,这就需要与企业的技术生态做深度的打通。

转载请注明出处,欢迎关注我的公众号:亚普的技术轮子

亚普的技术轮子

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容