helm3实战教程 | 编写一个chart和helm3内置对象详解

视频来源:B站《k8s(Kubernetes)集群编排工具helm3实战教程》

一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:k8s集群编排工具helm3实战教程 | 汇总_热爱编程的通信人的博客-CSDN博客


1 helm3编写一个chart

  1. 创建一个chart
# helm create mychart  
# tree mychart/
mychart/                           
├── charts                        
├── Chart.yaml                     
├── templates                     #chart的模板文件,根据需要自己改动或都删除掉后,编写自己需要的模板yaml文件即可 
│   ├── deployment.yaml            
│   ├── _helpers.tpl               
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt                  
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests                     
│       └── test-connection.yaml   
└── values.yaml
  1. 编写一个chart, 不引用内置对象的变量值(用helm3发布创建一个configmap, 创建的k8s集群中, 发布其他应用也一样, 我们由浅入深进行学习)
# kubectl get node
NAME     STATUS    ROLES                   AGE   VERSION 
m1       Ready     control-plane,master    252d  v1.20.4
m2       Ready     control-plane,master    252d  v1.20.4
m3       Ready     control-plane,master    252d  v1.20.4
n1       Ready     <none>                  251d  v1.20.4

1)创建一个chart包:

# helm create mychart   #创建一个chart包, chart包名为:mychart 关于helm使用相关的命令, 后续我们单独介绍
# cd mychart/
# ls
charts Chart.yaml templates values.yaml 
# cd templates/
# ls 
deployment.yaml _helpers.tpl hpa.yaml ingress.yaml NOTES.txt serviceaccount.yaml service.yaml tests 
# rm -rf*        #全部删除
# vim configmap.yaml    #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap 
metadata:
  name: mychart-configmap 
data:
  myvalue: "hello world"
# cd ~

2)创建一个release实例:

# helm install myconfigmap ./mychart/   #使用helm安装一个release的实例, 指定release实例名:myconfigmap, 指定chart目录./mychart 
NAME: myconfigmap 
LAST DEPLOYED: Fri Nov 25 23:55:17 2022
NAMESPACE: default 
STATUS: deployed 
REVISION: 1
TEST SUITE: None

3)查看创建后的相关信息和验证是否已经在k8s集群中创建了configmap

# helm get manifest myconfigmap    #安装成功后, 用helm get manifest release名  命令可以查看已经发布到k8s中的release信息
---
# Source: mychart/templates/configmap.yaml 
apiVersion: v1
kind: ConfigMap 
metadata:
  name: mychart-configmap 
data:
  myvalue: "hello world"
# helm list | grep myconfigmap    #list列出创建的release实例名
myconfigmapdefault    1     2022-11-25 23:55:17.825536709 +0800 CST deployed  mychart-0.1.0   1.16.0
# kubectl get configmap | grep mychart-configmap    #查看使用helm发布后创建的configmap 
mychart-configmap  1   11m

4)删除release实例

使用helm uninstall release实例名 的命令来删除这个release, 删除的时候直接指定release名称即可

# helm uninstall myconfigmap   #删除release实例, 指定release的实例名:myconfigmap 、
# helm list|grep myconfigmap 
空
# kubectL get configmap | grep mychart-configmap
空
  1. 编写一个chart, 引用内置对象的变量值(用helm3发布创建一个conifgmap, 创建的k8s集群中)
# kubectl get node
NAME     STATUS    ROLES                   AGE   VERSION 
m1       Ready     control-plane,master    252d  v1.20.4
m2       Ready     control-plane,master    252d  v1.20.4
m3       Ready     control-plane,master    252d  v1.20.4
n1       Ready     <none>                  251d  v1.20.4

1)创建一个chart包:

# helm create mychart   #创建一个chart包, chart包名为:mychart 
# cd mychart/
# ls
charts Chart.yaml templates values.yaml 
# cd templates/
# ls 
deployment.yaml _helpers.tpl hpa.yaml ingress.yaml NOTES.txt serviceaccount.yaml service.yaml tests 
# rm -rf*        #全部删除
# vim configmap.yaml    #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {
   
   { .Release.Name }}-configmap  #最前面的.从作用域最顶层命名空间开始, 即:在顶层命名空间中开始查找Release对象, 再查找Name对象
