Helm - Kubernetes包管理器

Helm (英文原义是"舵") 是用来管理Kubernetes应用程序的包管理器,Helm Charts 可以用于定义、安装以及更新复杂的Kubernetes应用程序。最新的Helm由 CNCF 负责维护,由微软、Google,Bitnami以及Helm社区合作。

备注

Helm是Kubernetes应用程序定义和安装、更新的管理器,而 Operator 是Kubernetes定义和部署工具。那么两者有什么区别和使用场景的不同呢? 在Haker News上有一个 Can anyone talk about the positives/negatives of Operators v/s Helm Charts? 的讨论

Comparing Kubernetes Operator Pattern with alternatives 对比了Operator和Helm在实践Postgres数据库的不同点,可以参考。

Helm分为客户端Helm (运行在你的客户端电脑,有多种版本) 和集群服务器端组件Tiller (运行在Kubernetes集群) 新版本helm已经不再需要部署服务器端Tiller,仅需要本地安装 helm 就可以工作。

安装Helm

二进制执行程序安装

Helm的release 提供了不同操作系统的二进制执行程序,可以手工下载进行安装:

  • 在 macOS 安装:

    wget https://get.helm.sh/helm-v2.14.1-darwin-amd64.tar.gz
    tar -zxvf helm-v2.14.1-darwin-amd64.tar.gz
    sudo mv darwin-amd64/helm /usr/local/bin/helm
    

推荐采用 Homebrew 安装和维护:

macOS 平台通过 Homebrew 安装Helm
brew install helm
  • 在 Linux 安装:

在Linux平台安装helm
version=3.12.2
wget https://get.helm.sh/helm-v${version}-linux-amd64.tar.gz
tar -zxvf helm-v${version}-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/local/bin/helm

备注

其他操作系统二进制版本安装方法类似

备注

macOS 平台推荐采用 Homebrew 安装,便于升级维护;在Linux上建议采用发行版仓库安装

脚本安装

备注

推荐采用脚本安装,可以安装最新版本

https://git.io/get_helm.sh 提供了安装脚本:

使用官方脚本安装 helm
curl -LO https://git.io/get_helm.sh
chmod 700 get_helm.sh
./get_helm.sh

当然,你也可以直接运行命令:

一条命令直接使用官方脚本安装 helm
curl -L https://git.io/get_helm.sh | bash

需要注意的是,上述网站访问可能需要翻墙。

安装Tiller(废弃)

警告

Helm v3 Beta 1 Released :

  • 从Helm v3开始,已经移除了 Tiller ,不再需要集群的 admin 权限,也不需要在任何namespace安装Tiller了

  • 对应 helm init 命令也不存在了,所以本段落安装步骤 只适合 Helm v2 ,你可以看到我现在很多实践helm安装已经没有 Tiller 步骤(例如 安装Ingress NGINX )

Tiller是 helm 命令的集群端组件,用于接收 helm 的命令并直接和Kubernetes API通讯以实际执行创建或删除资源的工作。大多数云平台激活了称为基于角色的访问控制(Role-Based Access Control, RBAC)功能。这种环境下,为了能够给予 Tiller 足够权限,可以使用 Kubernetes serviceaccount 资源。

最简单的在集群上安装 tiller 是使用 helm init 命令,该命令会校验 helm 的本地环境以便正确设置。然后会连接到 kubectl 默认连接的集群( 通过 kubectl config view 可以看到当前默认配置连接的集群 ),一旦正确连接到集群,就会在 kube-system 名字空间中安装 tiller

  • 检查本地 kubectl 连接的默认集群:

检查当前连接的Kubernetes集群
kubectl config view

备注

请检查当前连接集群 current-context 是否正确,如果是多个集群,需要使用: kubectl config set current-context my-context 切换。

  • kube-system 名字空间创建 tillerserviceaccount :

创建tiller的serviceaccount
kubectl -n kube-system create serviceaccount tiller
  • tiller 这个 serviceaccount 绑定到 cluster-admin 角色:

tiller的serviceaccount绑定到cluster-admin角色
kubectl create clusterrolebinding tiller --clusterrole cluster-admin --serviceaccount=kube-system:tiller
  • 执行 helm init 则将 tiller 安装到集群中:

helm init安装tiller
helm init --service-account tiller

备注

