Helm主要由Helm客户端、Tiller服务器和Charts仓库(repository)组成


- Helm从指定的目录或者tgz文件中解析出Chart结构信息
- Helm将指定的Chart结构和Values信息通过gRPC传递给Tiller
- Tiller根据Chart和Values生成一个Release
- Tiller将Release发送给Kubernetes用于生成Release
- Helm从指定的目录或者tgz文件中解析出Chart结构信息
- Helm将要更新的Release的名称和Chart结构,Values信息传递给Tiller
- Tiller生成Release并更新指定名称的Release的History
- Tiller将Release发送给Kubernetes用于更新Release
- Helm将要回滚的Release的名称传递给Tiller
- Tiller根据Release的名称查找History
- Tiller从History中获取上一个Release
- Tiller将上一个Release发送给Kubernetes用于替换当前Release
官方参考文档:
https://helm.sh/docs/intro/quickstart/
wget https://get.helm.sh/helm-v3.0.2-linux-amd64.tar.gz
tar -xvf helm-v3.0.2-linux-amd64.tar.gz

cp linux-amd64/helm /usr/local/bin/
source <(helm completion bash)
root@k8s-master:~/heml# helm version

若遇到Unable to get an update from the “stable” chart repository (https://kubernetes-charts.storage.googleapis.com) 错误
手动更换stable 存储库为阿里云的存储库
helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo update
helm search repo stable

helm version
`#helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts`
`#helm repo add --username admin --password password myharbor https://harbor.qing.cn/chartrepo/charts`
`#helm repo update`
`#helm list`
`#helm search hub redis`
`#helm search repo redis`
`#helm show chart stable/redis`

`#helm fetch redis`
`#helm install redis stable/redis`
`#helm status redis`
`#helm uninstall redis`
创建charts
`#helm create helm_charts`
检查chart语法正确性
`# helm lint myapp`
打包自定义的chart
`# helm package myapp`
查看生成的yaml文件
`#helm template myapp-1.tgz`
#使用默认chart部署到k8s
`helm install myapp myapp-1.tgz`
#使用包去做release部署
`helm install --name example2 helm-chart-0.1.0.tgz --set service.type=NodePort`
查看当前chart信息
`#helm list`
更新images
`#helm upgrade myapp myapp-2.tgz`
查看版本信息
`#helm history myapp`
回滚指定版本
`#helm rollback myapp 1`
一个Charts就是按特定格式组织的目录结构,目录名即为Charts名,目录名称本身不包含版本信息。目录结构中除了charts/和templates/是目录之外,其他的都是文件。它们的基本功用如下。
1. Chart.yaml:当前Charts的描述信息,yaml格式的文件。
2. LICENSE:当前Charts的许可证信息,纯文本文件;此为可选文件。
3. README.md:易读格式的README文件;可选。
4. requirements.yaml:当前Charts的依赖关系描述文件;可选。
5. values.yaml:当前Charts用到的默认配置值。
6. charts/:目录,存放当前Charts依赖到的所有Charts文件。
7. templates/:目录,存放当前Charts用到的模板文件,可应用于Charts生成有效的Kuber-netes清单文件。
8. templates/NOTES.txt:纯文本文件,Templates简单使用注解
● 尽管Charts和Templates目录均为可选,但至少应该存在一个Charts依赖文件或一个模板文件。另外,Helm保留使用charts/和templates/目录以及上面列出的文件名称,其他文件都将被忽略。
Chart.yaml用于提供Charts相关的各种元数据,如名称、版本、关键词、维护者信息、使用的模板引擎等,它是一个Charts必备的核心文件,主要包含以下字段
1. name:当前Charts的名称,必选字段。
2. version:遵循语义化版本规范第2版的版本号,必选字段。
3. description:当前项目的单语句描述信息,可选字段。
4. keywords:当前项目的关键词列表,可选字段。
5. home:当前项目的主页URL,可选字段。
6. sources:当前项目用到的源码的来源URL列表,可选字段。
7. maintainers:项目维护者信息,主要嵌套name、email和URL几个属性组成;可选字段。
8. engine:模板引擎的名称,默认为gotpl,即go模板。
9. icon:URL,指向当前项目的图标,SVG或PNG格式的图片;可选字段。
10. appVersion:本项目用到的应用程序的版本号,可选字段,且不必为语义化版本。
11. tillerVersion:当前Charts依赖的Tiller版本号,可以是语义化版本号的范围,如“>2.4.0”;可选字段。
Helm中的一个Charts可能会依赖不止一个其他的Charts,这种依赖关系可经requirements.yaml进行动态链接,也可直接存储于charts/目录中进行手动管理。
1. requirements.yaml文件
requirements.yaml文件本质上只是一个简单的依赖关系列表,可用字段具体如下。
2. name:被依赖的Charts的名称。
3. version:被依赖的Charts的版本。
4. repository:被依赖的Charts所属的仓库及其URL;如果是非官方的仓库,则需要先用helm
repo add命令将其添加进本地可用仓库。
5. alias:为被依赖的Charts创建一个别名,从而让当前Charts可以将所依赖的Charts对应到新名称,即别名;可选字段。
6. tags:默认情况下所有的Charts都会被装载,若给定了tags,则仅装载那些匹配到的Charts。
7. condition:类似于tags字段,但需要通过自定义的条件来指明要装载的charts。
8. import-values:导入子Charts中的的值;被导入的值需要在子charts中导出。
9. Charts目录
● 若需要对依赖关系进行更多的控制,则所有被依赖到的Charts都能以手工方式直接复制到Charts目录中。一个被依赖到的Charts既可以是归档格式,也可以是展开的目录格式,不过,其名称不能以下划线(_)或点号(.)开头,此类文件会被Charts装载器自动忽略。
例如,Wordpress Charts依赖关系在其Charts目录中的反映类似如下所示:

执行命令helm create myapp,会创建一个myapp目录
`# helm create myapp`
查看myapp目录结构
root@k8s-master:~/heml# tree myapp/

root@k8s-master:~/heml/myapp# ls
charts Chart.yaml templates values.yaml
root@k8s-master:~/heml/myapp# vim Chart.yaml


检查chart语法正确性
`# helm lint myapp`
打包自定义的chart
`# helm package myapp`
安装chart
`# helm install myapp myapp-1.tgz`
验证
root@k8s-master:~/heml# kubectl get pod



检查chart语法正确性
`# helm lint myapp`
打包自定义的chart
`# helm package myapp`
更新chart
`# helm upgrade myapp myapp-2.tgz`
验证
root@k8s-master:~/heml# kubectl get svc


root@k8s-master:~/heml# helm list

root@k8s-master:~/heml# helm history myapp

oot@k8s-master:~/heml# helm rollback myapp 1

root@k8s-master:~/heml# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 28d
myapp ClusterIP 10.103.95.175 <none> 80/TCP 10m
root@k8s-master:~/heml# curl 10.103.95.175
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
hell
oot@k8s-master:~/heml# helm rollback myapp 1
[外链图片转存中...(img-NP4XSauU-1660638458806)]
###### 验证
```shell
root@k8s-master:~/heml# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 28d
myapp ClusterIP 10.103.95.175 80/TCP 10m
root@k8s-master:~/heml# curl 10.103.95.175
Hello MyApp | Version: v1 | Pod Name