data:  #上面就是通过内置对象获取内置对象的变量值(Release的名称)作为拼接成configmap的名字
  myvalue: {
   
   { .Values.MY_VALUE }}

# vim /root/mychart/values.yaml
MY_VALUE: "Hello World"
引用内置对象变量或其他变量(如values.yaml)的好处:
如果metadata.name中设置的值是一个固定值, 这样的模板是无法在k8s中多次部署的, 所以我们可以试着在每次安装chart时, 都自动metadata.name的值设置为release的名称, 因为每次部署时候release实例名是不一样的, 这样部署时候, 里面的资源名也就可以作为一个区分, 而可以进行重复部署。

2)创建一个release实例:

# helm_install myconfigmap2 ./mychart/   #使用helm安装一个release的实例, 指定release实例名:myconfigmap,指定chart目录./mychart

3)查看创建后的相关信息和验证是否已经在k8s集群中创建了configmap

# helm list | grep myconfigmap2        #list列出创建的release实例名
myconfigmap2   default   1      2022-11-26 00:38:03.139416104 +0800 CST deployed    mychart-0.1.0  1.16.0
# kubectl get configmap | grep myconfigmap2    #查看使用helm发布后创建的configmap 
myconfigmap2-configmap   1     2m40s

4)删除release实例

使用helm uninstall release实例名 的命令来删除这个release, 删除的时候直接指定release名称即可

# helm uninstall myconfigmap2    #删除release实例, 指定release的实例名:myconfigmap2
# helm list | grep myconfigmap2
空
# kubectl get configmap | grep myconfigmap2
空
  1. helm的测试渲染命令 不真正执行,只是试运行看是否能运行

helm提供了一个用来渲染模板的命令, 该命令可以将模板内容渲染出来, 但是不会进行任何安装的操作。可以用该命令来测试模板渲染的内容是否正确。

用法:helm install release实例名 chart目录 --debug --dry-run

例:#helm install myconfigmap3 ./mychart/ --debug --dry-run

  1. helm通过各种类型chart包安装一个release实例名来部署k8s相关的资源(如:pod, deployment, svc, ingress等, 根据模板文件定义)

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

2)将从chart仓库拉下来的压缩包进行安装release实例(下载好的压缩包本地离线安装release)

3)将从chart仓库拉下来的压缩包解压后, 从解压目录安装release实例(解压下载好的压缩包, 从解压目录离线安装release实例)

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

# helm install db stable/mysql                  #从加入到本地的chart官方仓库(从官方仓库安装)安装release实例, db为release实例名
# helm install my-tomcat test-repo/tomcat       #从加入到本地的chart社区仓库(从官方仓库安装)安装release实例, my-tomcat为release实例名
# helm install db mysql-1.6.9.tgz               #从chart仓库拉下来的压缩包进行安装release实例(从本地存档文件离线安装), db为release实例名
# helm install db mysql                         #从chart仓库拉下来的压缩包解压后, 从解压目录安装release实例(从解压目录离线安装), db为release实例名
# helm install db http://url.../mysql-1.6.9.tgz #从一个网络地址仓库压缩包直接安装release实例(从下载服务器安装), db为release实例名

卸载release实例:

# helm uninstall release实例名     后面详细介绍命令

2 helm3的内置对象详解

  1. helm3常用的内置对象

Release对象

Values对象

Chart对象

Capabilities对象

Template对象

  1. 各内置对象详解

1)Release对象 描述了版本发布自身的一些信息。它包含了以下对象:

对象名称                  描述
.Release.Name            release的名称
.Release.Namespace       release的命名空间
.Release.IsUpgrade       如果当前操作是升级或回滚的话, 该值为true 
.Release.IsInstall       如果当前操作是安装的话, 该值为true 
.Release.Revision        获取此次修订的版本号。初次安装时为1,每次升级或回滚都会递增
.Release.Service         获取渲染当前模板的服务名称。一般都是Helm

