K8s包管理工具helm
使用chart来帮助您管理Kubernetes的应用,即使是最复杂的应用程序,helm都可以定义,安装和升级。
什么是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的下载位置信息
- 使用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
- 创建并打包一个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
- 生成库的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
- 将生成的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
- 添加私有仓库
[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
- 搜索测试私有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的基础命令使用
基础使用
- 添加仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
- 查看仓库
[root@k8s-master01 configmap-test]# helm repo list
NAME URL
bitnami https://charts.bitnami.com/bitnami
- 搜索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...
- 拉取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
- 修改配置文件(测试使用、非标准操作)
修改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
- 创建名称空间
kubectl create ns helm-zookeeper
- 通过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 # 主节点
- 回滚版本
- 查看发布历史 :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
- 卸载
helm uninstall zookeeper-chart -n helm-zookeeper
zhangzk@k8smaster:~/helm/zookeeper$ helm uninstall zookeeper-chart -n helm-zookeeper
release "zookeeper-chart" uninstalled
其他命令
- 打包chart
helm package <chart-directory> # 该命令将chart打包成一个chart版本包文件。
# 如果给定路径,就会在该路径中查找chart(必须包含Chart.yaml文件)然后将目录打包。
chart版本包会用于Helm包仓库。
- 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
- 检查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 循环
更多推荐
所有评论(0)