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 安装和维护:
brew install helm
在 Linux 安装:
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
备注
其他操作系统二进制版本安装方法类似
脚本安装¶
备注
推荐采用脚本安装,可以安装最新版本
https://git.io/get_helm.sh 提供了安装脚本:
curl -LO https://git.io/get_helm.sh
chmod 700 get_helm.sh
./get_helm.sh
当然,你也可以直接运行命令:
curl -L https://git.io/get_helm.sh | bash
需要注意的是,上述网站访问可能需要翻墙。
安装Tiller(废弃)¶
警告
从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
连接的默认集群:
kubectl config view
备注
请检查当前连接集群 current-context
是否正确,如果是多个集群,需要使用: kubectl config set current-context my-context
切换。
在
kube-system
名字空间创建tiller
的serviceaccount
:
kubectl -n kube-system create serviceaccount tiller
将
tiller
这个serviceaccount
绑定到cluster-admin
角色:
kubectl create clusterrolebinding tiller --clusterrole cluster-admin --serviceaccount=kube-system: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使用¶
安装软件举例( 安装NVIDIA Device Plugin ):
helm list -A
显示输出举例:
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 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:
Error: INSTALLATION FAILED: chart requires kubeVersion: >= 1.19.0-0 which is incompatible with Kubernetes v1.18.10
解决方法是先检查仓库提供了哪些chart版本:
helm search repo dcgm-exporter -l
输出显示版本列表,依次尝试后可知 2.6.10
满足当前 Kubernetes 版本要求:
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 install --generate-name gpu-helm-charts/dcgm-exporter --version 2.6.10
安装成功的输出信息:
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"