2)Values对象 描述的是value.yaml文件(定义变量的文件)中的内容, 默认为空。使用Value对象可以获取到value.yaml文件中已定义的任何变量数值

Value键值对                获取方式
name1: test1              .Values.name1
info:
  name2: test2            .Values.info.name2

3)Chart对象 用于获取Chart.yaml文件中的内容:

对象名称                 描述
.Chart.Name             获取Chart的名称
.Chart.Version          获取Chart的版本

4)Capabilities对象 提供了关于kubernetes集群相关的信息。该对象有如下方法:

对象名称                                                        描述
.Capabilities.APIVersions                                      返回kubernetes集群API版本信息集合
.Capabilities.APIVersions.Has $version                         用于检测指定的版本或资源在k8s集群中是否可用, 例如:apps/v1/Deployment 
.Capabilities.KubeVersion和.Capabilities.KubeVersion.Version   都用于获取kubernetes的版本号
.Capabilities.KubeVersion.Major                                获取kubernetes的主版本号
.Capabilities.KubeVersion.Minor                                获取kubernetes的小版本号

5)Template对象 用于获取当前模板的信息,它包含如下两个对象

对象名称              描述
.Template.Name       用于获取当前模板的名称和路径(例如:mychart/templates/mytemplate.yaml)
.Template.BasePath   用于获取当前模板的路径(例如:mychart/templates)
  1. 各内置对象调用的演示

1)环境准备k8s集群

# kubectl get node
NAME     STATUS    ROLES                   AGE   VERSION 
m1       Ready     control-plane,master    252d  v1.20.4
m2       Ready     control-plane,master    252d  v1.20.4
m3       Ready     control-plane,master    252d  v1.20.4
n1       Ready     <none>                  251d  v1.20.4

2)创建一个chart包(用helm3发布创建一个configmap, 创建的k8s集群中, 发布其他应用也一样)

# helm create mychart    #创建一个chart包, chart包名为:mychart 
# cd mychart/
# ls
charts Chart.yaml templates values.yaml
# cd templates/
# ls
deployment.yaml _helpers.tpl hpa.yaml ingress.yaml NOTES.txt service account.yaml service.yaml tests 
# rm -rf*     #全部删除

3)编写自己需要的yaml文件, 调用上面各自内置对象获取相关变量的值

(1)调用Release对象 描述了版本发布自身的一些信息。

# vim /root/mychart/templates/configmap.yaml    #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {
   
   { .Release.Name }}-configmap 
  namespace: {
   
   { .Release.Namespace }}
data:
  value1: "{
   
   { .Release.IsUpgrade }}"  #如果当前操作是升级或回滚的话, 该值为true 
  value2: "{
   
   { .Release.IsInstall }}"  #如果当前操作是安装的话, 该值为true 
  value3: "{
   
   { .Release.Revision }}"   #获取此次修订的版本号
  value4: "{
   
   { .Release.Service }}"    #获取当前模板的服务名
# cd ~
# helm install myconfigmap1 ./mychart/ --debug --dry-run   #不真正执行,只是试运行看是否能运行
NAME: myconfigmap1
LAST DEPLOYED: Sat Nov 26 09:53:13 2022
NAMESPACE: default
STATUS: pending-install
REVISION: 1
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap 
metadata:
  name: myconfigmap1-configmap 
  namespace: default 
data:
  value1: "false"  #如果当前操作是升级或回滚的话, 该值为true 
  value2: "true"   #如果当前操作是安装的话, 该值为true 
  value3: "1"      #获取此次修订的版本号
  value4: "Helm"   #获取当前模板的服务名

(2)调用Values对象 描述的是value.yaml文件(定义变量的文件) 中的内容

# vim /root/mychart/values.yaml    #清空里面的初始化信息,设置成我们需要的(变量名和赋值)(里面默认的信息都是初始化信息,仅供参考)
name1: test1
info:
  name2: test2
# vim /root/mychart/templates/configmap.yaml    #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap 
metadata:
  name: {
   
   { .Release.Name }}-configmap 
  namespace: {
   
   { .Release.Namespace }}
