文档地址:https://helm.sh/zh/docs/topics/charts/
通过下面命令创建一个chart,指定chart名:mychart
[root@Kubernetes charts]# helm create mychart
Creating mychart
[root@Kubernetes charts]# tree mychart
mychart
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
3 directories, 10 files
目录 | 介绍 |
---|---|
charts | 存放子chart的目录,目录里存放这个chart依赖的所有子chart |
Chart.yaml | 保存chart的基本信息,包括名字、描述信息及版本等,这个变量文件都可以被template目录下文件所引用 |
templates | 模板文件目录,目录里面存放所有yaml模板文件,包含了所有部署应用的yaml文件 |
templates/deployment.yaml | 创建deployment对象的模板文件 |
templates/_helpers.tpl_ | 放置模板助手的文件,可以在整个chart中重复使用,是放一些templates目录下这些yaml都有可能会用的一些模板 |
templates/hpa.yaml | |
templates/ingress.yaml | |
templates/NOTES.txt | 存放提示信息的文件,介绍chart帮助信息,helm install部署后展示给用户,如何使用chart等,是部署chart后给用户的提示信息 |
templates/serviceaccount.yaml | |
templates/service.yaml | |
templates/tests | 用于测试的文件,测试完部署完chart后,如web,做一个连接,看看是否部署成功 |
templates/tests/test-connection.yaml | 用于渲染模板的文件(变量文件,定义变量的值)定义templates目录下的yaml文件可能引用到的变量 |
values.yaml | values.yaml用于存储templates目录中模板文件中用到变量的值,这些变量定义都是为了让templates目录下yaml引用 |
编写一个chart,不引用内置对象的变量值(用HELM3发布创建一个ConfigMap,创建到K8s集群中,发布其他应用也一样,我们由浅入深进行学习)
编写Chart:
[root@Kubernetes charts]# helm create myConfigMapChart
Creating myConfigMapChart
[root@Kubernetes charts]# cd myConfigMapChart/templates/
[root@Kubernetes templates]# rm -rf ./*
[root@Kubernetes templates]# vim configmap.yaml
# 文件内容如下
apiVersion: v1
kind: ConfigMap
metadata:
name: my-cm-chart
data:
myValue: "Hello,World"
创建release实例:
[root@Kubernetes charts]# ls
mychart myConfigMapChart
[root@Kubernetes charts]# helm install mycm ./myConfigMapChart/
NAME: mycm
LAST DEPLOYED: Thu May 11 00:26:16 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
查看release实例:
[root@Kubernetes charts]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
mycm default 1 2023-05-11 00:26:16.392817959 +0800 CST deployed myConfigMapChart-0.1.0 1.16.0
查看release的详细信息:
[root@Kubernetes charts]# helm get manifest mycm
---
# Source: myConfigMapChart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: my-cm-chart
data:
myValue: "Hello,World"
删除release实例:
[root@Kubernetes charts]# helm uninstall mycm
release "mycm" uninstalled
[root@Kubernetes charts]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
案例1只是简单的创建一个configmap实际和直接apply没啥区别,案例2将引入变量进行创建chart,把configmap的名称改为变量的方式进行创建。
修改Chart:
[root@Kubernetes charts]# vim myConfigMapChart/templates/configmap.yaml
[root@Kubernetes charts]# cat myConfigMapChart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
# name: my-cm-chart
name: {{ .Release.Name }}-configmap
data:
# myValue: "Hello,World"
myValue: {{ .Values.MY_VALUE }}
[root@Kubernetes charts]# > myConfigMapChart/values.yaml
[root@Kubernetes charts]# vim myConfigMapChart/values.yaml
[root@Kubernetes charts]# cat !$
cat myConfigMapChart/values.yaml
MY_VALUE: "Hello,World"
创建实例:
[root@Kubernetes charts]# helm install mycm2 ./myConfigMapChart/
NAME: mycm2
LAST DEPLOYED: Thu May 11 00:49:06 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
查看实例:
[root@Kubernetes charts]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
mycm2 default 1 2023-05-11 00:49:06.855993522 +0800 CST deployed myConfigMapChart-0.1.0 1.16.0
[root@Kubernetes charts]# kubectl get cm
NAME DATA AGE
kube-root-ca.crt 1 77d
mycm2-configmap 1 87s
YAML解释:
apiVersion: v1
kind: ConfigMap
metadata:
# name: my-cm-chart
name: {{ .Release.Name }}-configmap
data:
# myValue: "Hello,World"
myValue: {{ .Values.MY_VALUE }}
引用内置对象或其他变量的好处:
如果metadata.name中色湖之的值就是一个固定值,这样的模板是无法在k8s中多次部署的,所以我们可以试着在每次安装chart时,都自动metadata.name的设置为release的名称,因为每次部署release的时候实例名称是不一样的,这样部署的时候里面的资源名也就可以作为一个分区,而可以进行重复部署。
HELM提供了一个用来渲染模板的命令,该命令可以将模板内容渲染出来,但是不会进行任何安装的操作。可以用该命令来测试模板渲染的内容是否正确。语法如下:
helm install [release实例名] chart目录 --debug --dry-run
例:
[root@Kubernetes charts]# helm install mycm3 ./myConfigMapChart/ --debug --dry-run
install.go:200: [debug] Original chart version: ""
install.go:217: [debug] CHART PATH: /root/charts/myConfigMapChart
NAME: mycm3
LAST DEPLOYED: Thu May 11 01:03:15 2023
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
MY_VALUE: Hello,World
HOOKS:
MANIFEST:
---
# Source: myConfigMapChart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
# name: my-cm-chart
name: mycm3-configmap
data:
# myValue: "Hello,World"
myValue: Hello,World
[root@Kubernetes charts]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
]]>传统服务部署到K8s集群的流程:
拉取代码-----》打包编译-----》构建镜像-----》准备相关的yaml文件-----》kubectl apply进行部署
传统方式部署引发的问题:
Helm是K8s的包管理工具,可以方便地发现、共享和构建K8s应用
Helm是k8s的包管理器,相当于centos系统中的yum工具,可以将一个服务相关的所有资源信息整合到一个chart中,并且可以使用一套资源发布到多个环境中,可以将应用程序的所有资源和部署信息组合到单个部署包中。
就像Linux下的rpm包管理器,如yum/apt等,可以很方便的将之前打包好的yaml文件部署到k8s上。
helm3中必须指定release名称,如果需要生成一个随机名称,需要加选项--generate-name,helm2中如果不指定release名称,可以自动生成一个随机名称
helm install ./mychart --generate-name
相关连接:
Github:https://github.com/helm/helm/releases
官网:https://helm.sh/zh/docs/intro/install/
下载好对应的版本上传到服务器进行解压缩
[root@Kubernetes helm]# ls
helm-v3.11.3-linux-amd64.tar.gz
[root@Kubernetes helm]# tar xvf helm-v3.11.3-linux-amd64.tar.gz
linux-amd64/
linux-amd64/LICENSE
linux-amd64/README.md
linux-amd64/helm
之后配置一下系统环境,让命令可以在系统中随机调用
[root@Kubernetes helm]# ls
helm-v3.11.3-linux-amd64.tar.gz linux-amd64
[root@Kubernetes helm]# cd linux-amd64/
[root@Kubernetes linux-amd64]# pwd
/opt/helm/linux-amd64
[root@Kubernetes linux-amd64]# vim /etc/profile
#追加下面内容
export PATH=$PATH:/opt/helm/linux-amd64
[root@Kubernetes linux-amd64]# source /etc/profile
检查一下是否安装成功
[root@Kubernetes ~]# helm version
version.BuildInfo{Version:"v3.11.3", GitCommit:"323249351482b3bbfc9f5004f65d400aa70f9ae7", GitTreeState:"clean", GoVersion:"go1.20.3"}
]]>