Helm3

自建helm仓库

使用 chartmuseum
下载地址

启动命令

1
nohup /usr/local/bin/chartmuseum --debug --port=38080 --storage="local" --storage-local-rootdir="./chartstorage" > run.log &
1
2
3
4
5
6
[root@lqz-test-demo chartmuseum]/usr/local/bin/chartmuseum --debug --port=38080 --storage="local" --storage-local-rootdir="./chartstorage"
2024-12-29T11:19:10.511+0800 DEBUG Fetching chart list from storage {"repo": ""}
2024-12-29T11:19:10.511+0800 DEBUG No change detected between cache and storage {"repo": ""}
2024-12-29T11:19:10.511+0800 INFO Starting ChartMuseum {"host": "0.0.0.0", "port": 38080}
2024-12-29T11:19:10.511+0800 DEBUG Starting internal event listener

使用heml

创建编写一个chart

1
2
3
4
5
helm create mychart

cd mychart/templates

rm -rf *

configmap.yaml

1
2
3
4
5
6
7
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "hello world"

创建 chart 实例

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
[root@master test]# helm install myconfigmap ./mychart/
NAME: myconfigmap
LAST DEPLOYED: Sun Dec 29 11:48:30 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
[root@master test]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
myconfigmap default 1 2024-12-29 11:48:30.353060273 +0800 CST deployed mychart-0.1.0 1.16.0
[root@master test]#

[root@master test]# helm get manifest myconfigmap
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "hello world"

[root@master test]#

[root@master test]# kubectl get configmap
NAME DATA AGE
k-v-config 2 4d15h
kube-root-ca.crt 1 49d
my-configs 2 4d15h
my-fill-config 1 4d15h
mychart-configmap 1 18m
[root@master test]#

删除 chart 实例

1
2
helm uninstall myconfigmap

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@master test]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
myconfigmap default 1 2024-12-29 11:48:30.353060273 +0800 CST deployed mychart-0.1.0 1.16.0
[root@master test]# helm uninstall myconfigmap
release "myconfigmap" uninstalled
[root@master test]# kubectl get configmap
NAME DATA AGE
k-v-config 2 4d15h
kube-root-ca.crt 1 49d
my-configs 2 4d15h
my-fill-config 1 4d15h
[root@master test]#

修改配置文件中引入变量

configmap.yaml

1
2
3
4
5
6
7
apiVersion: v1
kind: ConfigMap
metadata:
name: { { .Release.Name } }-configmap
data:
myvalue: { { .Values.MY_VALUE } }

重写 mychart/values.yaml 内容

1
MY_VALUE: "HELLO WORLD"
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
[root@master test]# cat mychart/values.yaml 

MY_VALUE: "HELLO WORLD"
[root@master test]# helm install myconfigmap2 ./mychart/
NAME: myconfigmap2
LAST DEPLOYED: Sun Dec 29 12:18:53 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
[root@master test]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
myconfigmap2 default 1 2024-12-29 12:18:53.384988807 +0800 CST deployed mychart-0.1.0 1.16.0
[root@master test]# kubectl get configmap
NAME DATA AGE
k-v-config 2 4d15h
kube-root-ca.crt 1 49d
my-configs 2 4d15h
my-fill-config 1 4d15h
myconfigmap2-configmap 1 9s
[root@master test]#
[root@master test]# kubectl describe configmap myconfigmap2-configmap
Name: myconfigmap2-configmap
Namespace: default
Labels: app.kubernetes.io/managed-by=Helm
Annotations: meta.helm.sh/release-name: myconfigmap2
meta.helm.sh/release-namespace: default

Data
====
myvalue:
----
HELLO WORLD

BinaryData
====

Events: <none>
[root@master test]#

删除 configmap2

1
2
helm uninstall myconfigmap2

测试模板是否正确, 不真正的运行

1
helm install myconfigmap2 ./mychart/  --debug --dry-run
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
[root@master test]# helm install myconfigmap2 ./mychart/  --debug --dry-run
install.go:214: [debug] Original chart version: ""
install.go:231: [debug] CHART PATH: /data/app/k8s/helm/test/mychart