data:
  value1: "{
   
   { .Values.name1 }}"  #获取values.yaml文件中定义的变量的值
  value2: "{
   
   { .Values.info.name2 }}"  #获取values.yaml文件中定义的层级变量的值
# cd ~
# helm install myconfigmap2 ./mychart/ --debug --dry-run   #不真正执行,只是试运行看是否能运行
NAME: myconfigmap2
LAST DEPLOYED: Sat Nov 26 10:17:53 2022
NAMESPACE: default 
STATUS: pending-install 
REVISION: 1
...
# Source: mychart/templates/configmap.yaml 
apiVersion: v1
kind: ConfigMap 
metadata:
  name: myconfigmap2-configmap 
  namespace: default 
data:
  value1: "test1"   #获取values.yaml文件中定义的变量的值
  value2: "test2"   #获取values.yaml文件中定义的层级变量的值

(3)调用Chart对象 用于获取Chart.yaml文件中的内容

# cat /root/mychart/Chart.yaml | grep -vE "#|^$"    #先查看下Chart.yaml文件中内容中定义的变量
apiVersion: v2
name: mychart 
description: A Helm chart for Kubernetes 
type: application 
version: 0.1.0
appVersion: "1.16.0"
# vim /root/mychart/templates/configmap.yaml   #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap 
metadata:
  name: {
   
   { .Release.Name }}-configmap 
  namespace: {
   
   { .Release.Namespace }}
data:
  value1: "{
   
   { .Chart.Name }}"  #获取Chart的名称, 获取Chart.yaml文件中定义的变量的值
  value2: "{
   
   { .Chart.Version }}"  #获取Chart的版本, 获取Chart.yaml文件中定义的变量的值
# cd ~
# helm install myconfigmap3 ./mychart/ --debug --dry-run   #不真正执行,只是试运行看是否能运行
NAME: myconfigmap3
LAST DEPLOYED: Sat Nov 26 10:26:02 2022
NAMESPACE: default 
STATUS: pending-install 
REVISION: 1
...
# Source: mychart/templates/configmap.yaml 
apiVersion: v1
kind: ConfigMap 
metadata:
  name: myconfigmap3-configmap
  namespace: default
data:
  value1: "mychart"   #获取Chart的名称, 获取Chart.yaml文件中定义的变量的值
  value2: "0.1.0"     #获取Chart的版本, 获取Chart.yaml文件中定义的变量的值

(4)调用Capabilities对象 提供了关于kubernetes集群相关的信息。该对象有如下方法

# vim/root/mychart/templates/configmap.yaml    #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {
   
   { .Release.Name }}-configmap 
  namespace: {
   
   { .Release.Namespace }}
data:
  value1: "{
   
   { .Capabilities.APIVersions }}"     #返回kubernetes集群API版本信息集合
  value2: '{
   
   { .Capabilities.APIVersions.Has "apps/v1/Deployment" }}'  #用于检测指定的版本或资源在k8s集群中是否可用
  value3: "{
   
   { .Capabilities.KubeVersion.Version }}"  #用于获取kubernetes的版本号
  value4: "{
   
   { .Capabilities.KubeVersion.Major }}"   #获取kubernetes的主版本号
  value5: "{
   
   { .Capabilities.KubeVersion.Minor }}"   #获取kubernetes的小版本号
# cd ~
# helm install myconfigmap4 ./mychart/ --debug --dry-run   #不真正执行,只是试运行看是否能运行
NAME: myconfigmap4
LAST DEPLOYED: Sat Nov 26 10:38:52 2022
NAMESPACE: default
STATUS: pending-install
REVISION: 1
...
# Source: mychart/templates/configmap.yaml 
apiVersion: v1
kind: ConfigMap 
metadata:
  name: myconfigmap4-configmap 
  namespace: default 
