什么是Helm

Helm官网
Helm 是 Kubernetes 的包管理器,使用chart来帮助您管理Kubernetes的应用,即使是最复杂的应用程序,helm都可以定义,安装和升级。

三大概念

Chart 代表着 Helm 包。它包含在 Kubernetes 集群内部运行应用程序,工具或服务所需的所有资源定义。你可以把它看作是 Homebrew formula,Apt dpkg,或 Yum RPM 在Kubernetes 中的等价物。

Repository(仓库) 是用来存放和共享 charts 的地方。它就像 Perl 的 CPAN 档案库网络 或是 Fedora 的 软件包仓库,只不过它是供 Kubernetes 包所使用的。

Release 是运行在 Kubernetes 集群中的 chart 的实例。一个 chart 通常可以在同一个集群中安装多次。每一次安装都会创建一个新的 release。以 MySQL chart为例,如果你想在你的集群中运行两个数据库,你可以安装该chart两次。每一个数据库都会拥有它自己的 release 和 release name。

在了解了上述这些概念以后,我们就可以这样来解释 Helm:

Helm 安装 charts 到 Kubernetes 集群中,每次安装都会创建一个新的 release。你可以在 Helm 的 chart repositories 中寻找新的 chart。

Helm的组件

Helm是一个可执行文件,执行时分成两个不同的部分:

Helm客户端 是终端用户的命令行客户端。负责以下内容:

本地chart开发
管理仓库
管理发布
与Helm库建立接口
    发送安装的chart
    发送升级或卸载现有发布的请求

Helm库 提供执行所有Helm操作的逻辑。与Kubernetes API服务交互并提供以下功能:

结合chart和配置来构建版本
将chart安装到Kubernetes中,并提供后续发布对象
与Kubernetes交互升级和卸载chart

Helm的安装

安装指南

搭建私有Chart仓库

chart仓库服务器就是一个简单的HTTP服务器,提供一个index.yaml 文件来描述一批chart, 并且提供每个chart的下载位置信息

  1. 使用docker启动一个nginx容器
[root@k8s-master01 docker]# docker run -d --name=private-repo --net=host  -v /home/helm/charts:/usr/share/nginx/html/charts -d nginx
7e0ad50ab123612eedf59e8ac1b8bd00ae5dc7921468deff77899d9f040cca5c
  1. 创建并打包一个helm应用
[root@k8s-master01 charts]# helm create zookeeper # 创建 
Creating zookeeper
[root@k8s-master01 charts]# helm package zookeeper # 打包成tgz待上传到chart仓库
Successfully packaged chart and saved it to: /home/helm/charts/zookeeper-0.1.0.tgz
[root@k8s-master01 charts]# ls
zookeeper  zookeeper-0.1.0.tgz

  1. 生成库的index文件
# 创建一个临时目录 用于生成index.yaml文件
[root@k8s-master01 charts]# mkdir repo
[root@k8s-master01 charts]# mv zookeeper-0.1.0.tgz  repo
[root@k8s-master01 charts]# helm repo index repo --url http://192.168.255.138/charts 

  1. 将生成的index.yaml文件及charts包复制到nginx的charts目录下面
[root@k8s-master01 repo]# ll
total 8
-rw-r--r-- 1 root root  432 Jan  3 23:20 index.yaml
-rw-r--r-- 1 root root 3960 Jan  3 23:16 zookeeper-0.1.0.tgz
[root@k8s-master01 repo]# mv index.yaml zookeeper-0.1.0.tgz  ../
[root@k8s-master01 charts]# ls
index.yaml  repo  zookeeper  zookeeper-0.1.0.tgz

  1. 添加私有仓库
[root@k8s-master01 charts]# helm repo add private-repo http://192.168.255.138/charts
[root@k8s-master01 charts]# helm repo list
NAME        	URL
bitnami     	https://charts.bitnami.com/bitnami
private-repo	http://192.168.255.138/charts
  1. 搜索测试私有chart仓库
[root@k8s-master01 charts]# helm search repo private-repo
NAME                  	CHART VERSION	APP VERSION	DESCRIPTION
private-repo/zookeeper	0.1.0        	1.16.0     	A Helm chart for Kubernetes

Helm的基础命令使用

快速入门指南
命令文档

基础使用

  1. 添加仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
  1. 查看仓库
[root@k8s-master01 configmap-test]# helm repo list
NAME   	URL
bitnami	https://charts.bitnami.com/bitnami
  1. 搜索chart
