本文发布于Cylon的收藏册,转载请著名原文链接~

什么是 Helm

Helm 是一个用于管理 Kubernetes 应用程序的包管理工具。它允许您定义、安装和升级 Kubernetes 应用程序,以简化应用程序部署和管理的过程。

在 Kubernetes 中,应用程序被打包为一个或多个称为 “Charts” 的 Helm 资源。一个 Chart 是一个预定义的目录结构,包含了用于部署应用程序的 Kubernetes 资源清单模板。Chart 可以包含 Deployment、Service、ConfigMap、Ingress 等 Kubernetes 资源的定义。

使用 Helm,您可以将应用程序打包为一个 Chart,并使用 Helm 客户端来安装和管理 Chart。这使得应用程序的部署过程更加简单、可重复和可扩展。您可以根据需要部署多个实例,轻松地进行升级和回滚操作,并使用 Helm 提供的值覆盖机制来自定义每个实例的配置。

最重要的是,Helm 支持使用 Helm 仓库来共享和发布 Charts。Helm 仓库是一个集中存储 Charts 的地方,供用户从中搜索和安装 Charts。Helm 仓库可以是公共的,也可以是私有的,您可以自己搭建私有仓库来管理自己的 Charts。

Helm 所作的事情

Helm 管理名为 chart 的Kubernetes包的工具。故 Helm 可以做以下的事情:

  • 创建一个新的 chart
  • 将 chart 打包成归档 (tgz) 文件
  • 与存储 chart 的仓库进行交互
  • 在现有的 Kubernetes 集群中安装和卸载 chart
  • 管理与Helm一起安装的 chart 的发布周期

Helm中的术语

  • chart:类似于rpm包,deb包,包含Kubernetes资源所需要的必要信息。
  • repo:chart仓库,类似于yum的仓库,chart仓库是一个简单的HTTP服务。
  • values:提供了自定义信息用来覆盖模板中的默认值。
  • release :chart安装后的版本记录。

Helm 与 YAML 资源清单比有什么优势?

  1. 模板化和参数化: Helm 使用 Go 的模板引擎来创建 Kubernetes 资源清单。这使得您可以在 Chart 中使用模板来定义资源配置的部分内容,例如标签、名称、端口等。同时,Helm 还支持使用参数化的值,允许您根据不同的环境或需求来自定义 Chart 的配置。这样一来,您可以根据需要生成不同的 Kubernetes 资源清单,而无需手动编辑每个清单文件。
  2. 可重用性: Helm 提供了一种将应用程序打包为 Chart 的方式,可以将 Chart 存储在 Helm 仓库中进行共享和重用。这样,您可以使用其他人创建的 Charts 来快速部署常见的应用程序,避免从头开始编写和管理 Kubernetes 资源清单。同时,您也可以将自己的应用程序打包为 Chart,方便自己和团队在不同环境中部署和管理。
  3. 版本管理和升级: 使用 Helm,您可以对已安装的 Chart 进行版本管理和升级。当应用程序的配置或代码发生变化时,您可以通过升级 Chart 来自动应用这些更改,而无需手动修改和重新部署 Kubernetes 资源清单。Helm 还提供了回滚功能,允许您在升级出现问题时快速回退到之前的版本。
  4. 依赖管理: Helm 允许您在 Chart 中定义和管理依赖关系。这意味着您可以在部署应用程序时自动解析和安装它所依赖的其他 Charts。这样,您可以轻松地管理应用程序所需的其他资源,减少手动处理依赖关系的工作。
  5. 部署的一致性和标准化: Helm 提供了一种标准的部署方式,使得不同团队或开发者之间可以使用相同的工具和流程来管理应用程序的部署。这样可以确保在不同环境中的一致性,并降低由于不同部署方式导致的错误和配置差异。
  6. 可管理的 Charts: Helm Charts 是可管理的,您可以在 Chart 中定义预先配置的模板、默认值、钩子和配置验证。这使得管理应用程序的配置和部署过程更加灵活和可控。
  7. 社区支持和生态系统: Helm 是一个活跃的开源项目,拥有庞大的用户社区和丰富的生态系统。这意味着您可以轻松地找到文档、示例、教程和问题解答,并从社区中获取支持和贡献。
  8. 可扩展性和插件支持: Helm 提供了插件机制,允许您扩展 Helm 的功能。您可以使用插件来添加自定义的命令、功能和工作流程,以满足特定需求或自动化常见的任务。
  9. 可视化界面和用户友好性: Helm 可以与各种第三方工具和平台集成,提供可视化界面和用户友好的操作方式。这使得非技术人员或不熟悉命令行的开发人员也能够方便地部署和管理应用程序。

安装helm

Helm 安装主要官方提供了几种安装方式

  • 二进制版本安装:利用预编译好的二进制包直接解压使用
  • 使用脚本安装:Helm 提供了安装脚本,可以直接拉去最新版进行安装在本地
  • 各操作系统上的包管理工具进行安装