data:
  value1: "[batch/v1/Job v1/ReplicationController rbac.authorization.k8s.io/v1/RoleBinding admissionregistration.k8s.io/v1/MutatingWebhookConfiguration authorization.k8s.io/v1beta1/LocalSubjectAccessReview crd.projectcalico.org/v1/IPAMHandle crd.projectcalico.org/v1/NetworkSet events.k8s.io/v1beta1/Event crd.projectcalico.org/v1/BGPConfiguration events.k8s.io/v1 v1/PodAttachOptions v1/Scale authorization.k8s.io/v1beta1/SubjectAccessReview networking.k8s.io/v1beta1/IngressClass policy/v1beta1/PodSecurityPolicy rbac.authorization.k8s.io/v1/Role autoscaling/v2beta1 coordination.k8s.io/v1 authorization.k8s.io/v1/LocalSubjectAccessReview apps/v1/ControllerRevision batch/v1/CronJob crd.projectcalico.org/v1/FelixConfiguration crd.projectcalico.org/v1/IPAMConfig v1 autoscaling/v2beta2 v1/PodProxyOptions scheduling.k8s.io/v1beta1 networking.k8s.io/v1/IngressClass rbac.authorization.k8s.io/v1beta1/RoleBinding events.k8s.io/v1/Event networking.k8s.io/v1/Ingress apiextensions.k8s.io/v1beta1 v1/PersistentVolume v1/PodExecOptions storage.k8s.io/v1/CSINode crd.projectcalico.org/v1/BlockAffinity metrics.k8s.io/v1beta1/PodMetrics v1/NodeProxyOptions authorization.k8s.io/v1/SubjectAccessReview certificates.k8s.io/v1beta1/CertificateSigningRequest storage.k8s.io/v1beta1/CSIDriver flowcontrol.apiserver.k8s.io/v1beta1 rbac.authorization.k8s.io/v1beta1/ClusterRole apiextensions.k8s.io/v1beta1/CustomResourceDefinition coordination.k8s.io/v1beta1/Lease certificates.k8s.io/v1 certificates.k8s.io/v1beta1 admissionregistration.k8s.io/v1 apiregistration.k8s.io/v1beta1 autoscaling/v1 v1/TokenRequest apps/v1/DaemonSet certificates.k8s.io/v1/CertificateSigningRequest extensions/v1beta1/Ingress admissionregistration.k8s.io/v1/ValidatingWebhookConfiguration authentication.k8s.io/v1 node.k8s.io/v1 v1/Event rbac.authorization.k8s.io/v1beta1/ClusterRoleBinding storage.k8s.io/v1/CSIDriver discovery.k8s.io/v1/EndpointSlice extensions/v1beta1 v1/ServiceAccount apps/v1/Scale v1/ResourceQuota storage.k8s.io/v1/StorageClass discovery.k8s.io/v1beta1/EndpointSlice flowcontrol.apiserver.k8s.io/v1beta1/FlowSchema v1/PodPortForwardOptions apiregistration.k8s.io/v1beta1/APIService node.k8s.io/v1beta1/RuntimeClass authentication.k8s.io/v1beta1/TokenReview rbac.authorization.k8s.io/v1/ClusterRole coordination.k8s.io/v1/Lease admissionregistration.k8s.io/v1beta1 discovery.k8s.io/v1 discovery.k8s.io/v1beta1 v1/Eviction networking.k8s.io/v1beta1/Ingress storage.k8s.io/v1beta1/VolumeAttachment batch/v1beta1/CronJob rbac.authorization.k8s.io/v1beta1/Role crd.projectcalico.org/v1/NetworkPolicy authorization.k8s.io/v1beta1 v1/LimitRange v1/PodTemplate storage.k8s.io/v1 apps/v1/ReplicaSet autoscaling/v2beta2/HorizontalPodAutoscaler networking.k8s.io/v1/NetworkPolicy scheduling.k8s.io/v1/PriorityClass crd.projectcalico.org/v1/GlobalNetworkSet v1/Endpoints v1/Node v1/Secret apiextensions.k8s.io/v1/CustomResourceDefinition crd.projectcalico.org/v1/HostEndpoint autoscaling/v2beta1/HorizontalPodAutoscaler policy/v1/PodDisruptionBudget storage.k8s.io/v1/VolumeAttachment authorization.k8s.io/v1/SelfSubjectAccessReview node.k8s.io/v1/RuntimeClass authorization.k8s.io/v1 apiextensions.k8s.io/v1 scheduling.k8s.io/v1 apps/v1/StatefulSet autoscaling/v1/HorizontalPodAutoscaler crd.projectcalico.org/v1/IPAMBlock policy/v1 v1/ComponentStatus v1/ConfigMap rbac.authorization.k8s.io/v1/ClusterRoleBinding v1/Service apps/v1/Deployment authorization.k8s.io/v1beta1/SelfSubjectAccessReview storage.k8s.io/v1beta1/CSIStorageCapacity authentication.k8s.io/v1beta1 networking.k8s.io/v1beta1 v1/Binding rbac.authorization.k8s.io/v1 v1/PersistentVolumeClaim v1/Pod metrics.k8s.io/v1beta1/NodeMetrics apiregistration.k8s.io/v1 batch/v1beta1 policy/v1beta1 apiregistration.k8s.io/v1/APIService storage.k8s.io/v1beta1/CSINode flowcontrol.apiserver.k8s.io/v1beta1/PriorityLevelConfiguration rbac.authorization.k8s.io/v1beta1 storage.k8s.io/v1beta1 coordination.k8s.io/v1beta1 policy/v1beta1/PodDisruptionBudget storage.k8s.io/v1beta1/StorageClass admissionregistration.k8s.io/v1beta1/MutatingWebhookConfiguration scheduling.k8s.io/v1beta1/PriorityClass crd.projectcalico.org/v1/GlobalNetworkPolicy apps/v1 batch/v1 networking.k8s.io/v1 authentication.k8s.io/v1/TokenReview authorization.k8s.io/v1beta1/SelfSubjectRulesReview crd.projectcalico.org/v1/BGPPeer events.k8s.io/v1beta1 node.k8s.io/v1beta1 v1/Namespace authorization.k8s.io/v1/SelfSubjectRulesReview admissionregistration.k8s.io/v1beta1/ValidatingWebhookConfiguration crd.projectcalico.org/v1/IPPool crd.projectcalico.org/v1/ClusterInformation crd.projectcalico.org/v1/KubeControllersConfiguration crd.projectcalico.org/v1 metrics.k8s.io/v1beta1 v1/ServiceProxyOptions]"     #返回kubernetes集群API版本信息集合
  value2: 'true'  #用于检测指定的版本或资源在k8s集群中是否可用
  value3: "v1.20.4"  #用于获取kubernetes的版本号
  value4: "1"   #获取kubernetes的主版本号
  value5: "20"   #获取kubernetes的小版本号