[root@k8s-master01 configmap-test]# helm search repo zookeeper
NAME                    	CHART VERSION	APP VERSION	DESCRIPTION
bitnami/zookeeper       	12.4.1       	3.9.1      	Apache ZooKeeper provides a reliable, centraliz...
bitnami/dataplatform-bp2	12.0.5       	1.0.1      	DEPRECATED This Helm chart can be used for the ...
bitnami/kafka           	26.6.2       	3.6.1      	Apache Kafka is a distributed streaming platfor...
bitnami/schema-registry 	16.2.5       	7.5.2      	Confluent Schema Registry provides a RESTful in...
bitnami/solr            	8.3.4        	9.4.0      	Apache Solr is an extremely powerful, open sour...
  1. 拉取chart
[root@k8s-master01 configmap-test]# helm pull bitnami/zookeeper # 拉取成功后本地会多一个tgz的chart包
[root@k8s-master01 configmap-test]# ll
-rw-r--r-- 1 root root 45105 Jan  2 21:50 zookeeper-12.4.1.tgz

  1. 修改配置文件(测试使用、非标准操作)
修改values.yaml文件
修改点1:关闭持久化数据
## Enable persistence using Persistent Volume Claims
## ref: https://kubernetes.io/docs/user-guide/persistent-volumes/
##
persistence:
## @param persistence.enabled Enable ZooKeeper data persistence using PVC. If false, use emptyDir
##
enabled: false
  1. 创建名称空间
kubectl create ns helm-zookeeper
  1. 通过chart包来发布资源对象
helm install zookeeper-chart . -n helm-zookeeper # 所在路径要和values、templates同级

# 资源对象验证
[root@k8s-master01 zookeeper]# kubectl get all -n helm-zookeeper
NAME                    READY   STATUS    RESTARTS   AGE
pod/zookeeper-chart-0   1/1     Running   0          10m

NAME                               TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
service/zookeeper-chart            ClusterIP   10.10.74.141   <none>        2181/TCP,2888/TCP,3888/TCP   10m
service/zookeeper-chart-headless   ClusterIP   None           <none>        2181/TCP,2888/TCP,3888/TCP   10m

NAME                               READY   AGE
statefulset.apps/zookeeper-chart   1/1     10m

# 查看
[root@k8s-master01 zookeeper]# helm list -n helm-zookeeper
NAME           	NAMESPACE     	REVISION	UPDATED                                	STATUS  	CHART           	APP VERSION
zookeeper-chart	helm-zookeeper	1       	2024-01-02 22:10:18.410699786 +0800 CST	deployed	zookeeper-12.4.1	3.9.1

# zk服务验证
[root@k8s-master01 zookeeper]# kubectl exec -it zookeeper-chart-0  -n helm-zookeeper -- sh
$  /opt/bitnami/zookeeper/bin/zkServer.sh status
/opt/bitnami/java/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/bitnami/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: standalone # Zookeeper的standalone模式表示Zookeeper服务以单机模式运行,没有集群功能

8.通过helm升级 现有资源对象

修改 values.yaml文件replicaCount 为3并且保存
## @param replicaCount Number of ZooKeeper nodes
##
replicaCount: 3

# 执行升级
[root@k8s-master01 zookeeper]# helm upgrade zookeeper-chart . -n helm-zookeeper
Release "zookeeper-chart" has been upgraded. Happy Helming!
NAME: zookeeper-chart
LAST DEPLOYED: Tue Jan  2 22:32:08 2024
NAMESPACE: helm-zookeeper
STATUS: deployed
REVISION: 2 # 这里版本会变
TEST SUITE: None
NOTES:
CHART NAME: zookeeper
CHART VERSION: 12.4.1
APP VERSION: 3.9.1

# 验证zk集群
[root@k8s-master01 zookeeper]# kubectl exec -it zookeeper-chart-0 -n helm-zookeeper -- sh
$ /opt/bitnami/zookeeper/bin/zkServer.sh status
/opt/bitnami/java/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/bitnami/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower  # 备节点
$
You have new mail in /var/spool/mail/root
[root@k8s-master01 zookeeper]# kubectl exec -it zookeeper-chart-1 -n helm-zookeeper -- sh
$ /opt/bitnami/zookeeper/bin/zkServer.sh status
/opt/bitnami/java/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/bitnami/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower # 备节点
$
[root@k8s-master01 zookeeper]# kubectl exec -it zookeeper-chart-2 -n helm-zookeeper -- sh
$ /opt/bitnami/zookeeper/bin/zkServer.sh status
/opt/bitnami/java/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/bitnami/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader # 主节点
  1. 回滚版本
  • 查看发布历史 :helm history zookeeper-chart -n helm-zookeeper
