视频来源:B站《k8s(Kubernetes)集群编排工具helm3实战教程》
一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持!
附上汇总贴:k8s集群编排工具helm3实战教程 | 汇总_热爱编程的通信人的博客-CSDN博客
1 helm3编写一个chart
- 创建一个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
- 编写一个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
空
- 编写一个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
空
- helm的测试渲染命令 不真正执行,只是试运行看是否能运行
helm提供了一个用来渲染模板的命令, 该命令可以将模板内容渲染出来, 但是不会进行任何安装的操作。可以用该命令来测试模板渲染的内容是否正确。
用法:helm install release实例名 chart目录 --debug --dry-run
例:#helm install myconfigmap3 ./mychart/ --debug --dry-run
- 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的内置对象详解
- helm3常用的内置对象
Release对象
Values对象
Chart对象
Capabilities对象
Template对象
- 各内置对象详解
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)环境准备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)