BoyChai's Blog - 包管理工具 https://blog.boychai.xyz/index.php/tag/%E5%8C%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7/ HELM-Kubernetes包管理工具(Chart包简单使用) https://blog.boychai.xyz/index.php/archives/57/ 2023-05-29T04:34:00+00:00 目录结构文档地址: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依赖的所有子chartChart.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.yamlvalues.yaml用于存储templates目录中模板文件中用到变量的值,这些变量定义都是为了让templates目录下yaml引用案例1需求编写一个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案例2需求案例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 87sYAML解释:apiVersion: v1 kind: ConfigMap metadata: # name: my-cm-chart name: {{ .Release.Name }}-configmap data: # myValue: "Hello,World" myValue: {{ .Values.MY_VALUE }}{{ .Release.Name }}-configmap 最前面的.从作用域最顶层命名空间开始,即:在顶层命名空间中开始寻找Release对象,再查找Name对象。这个就是通过内置对象获取内置对象的变量值(Release的名称)作为拼接成ConfigMap的名字。{{ .Values.MY_VALUE }} 这个是其他变量会去values.yaml文件中寻找对应的变量引用内置对象或其他变量的好处:如果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 HELM-Kubernetes包管理工具(介绍与安装) https://blog.boychai.xyz/index.php/archives/56/ 2023-05-13T01:27:00+00:00 传统部署方式传统服务部署到K8s集群的流程:拉取代码-----》打包编译-----》构建镜像-----》准备相关的yaml文件-----》kubectl apply进行部署传统方式部署引发的问题:随着引用的增多,需要维护大量的yaml文件不能根据一套yaml文件来创建多个环境,需要手动进行修改。PS: 一般环境都分为dev、预生产、生产环境,部署完了dev这套环境,后面再部署预生产和生产环境,还需要复制出两套,并手动修改才行。什么是HELMHelm是K8s的包管理工具,可以方便地发现、共享和构建K8s应用Helm是k8s的包管理器,相当于centos系统中的yum工具,可以将一个服务相关的所有资源信息整合到一个chart中,并且可以使用一套资源发布到多个环境中,可以将应用程序的所有资源和部署信息组合到单个部署包中。就像Linux下的rpm包管理器,如yum/apt等,可以很方便的将之前打包好的yaml文件部署到k8s上。HELM的组件Chart:就是helm的一个整合后的chart包,包含一个应用所有的K8s声明模板,类似于yum的rpm包或者apt的dpkg文件。helm将打包的应用程序部署到k8s并将它们构成chart。这些chart将所有预配置的应用程序资源以及所有版本都包含再一个已于管理的包中。HELM客户端:helm的客户端组件,负责和K8s apiserver通信Repository:用于发布和存储chart包的仓库,类似yum仓库和docker仓库。Release:用chart包部署的一个实例。通过chart在K8s中部署的应用都会产生一个唯一的Release,统一chart部署多次就会产生多个Release。HELM2和HELM3helm3移除了Tiller组件 helm2中helm客户端和K8s通信时通过Tiller组件和K8s通信,helm3移除了Tiller组件,直接使用kubeconfig文件和K8s apiserver通信。删除release命令变更 helm delete release-name --purge --------》 helm uninstall release-name查看charts信息命令变更 helm inspect release-name -------》 helm show chart-name拉取charts包命令变更 helm fetch chart-name -------》 helm pull chart-namehelm3中必须指定release名称,如果需要生成一个随机名称,需要加选项--generate-name,helm2中如果不指定release名称,可以自动生成一个随机名称 helm install ./mychart --generate-name安装HELM相关连接: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"}