目录

Helm 生产实践记录

记录一下helm 在生产中的实践

Helm 可以帮助我们管理 Kubernetes 应用程序 - Helm Charts 可以定义、安装和升级复杂的 Kubernetes 应用程序,Charts 包很容易创建、版本管理、分享和分布。

Helm 对于 Kubernetes 来说就相当于 yum 对于 Centos 来说,如果没有 yum 的话,我们在 Centos 下面要安装一些应用程序是极度麻烦的,同样的,对于越来越复杂的 Kubernetes 应用程序来说,如果单纯依靠我们去手动维护应用程序的 YAML 资源清单文件来说,成本也是巨大的。

Helm 与 Kubernetes 版本兼容性对照

Helm 3 版本与 Kubernetes 兼容性

Helm 版本 支持的 Kubernetes 版本范围 重要说明
Helm 3.13.x 1.25 - 1.28 最新稳定版
Helm 3.12.x 1.24 - 1.27
Helm 3.11.x 1.23 - 1.26
Helm 3.10.x 1.22 - 1.25
Helm 3.9.x 1.21 - 1.24
Helm 3.8.x 1.20 - 1.23
Helm 3.7.x 1.19 - 1.22
Helm 3.6.x 1.18 - 1.21
Helm 3.5.x 1.17 - 1.20
Helm 3.4.x 1.16 - 1.19
Helm 3.3.x 1.15 - 1.18
Helm 3.2.x 1.14 - 1.17
Helm 3.1.x 1.13 - 1.16
Helm 3.0.x 1.13 - 1.16 初始 Helm 3 版本

Helm 2 版本与 Kubernetes 兼容性 (已弃用)

Helm 版本 支持的 Kubernetes 版本范围 状态
Helm 2.17.x 1.14 - 1.17 已弃用
Helm 2.16.x 1.13 - 1.16 已弃用
已弃用

重要说明

  1. 向后兼容性:Helm 通常支持当前版本和之前几个版本的 Kubernetes。例如,Helm 3.13.x 支持 Kubernetes 1.25-1.28。

  2. 向前兼容性:较新版本的 Helm 可能不支持非常旧的 Kubernetes 集群。

  3. 最佳实践

    • 尽量使用 Helm 和 Kubernetes 的最新稳定版本
    • 保持 Helm 版本与 Kubernetes 版本差距不超过 2-3 个小版本
    • 生产环境避免使用边缘版本组合
  4. 检查方法

    1
    2
    
    helm version
    kubectl version
    
  5. 升级建议:升级 Kubernetes 集群时,应考虑同时升级 Helm 到兼容版本。

请注意,具体 Chart 可能对 Kubernetes 版本有额外要求,建议查看 Chart 的文档或 requirements.yaml 文件。

安装

由于 Helm V2 版本必须在 Kubernetes 集群中安装一个 Tiller 服务进行通信,这样大大降低了其安全性和可用性,所以在 V3 版本中移除了服务端,采用了通用的 Kubernetes CRD 资源来进行管理,这样就只需要连接上 Kubernetes 即可,而且 V3 版本已经发布了稳定版

这里使用的是helm v3版本,链接

根据kubernetes 版本选择安装合适的helm 版本,这里使用二进制的方式进行安装,安装v3.10.0 版本

1
2
3
4
5
6
# 1. 下载安装包
$ wget https://get.helm.sh/helm-v3.10.0-linux-amd64.tar.gz
# 2. 解压
$ tar -zxvf helm-v3.10.0-linux-amd64.tar.gz
# 3. move
$ mv linux-amd64/helm /usr/local/bin/helm

示例

Helm 其实就是读取的 kubeconfig 文件来访问集群的。

 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 version
version.BuildInfo{Version:"v3.10.0", GitCommit:"ce66412a723e4d89555dc67217607c6579ffcb21", GitTreeState:"clean", GoVersion:"go1.18.6"}
# 添加一个 chart 仓库
$ helm repo add stable http://mirror.azure.cn/kubernetes/charts/
"stable" has been added to your repositories
$ helm repo list
NAME    URL
stable  http://mirror.azure.cn/kubernetes/charts/

# 用 search 命令来搜索可以安装的 chart 包,已经集成了将近300个可安装的chart包
zoms@crms-10-10-192-220[/tmp]$ helm search repo stable|more
NAME                                    CHART VERSION   APP VERSION             DESCRIPTION
stable/acs-engine-autoscaler            2.2.2           2.1.1                   DEPRECATED Scales worker nodes within agent pools
stable/aerospike                        0.3.5           v4.5.0.5                DEPRECATED A Helm chart for Aerospike in Kubern...
stable/airflow                          7.13.3          1.10.12                 DEPRECATED - please use: https://github.com/air...

# 安装之前先进行更新
$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈Happy Helming!⎈

# 安装一个mysql 应用
helm install stable/mysql --generate-name

# 了解 MySQL 这个 chart 包的一些特性
helm show chart stable/mysql

# 了解 MySQL 这个 chart 包更多的特性
helm show all stable/mysql

# 查看已安装的release
helm ls

# 删除release
helm uninstall mysql-1575619811

# 删除release 时保留历史记录,方便取消删除 release(使用 helm rollback 命令)
helm uninstall mysql-1575619811 --keep-history