NAME: myconfigmap2
LAST DEPLOYED: Sun Dec 29 12:22:20 2024
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}

COMPUTED VALUES:
MY_VALUE: HELLO WORLD

HOOKS:
MANIFEST:
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: myconfigmap2-configmap
data:
myvalue: HELLO WORLD

[root@master test]#

helm 通过各种类型chart包安装一个release实例名来部署k8s相关的资源

从加入到本地的chart官方仓库 安装release实例

将chart仓库拉下来的压缩包进行安装release实例

将从chart仓库蜡下来的压缩包解压后 从解压目录安装release实例

从一个网络地址仓库压缩包直接安装release实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 从加入到本地的chart官方仓库 安装release实例
helm install db stable/mysql

# 从加入到本地的chart社区仓库 安装release实例
helm install my-tomcat test-repo/tomcat

# 从chart仓库蜡袭来的压缩包解压后 使用压缩包安装
helm install db mysql-1.69.tgz

# 从chart仓库蜡袭来的压缩包解压后 从解压目录安装
helm install db mysql

# 从一个网络地址仓库压缩包之际安装 , db 为release实例名
helm install db http://url.../mysql-1.69.tgz

卸载release

1
helm uninstall release实例名

helm3 内置对象

  • Release 对象

  • Values 对象

  • Chart 对象

  • Capabilities 对象

  • Template 对象

Release对象

Helm 3中的内置对象Release描述了Helm版本发布本身的信息,它包含了以下属性:

  • Release.Name:版本发布的名称
  • Release.Namespace:版本发布的命名空间(如果manifest没有覆盖的话)
  • Release.IsUpgrade:如果当前操作是升级或回滚,则该值被设置为true
  • Release.IsInstall:如果当前操作是安装,则该值被设置为true
  • Release.Revision:此次修订的版本号。安装时是1,每次升级或回滚都会自增
  • Release.Service:渲染当前模板的服务名称,在Helm中始终是Helm

Values对象

在Helm 3中,Values对象是用来描述values.yaml文件中的内容的,它允许用户访问在该文件中定义的任何变量值。Values对象的内容可以来自以下几个来源

  • chart中的values.yaml文件:这是默认的配置文件,包含了chart的默认配置值
  • 子chart的values.yaml文件:如果当前chart是一个子chart,那么它也会从父chart的values.yaml文件中继承配置
  • 通过-f或–values指定的值文件:用户可以在执行helm install或helm upgrade时通过-f或–values参数指定额外的values.yaml文件来覆盖默认值
  • 通过–set选项传入的值:用户可以在执行helm install或helm upgrade时通过–set选项直接传入键值对来覆盖默认值

Values对象的使用方式如下:

对于简单的键值对,可以直接通过.Values.key来访问 。
对于嵌套的键值对,可以通过点.来访问嵌套的值,例如.Values.info.name2来访问info对象下的name2字段
Values对象使得用户可以灵活地自定义和覆盖chart中的配置,以适应不同的部署需求。

Chart 对象

它包含了当前正在渲染的 chart 的信息。这个对象提供了一些有用的字段,可以帮助你在模板中引用 chart 的属性。以下是 Chart
对象的一些常用属性:

  • Chart.Name:chart 的名称。
  • Chart.Home:chart 的主页链接。
  • Chart.Version:chart 的版本号。
  • Chart.AppVersion:chart 应用的版本号,通常用于表示应用的版本,而不是 chart 本身的版本。
  • Chart.Description:chart 的描述。
  • Chart.Keywords:chart 的关键字列表。
  • Chart.Sources:chart 源代码的链接列表。
  • Chart.Icon:chart 的图标链接。

这些属性可以在 Helm 的模板文件中被引用,以便在 Kubernetes 清单文件中动态地插入 chart 的信息。例如,
你可以在 Kubernetes 的 Pod 定义中使用 Chart.Name 作为环境变量,或者在服务的注解中使用 Chart.Version。

Capabilities对象