添加源

1
2
helm repo add stable http://mirror.azure.cn/kubernetes/charts/
helm repo add incubator http://mirror.azure.cn/kubernetes/charts-incubator/

Helm 使用例子 [2]

命令行参数

命令 说明
helm list 查看发布
helm remove 删除
helm repo add xxx url 添加仓库
helm upgrade 更新
helm rollback 回滚
–generate-name 为部署的应用生成一个随即名
–namespace 部署在哪个名称空间
–set 覆盖 chart 中的默认 values 值
inspect 查看存在哪些 values 值
show 查看你要查看的内容,例如 chart, values等

使用本地 chart 包安装

1
2
3
4
5
$ helm install --generate-name ./

# 或者

$ helm install --generate-name ./charts/grafana-6.56.6.tgz

查看 chart 中的 values

查看 chart 中的 values,可以查看 tar 归档的 chart

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
$ helm show values ./charts/grafana-6.56.6.tgz

global:
  # To help compatibility with other charts which use global.imagePullSecrets.
  # Allow either an array of {name: pullSecret} maps (k8s-style), or an array of strings (more common helm-style).
  # Can be tempalted.
  # global:
  #   imagePullSecrets:
  #   - name: pullSecret1
  #   - name: pullSecret2
  # or
  # global:
  #   imagePullSecrets:
  #   - pullSecret1
  #   - pullSecret2
  imagePullSecrets: []

rbac:
  create: true
  ## Use an existing ClusterRole/Role (depending on rbac.namespaced false/true)
  # useExistingRole: name-of-some-(cluster)role
  pspEnabled: false
  pspUseAppArmor: false
  namespaced: false
  extraRoleRules: []
  # - apiGroups: []
  #   resources: []
  #   verbs: []
  extraClusterRoleRules: []
  # - apiGroups: []
  #   resources: []
  #   verbs: []
serviceAccount:
  create: true
  name:
  nameTest:
  ## ServiceAccount labels.
  labels: {}

....

也可以查看解压后的

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
$ helm show values ./

# Default values for kube-prometheus-stack.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

## Provide a name in place of kube-prometheus-stack for `app:` labels
##
nameOverride: ""

## Override the deployment namespace
##
namespaceOverride: ""

## Provide a k8s version to auto dashboard import script example: kubeTargetVersionOverride: 1.16.6
##
kubeTargetVersionOverride: ""

## Allow kubeVersion to be overridden while creating the ingress
##
kubeVersionOverride: ""

## Provide a name to substitute for the full names of resources
##
fullnameOverride: ""

## Labels to apply to all resources
##
commonLabels: {}
# scmhash: abc123
# myLabel: aakkmd

## Create default rules for monitoring the cluster
##
defaultRules:
  create: true
  rules:
    alertmanager: true
    etcd: true
    configReloaders: true
    general: true
:

....

查看 chart 包

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
$ helm show chart .
annotations:
  artifacthub.io/license: Apache-2.0
  artifacthub.io/links: |
    - name: Chart Source
      url: https://github.com/prometheus-community/helm-charts
    - name: Upstream Project
      url: https://github.com/prometheus-operator/kube-prometheus
  artifacthub.io/operator: "true"
apiVersion: v2
appVersion: v0.65.1
dependencies:
- condition: kubeStateMetrics.enabled
  name: kube-state-metrics
  repository: https://prometheus-community.github.io/helm-charts
  version: 5.6.*
- condition: nodeExporter.enabled
  name: prometheus-node-exporter
  repository: https://prometheus-community.github.io/helm-charts
  version: 4.16.*
- condition: grafana.enabled
  name: grafana
  repository: https://grafana.github.io/helm-charts
  version: 6.56.*
description: kube-prometheus-stack collects Kubernetes manifests, Grafana dashboards,
  and Prometheus rules combined with documentation and scripts to provide easy to
  operate end-to-end Kubernetes cluster monitoring with Prometheus using the Prometheus
  Operator.
home: https://github.com/prometheus-operator/kube-prometheus
icon: https://raw.githubusercontent.com/prometheus/prometheus.github.io/master/assets/prometheus_logo-cb55bb5c346.png
keywords:
- operator
- prometheus
- kube-prometheus
kubeVersion: '>=1.16.0-0'
maintainers:
- email: andrew@quadcorps.co.uk
  name: andrewgkew
- email: gianrubio@gmail.com
  name: gianrubio
- email: github.gkarthiks@gmail.com
  name: gkarthiks
- email: kube-prometheus-stack@sisti.pt
  name: GMartinez-Sisti
- email: scott@r6by.com
  name: scottrigby
- email: miroslav.hadzhiev@gmail.com
  name: Xtigyro
- email: quentin.bisson@gmail.com
  name: QuentinBisson