定制

helm show values 命令来查看一个 chart 包的所有可配置的参数选项

查看本地chart包可配置的参数选项

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ helm show values ./nms-grafana/ -n zcm9
# Default values for nms-grafana.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates

fullnameOverride: nms-grafana

replicaCount: 1

restartPolicy: Always
....

查看仓库chart包的所有可配置的参数选项,安装之前先看下镜像源是否可先pull下来,以及镜像的版本号

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ helm show values stable/mysql
## mysql image version
## ref: https://hub.docker.com/r/library/mysql/tags/
##
image: "mysql"
imageTag: "5.7.30"

strategy:
  type: Recreate

busybox:
  image: "busybox"

上面我们看到的所有参数都是可以用自己的数据来覆盖的,可以在安装的时候通过 YAML 格式的文件来传递这些参数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
$ cat config.yaml
mysqlUser:
  user0
mysqlPassword: user0pwd
mysqlDatabase: user0db
persistence:
  enabled: false
$ helm install -f config.yaml mysql stable/mysql
NAME: mysql
LAST DEPLOYED: Fri Dec  6 17:46:56 2019
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
MySQL can be accessed via port 3306 on the following DNS name from within your cluster:
mysql.default.svc.cluster.local

release 安装成功后查看对应的Pod信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ kubectl get pod -l release=mysql
NAME                    READY   STATUS            RESTARTS   AGE
mysql-ddd798f48-gnrzd   0/1     PodInitializing   0          119s
$ kubectl describe pod  mysql-ddd798f48-gnrzd
......
Environment:
      MYSQL_ROOT_PASSWORD:  <set to the key 'mysql-root-password' in secret 'mysql'>  Optional: false
      MYSQL_PASSWORD:       <set to the key 'mysql-password' in secret 'mysql'>       Optional: false
      MYSQL_USER:           user0
      MYSQL_DATABASE:       user0db
......

可以看到环境变量 MYSQL_USER=user0,MYSQL_DATABASE=user0db 的值和我们上面配置的值是一致的

在安装过程中,有两种方法可以传递配置数据:

  • –values(或者 -f):指定一个 YAML 文件来覆盖 values 值,可以指定多个值,最后边的文件优先
  • –set:在命令行上指定覆盖的配置

更多安装方式

helm install 命令可以从多个源进行安装:

  • chart 仓库(类似于上面我们提到的)
  • 本地 chart 压缩包(helm install foo-0.1.1.tgz)
  • 本地解压缩的 chart 目录(helm install foo path/to/foo)
  • 在线的 URL(helm install fool https://example.com/charts/foo-1.2.3.tgz

升级和回滚

当新版本的 chart 包发布的时候,或者当你要更改 release 的配置的时候,你可以使用 helm upgrade 命令来操作。升级需要一个现有的 release,并根据提供的信息对其进行升级。因为 Kubernetes charts 可能很大而且很复杂,Helm 会尝试以最小的侵入性进行升级,它只会更新自上一版本以来发生的变化:

1
2
3
4
5
6
7
8
$ helm upgrade -f config.yaml mysql stable/mysql
Release "mysql" has been upgraded. Happy Helming!
NAME: mysql
LAST DEPLOYED: Fri Dec  6 21:06:11 2019
NAMESPACE: default
STATUS: deployed
REVISION: 2
...

查看升级后的新设置是否生效

1
2
3
4
5
6
7
8
$ helm get values mysql
USER-SUPPLIED VALUES:
mysqlDatabase: user0db
mysqlPassword: user0pwd
mysqlRootPassword: passw0rd
mysqlUser: user0
persistence:
  enabled: false

另外如生产基本上是只替换镜像tag

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ sudo helm get values nms-grafana -n zcm9
USER-SUPPLIED VALUES:
global:
  nodeSelector:
    aik: zcm9
  repository: 10.10.192.220:52800
nms-activemq:
  image:
    tag: C_20220628200611
nms-grafana:
  image:
    tag: C_20220726192751-v9.0.1
...

查看当前release 当前版本信息以及查看某个release 的历史

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ sudo helm -n zcm9 ls
NAME                    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                           APP VERSION
minio                   zcm9            1               2022-08-11 19:27:49.792207699 +0800 CST failed          minio-10.0.4                    2022.1.8
nms-activemq            zcm9            1               2022-11-09 13:31:42.996290693 +0800 CST deployed        nms-activemq-0.1.0              9.0.44
nms-grafana             zcm9            29              2023-05-04 20:34:46.578214434 +0800 CST deployed        nms-grafana-0.1.0               aik
...

$ sudo helm -n zcm9  history nms-grafana
REVISION        UPDATED                         STATUS          CHART                   APP VERSION     DESCRIPTION
20              Thu May  4 19:52:14 2023        superseded      nms-grafana-0.1.0       aik             Upgrade complete
21              Thu May  4 19:53:14 2023        superseded      nms-grafana-0.1.0       aik             Upgrade complete
22              Thu May  4 19:58:59 2023        superseded      nms-grafana-0.1.0       aik             Upgrade complete
...

回滚

1
2
# 上面可知本地安装的应用nms-grafana 迭代至了版本29,如果要回滚至指定版本可以通过一下方式
$ helm -n zcm9 rollback nms-grafana  21