它提供了关于 Kubernetes 集群支持的功能信息。以下是 Capabilities 对象的一些常用属性和描述:

  • Capabilities.APIVersions:返回 Kubernetes 集群支持的 API 版本信息集合。
  • Capabilities.APIVersion.Has $version:用于检测指定的版本或资源在 Kubernetes 集群中是否可用。
  • Capabilities.KubeVersion:提供了查找 Kubernetes 版本的方法。可以获取到
    Major,Minor,GitVersion,GitCommit,GitTreeState,BuildDate,GoVersion,Compiler 和 Platform。
  • Capabilities.KubeVersion.Version:获取 Kubernetes 的版本号。
  • Capabilities.KubeVersion.Major:获取 Kubernetes 主版本号。
  • Capabilities.KubeVersion.Minor:获取 Kubernetes 小版本号。

Template 对象

它提供了关于当前正在执行的模板的信息。以下是 Template 对象的一些属性和功能:

  • Template.Name:表示当前模板的名称。这个名称对应于模板文件的路径,例如 mychart/templates/mytemplate.yaml 中的 mytemplate。
  • Template.BasePath:表示模板文件的基路径。这通常是 mychart/templates,其中 mychart 是 chart 的名称

演示样例

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: ConfigMap
metadata:
name: { { .Release.Name } }
namespace: { { .Release.Namespace } }
data:
value1: { { .Release.IsUpgrade } }
value2: { { .Release.IsInstall } }
value3: { { .Release.Revision } }
value4: { { .Release.Service } }

helm 常用命令

命令 说明 参数
helm search 搜索 Helm charts --version: 指定版本搜索
--keyword: 指定关键字搜索
--limit: 限制搜索结果的数量
--repo: 指定特定的 Helm 仓库
helm pull 从仓库中拉取一个 chart 包 --repo: 指定 chart 所在的仓库
--version: 指定 chart 的版本
--untar: 拉取后解压到当前目录
--untardir: 指定解压目录
helm install 安装一个新的 Helm release --namespace: 指定安装的命名空间
--values: 指定自定义的 values 文件
--set: 覆盖 values 文件中的值
--version: 指定 chart 的版本
--wait: 安装后等待所有 Pods 就绪
--timeout: 设置等待的超时时间
helm list 列出已安装的 Helm releases --all-namespaces: 列出所有命名空间的 releases
--namespace: 指定命名空间
--filter: 通过模式过滤 releases
helm upgrade 升级一个已存在的 Helm release --namespace: 指定安装的命名空间
--values: 指定自定义的 values 文件
--set: 覆盖 values 文件中的值
--install: 如果 release 不存在,则执行安装操作
--wait: 升级后等待所有 Pods 就绪
--timeout: 设置等待的超时时间
helm rollback 回滚到之前的 release 版本 --wait: 回滚后等待所有 Pods 就绪
--timeout: 设置等待的超时时间
helm uninstall 卸载一个 Helm release --namespace: 指定命名空间
helm get 获取 release 的信息 helm get all [RELEASE_NAME]: 获取指定 release 的所有信息
helm get values [RELEASE_NAME]: 获取指定 release 的 values
--all-namespaces: 获取所有命名空间的 releases 信息
helm repo 管理 Helm 仓库 helm repo add: 添加一个新的 Helm 仓库
helm repo list: 列出已添加的 Helm 仓库
helm repo remove: 移除一个 Helm 仓库
helm repo update: 更新仓库的缓存

添加chart仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@master test]# helm repo add myrepo http://192.168.16.110:38080
"myrepo" has been added to your repositories

[root@master test]# helm repo list
NAME URL
myrepo http://192.168.16.110:38080

[root@master test]# helm package mychart
Successfully packaged chart and saved it to: /data/app/k8s/helm/test/mychart-0.1.0.tg

[root@master test]# curl -F "chart=@./myrepo/mychart-0.1.0.tgz" http://192.168.16.110:38080/api/charts
{"saved":true}

[root@master test]# helm repo update myrepo
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "myrepo" chart repository
Update Complete. ⎈Happy Helming!⎈

[root@master test]# helm search repo myrepo
NAME CHART VERSION APP VERSION DESCRIPTION
myrepo/mychart 0.1.0 1.16.0 A Helm chart for Kubernetes

从仓库拉去chart包

1
helm pull myrepo/mychart --version 0.1.0  --untar