name: kube-prometheus-stack
sources:
- https://github.com/prometheus-community/helm-charts
- https://github.com/prometheus-operator/kube-prometheus
type: application
version: 46.5.0

show 查看chart值,可查看在线和离线

1
$ helm show values stable/jenkins | url | file  # 查看chart包values

覆盖 chart 默认values值

使用 –set 可以覆盖 chart 的默认值,可以指定多个

1
2
3
$ helm install --generate-name ./ \
	--set alertmanager.service.type=NodePort \
	--set prometheus.service.type=NodePort

更新一个应用

可以依据一个已经存在的 Chart 来更新已经部署过的应用

1
2
3
$ helm upgrade chart-1685626375 ./ \
	--set alertmanager.service.type=NodePort \
	--set prometheus.service.type=NodePort

查看对应 service 配置已经更改

1
2
3
4
5
$  kubectl get svc
NAME                                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
chart-1685626375-kube-prom-alertmanager     NodePort    10.96.187.159    <none>        9093:30903/TCP               103m
chart-1685626375-kube-prom-operator         ClusterIP   10.98.6.186      <none>        443/TCP                      103m
chart-1685626375-kube-prom-prometheus       NodePort    10.98.68.1       <none>        9090:30090/TCP               103m

从仓库下载一个 Chart

1
$ helm fetch stable/minio

Chart

Charts 是创建在特定目录下面的文件集合,然后可以将它们打包到一个版本化的存档中来部署。接下来我们就来看看使用 Helm 构建 charts 的一些基本方法。

Chart.yaml文件是chart必需的。包含了以下字段:

apiVersion 版本的说明

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
apiVersion: chart API 版本 (必需)
name: chart名称 (必需)
version: 语义化2 版本(必需)
kubeVersion: 兼容Kubernetes版本的语义化版本(可选)
description: 一句话对这个项目的描述(可选)
type: chart类型 (可选)
keywords:
  - 关于项目的一组关键字(可选)
home: 项目home页面的URL (可选)
sources:
  - 项目源码的URL列表(可选)
dependencies: # chart 必要条件列表 (可选)
  - name: chart名称 (nginx)
    version: chart版本 ("1.2.3")
    repository: 仓库URL ("https://example.com/charts") 或别名 ("@repo-name")
    condition: (可选) 解析为布尔值的yaml路径,用于启用/禁用chart (e.g. subchart1.enabled )
    tags: # (可选)
      - 用于一次启用/禁用 一组chart的tag
    enabled: (可选) 决定是否加载chart的布尔值
    import-values: # (可选)
      - ImportValue 保存源值到导入父键的映射。每项可以是字符串或者一对子/父列表项
    alias: (可选) chart中使用的别名。当你要多次添加相同的chart时会很有用
maintainers: # (可选)
  - name: 维护者名字 (每个维护者都需要)
    email: 维护者邮箱 (每个维护者可选)
    url: 维护者URL (每个维护者可选)
icon: 用做icon的SVG或PNG图片URL (可选)
appVersion: 包含的应用版本(可选)。不需要是语义化的
deprecated: 不被推荐的chart (可选,布尔值)
annotations:
  example: 按名称输入的批注列表 (可选).

--dry-run 模拟安装

--debug 详细的输出

--generate-name:生成随机实例名

1
helm install --generate-name --dry-run --debug --set favoriteDrink=7up ./testchart

go template

{{ .Values.favoriteDrink }} 读取变量值

quote go template 函数,引用字符串 ,给变量值加""

pipeline 可将多个功能连接在一起

默认值 chart.yaml gender: {{ .values.gender|default "zhangsan" }} values.yaml 中不能加default函数

流程控制

if else

1
2
3
4
5
6
7
{{ if PIPELINE }}
  # Do something
{{ else if OTHER PIPELINE }}
  # Do something else
{{ else }}
  # Default case
{{ end }}

如果 pipeline的值被判定为如下的值则为false:

  • a boolean false
  • a numeric zero
  • an empty string
  • a nil (empty or null)
  • an empty collection (map, slice, tuple, dict, array)

使用 - 摆脱新行{{- if eq .Values.favorite.drink "coffee" }} - 在前面表示删除前面的空行,在后面表示删除后面的空行,{{- 之间没有空格

{{ indent 2 "mug:true" }} 缩进,缩进的是文字内容不是yaml

{{with .Values.xxx}} {{end}} 提升作用于,release: {{ $.Release.Name }} 执行时将变量映射到根域,可以在作用域中使用

Reference

[1] Implementing a custom Kubernetes authentication method

[2] Helm 命令行

[3] Users in Kubernetes

[4] bootstrap tokens

[5] Webhook Token Authentication

本文发布于Cylon的收藏册,转载请著名原文链接~

链接:https://www.oomkill.com/2019/11/helm/

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」 许可协议进行许可。