(5)调用Template对象 用于获取当前模板的信息,它包含如下两个对象

# vim /root/mychart/templates/configmap.yaml    #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap 
metadata:
  name: {
   
   { .Release.Name }}-configmap 
  namespace: {
   
   { .Release.Namespace }}
data:
  value1: "{
   
   { .Template.Name }}"  #用于获取当前模板的名称和路径(例如:mychart/templates/configmap.yaml)
  value2: "{
   
   { .Template.BasePath }}"  #用于获取当前模板的路径(例如:mychart/templates)
# cd ~
# helm install myconfigmap5 ./mychart/ --debug --dry-run   #不真正执行,只是试运行看是否能运行
NAME: myconfigmap5
LAST DEPLOYED: Sat Nov 26 10:44:58 2022
NAMESPACE: default 
STATUS: pending-install 
REVISION: 1
# Source: mychart/templates/configmap.yaml 
apiVersion: v1
kind: ConfigMap 
metadata:
  name: myconfigmap5-configmap 
  namespace:default 
data:
  value1: "mychart/templates/configmap.yaml"  #用于获取当前模板的名称和路径(例如:mychart/templates/configmap.yaml)
  value2: "mychart/templates"    #用于获取当前模板的路径(例如:mychart/templates)

猜你喜欢

转载自blog.csdn.net/guolianggsta/article/details/131602460