注意默认Tiller部署采用的是非安全的 allow unauthenticated users 策略,为避免这个问题,请在运行 helm init 命令时添加参数 --tiller-tls-verify 。这里我是测试环境验证,后续生产环境部署需要改进。

  • 安装完成后检查验证 tiller 运行,注意在kubernetes集群中的 kube-system namespace有新的pod名为 tiller-deploy-xxxx

    kubectl get pods --namespace kube-system
    

输出显示:

NAME                                   READY   STATUS    RESTARTS   AGE
...
tiller-deploy-9bf6fb76d-lj2dx          1/1     Running   0          2m1s

helm使用

检查通过helm已经安装的软件release(删除时候必须指定release)
helm list -A

显示输出举例:

检查通过helm已经安装的软件release输出信息
NAME                            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                           APP VERSION
cilium                          kube-system     16              2022-08-23 01:45:55.930793439 +0800 CST deployed        cilium-1.12.1                   1.12.1
nvidia-device-plugin-1673515385 kube-system     1               2023-01-12 17:23:07.770233072 +0800 CST deployed        nvidia-device-plugin-0.13.0     0.13.0
  • 删除helm chart(uninstall release):

使用helm uninstall删除指定release,注意必须指定namespace(如果不是默认namespace)
helm uninstall nvidia-device-plugin-1673515385 -n kube-system

提示信息:

release "nvidia-device-plugin-1673515385" uninstalled

对于非默认namespace的helm chart,如果没有指定namespace,则会报错。例如上文的 nvidia-device-plugin 如果执行:

helm uninstall nvidia-device-plugin-1673515385

会报错:

Error: uninstall: Release not loaded: nvidia-device-plugin-1673515385: release: not found

正确方式应该是同时指定 namespace

helm uninstall nvidia-device-plugin-1673515385 -n nvidia-gpu

指定 $KUBECONFIG

对于需要维护多个集群的环境, helm 也可以和 安装kubectl 一样指定 $KUBECONFIG 变量:

export KUBECONFIG=/path_to_your_kubeconfig_file
helm version
helm list

备注

helm 默认使用 ~/.kube/config (同 安装kubectl )

helm代理

在墙内使用 helm 最大的困扰是很多仓库位于google,在墙内访问几乎是 不可能完成的任务 。解决的方法是采用代理,例如 Squid父级socks代理 ,此时只需要配置 proxy 环境变量(其实就是Linux操作系统通用的代理配置) Linux代理环境变量

helm安装特定版本chart

我在 在Kuternetes集成GPU可观测能力 遇到一个问题: dcgm-exporter 要求 Kubernetes >= 1.19.0-0:

安装 DCGM-Exporter 遇到Kubernetes版本不满足要求(需要安装低版本 dcgm-exporter )
Error: INSTALLATION FAILED: chart requires kubeVersion: >= 1.19.0-0 which is incompatible with Kubernetes v1.18.10

解决方法是先检查仓库提供了哪些chart版本:

搜索helm仓库获取软件的不同版本列表
helm search repo dcgm-exporter -l

输出显示版本列表,依次尝试后可知 2.6.10 满足当前 Kubernetes 版本要求:

搜索helm仓库获取软件的不同版本列表
NAME                         	CHART VERSION	APP VERSION	DESCRIPTION
gpu-helm-charts/dcgm-exporter	3.1.3        	3.1.3      	A Helm chart for DCGM exporter
gpu-helm-charts/dcgm-exporter	3.1.2        	3.1.2      	A Helm chart for DCGM exporter
gpu-helm-charts/dcgm-exporter	3.0.0        	3.0.0      	A Helm chart for DCGM exporter
gpu-helm-charts/dcgm-exporter	2.6.10       	2.6.10     	A Helm chart for DCGM exporter
gpu-helm-charts/dcgm-exporter	2.6.9        	2.6.9      	A Helm chart for DCGM exporter
...

安装指定 2.6.10 版本 dcgm-exporter chart:

安装指定版本helm chart
helm install --generate-name gpu-helm-charts/dcgm-exporter --version 2.6.10

安装成功的输出信息:

安装指定版本helm chart成功的输出信息
NAME: dcgm-exporter-1680364448
LAST DEPLOYED: Sat Apr  1 23:54:13 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods -n default -l "app.kubernetes.io/name=dcgm-exporter,app.kubernetes.io/instance=dcgm-exporter-1680364448" -o jsonpath="{.items[0].metadata.name}")
  kubectl -n default port-forward $POD_NAME 8080:9400 &
  echo "Visit http://127.0.0.1:8080/metrics to use your application"

参考