[root@k8s-master01 zookeeper]# helm history zookeeper-chart -n helm-zookeeper
REVISION	UPDATED                 	STATUS    	CHART           	APP VERSION	DESCRIPTION
1       	Tue Jan  2 22:10:18 2024	superseded	zookeeper-12.4.1	3.9.1      	Install complete
2       	Tue Jan  2 22:32:08 2024	deployed  	zookeeper-12.4.1	3.9.1      	Upgrade complete

  • 回滚到版本1: helm rollback zookeeper-chart 1 -n helm-zookeeper
[root@k8s-master01 configmap-test]# helm rollback zookeeper-chart -n helm-zookeeper
Rollback was a success! Happy Helming!
[root@k8s-master01 configmap-test]# helm history zookeeper-chart -n helm-zookeeper
REVISION	UPDATED                 	STATUS    	CHART           	APP VERSION	DESCRIPTION
1       	Tue Jan  2 22:10:18 2024	superseded	zookeeper-12.4.1	3.9.1      	Install complete
2       	Tue Jan  2 22:32:08 2024	superseded	zookeeper-12.4.1	3.9.1      	Upgrade complete
3       	Tue Jan  2 23:23:16 2024	deployed  	zookeeper-12.4.1	3.9.1      	Rollback to 1

  • 再次查看pod发现又变更为1个pod了: kubectl get po -n helm-zookeeper
[root@k8s-master01 configmap-test]#  kubectl get po -n helm-zookeeper
NAME                READY   STATUS    RESTARTS   AGE
zookeeper-chart-0   1/1     Running   0          6m37s
  1. 卸载
    helm uninstall zookeeper-chart -n helm-zookeeper
 zhangzk@k8smaster:~/helm/zookeeper$ helm uninstall zookeeper-chart -n helm-zookeeper
 release "zookeeper-chart" uninstalled

其他命令

  1. 打包chart
helm package <chart-directory> # 该命令将chart打包成一个chart版本包文件。
# 如果给定路径,就会在该路径中查找chart(必须包含Chart.yaml文件)然后将目录打包。

chart版本包会用于Helm包仓库。
  1. Helm展示
  • helm show all <chart包的路径> # 现实chart的所有配置
  • helm show chart <chart包的路径> # 就是cat Chart.yaml
  • helm show values <chart包的路径> # 就是cat values.yaml
  • helm show crds <chart包的路径> # 显示chart的CRD
  1. 检查chart包正确性
[root@k8s-master01 helm]# helm lint zookeeper
==> Linting zookeeper

1 chart(s) linted, 0 chart(s) failed

创建Chart

helm create configmap-test
[root@k8s-master01 helm_test]# tree configmap-test/
configmap-test/
├── charts # 包含此chart依赖的其他chart
├── Chart.yaml # Chart信息的yaml文件
├── templates # 模板、根据实际情况择取文件
│   ├── deployment.yaml
│   ├── _helpers.tpl # 用于定义可重用的 Helm 模板函数和全局变量
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt # 描述信息
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml # chart 默认的配置值

3 directories, 10 files

[root@k8s-master01 configmap-test]# cat Chart.yaml 
apiVersion: v2 # chart的
name: configmap-test # chart名称
description: A Helm chart for Kubernetes # 描述信息
type: application
version: 0.1.0 # chart的版本
appVersion: "1.16.0" # chart内应用的版本

Helm的高阶使用

模板参考

Helm 内置变量

Release.Name: 实例的名称,helm install指定的名字
Release.Namespace: 应用实例的命名空间
Release.Revision: 此次修订的版本号,从1开始,每次升级回滚都会增加1
Release.IsInstall:如果当前对实例的操作是安装,则变量 为true
Release.IsUpgrade:如果对实例是更新或者回滚这个值为true
Chart.Name: 引用Chart.yaml文件中的字段

Helm 常用函数

函数用法文档

流程控制

if/else

{{- if not .Values.autoscaling.enabled }} # 如果不为true ,执行下面语句
  replicas: {{ .Values.replicaCount }}
  {{- end }}

with

# with相当于切换到某层级
image.address.with: {{ .Values.imageDefine.define.repository }}: {{ .Values.imageDefine.define.tag }}

# with写法
{{- with .Values.imageDefine.define }} 
image.address.with: {{ .repository }}: {{ . tag }}
{{- end }}

range 循环

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