一、概念
Helm是 Kubernetes 的包管理工具,它允许开发者和系统管理员通过定义、打包和部署应用程序来简化 Kubernetes 应用的管理工作。Helm 的出现是为了解决在 Kubernetes 环境中部署和管理复杂应用的挑战。Helm命令行客户端工具,主要用于Kubernetes应用中的Chart的创建、打包、发布和管理。
Helm 的官方网站是Helm,在这里可以找到 Helm 的安装指南、文档、Chart 仓库和社区贡献信息。通过 Helm,用户可以更高效地管理和部署 Kubernetes 应用,实现快速迭代和持续集成。
1.Helm核心概念
•Chart:Helm 的 Chart 是一个软件包,它包含了一组定义 Kubernetes 资源的 YAML 文件。Chart 可以看作是 Kubernetes 应用的模板,它描述了如何部署一个应用,包括所需的 Deployments、Services、ConfigMaps 等资源。
•Repository:Helm 的 Repository 是一个存储 Chart 的仓库。用户可以从这些仓库中搜索、下载和安装 Chart。每个 Repository 都有一个索引文件,列出了可用的 Chart 和它们的版本。
•Release:当使用 helm install 命令部署一个 Chart 到 Kubernetes 集群时,Helm 会创建一个 Release。Release 是 Chart 在集群中的一个实例,它代表了特定版本的应用部署;一个Chart被Helm运行后将生成对应的一个Release(将在K8S中创建出真实运行的资源对象)。用户可以对同一个 Chart 创建多个 Release,每个 Release 都有自己的配置和状态。
Chart:Helm程序包,一系列用于描述K8S资源和相关文件的集合,比方说我们部署Nginx,需要Deployment的Yaml,需要Service的Yaml,这两个清单文件就是一个Helm程序包,在K8S中把这些Yaml清单文件叫做Chart图表。
Vlues.yaml文件为模板中的文件赋值,可以实现我们自定义安装
Chart---->通过Values.yaml文件赋值---->生成Release实例
总结:Helm把Kubernetes资源打包到一个Chart中,制作并完成各个Chart和Chart 本身依赖关系并利用Chart仓库实现对外分发,而Helm还可以通过Values.yaml文件完成可配置的发布,如果Chart版本更新了,Helm自动支持滚动更新机制,还可以一键回滚,但是不适合在生产环境使用,除非具有定义自制Chart的能力
2.Helm工作流程
•查找 Chart:用户可以在 Helm 的 Repository 中查找所需的 Chart。
•安装 Chart:使用 helm install 命令安装 Chart 到 Kubernetes 集群,创建一个 Release。
•管理 Release:用户可以使用 helm upgrade、helm rollback、helm uninstall 等命令来管理 Release,包括更新、回滚或卸载应用。
•维护 Repository:用户可以添加、更新和删除 Helm Repository,以管理可用的 Chart。
3.Helm 3 与 Helm 2的区别
•Helm 2:在 Helm 2 中,采用了客户端-服务器模型,其中客户端是 Helm,服务器端是 Tiller。Tiller 作为 Kubernetes 集群中的一个 Deployment 运行,负责管理 Helm 的 Release 和执行 Kubernetes 操作。
•Helm 3:Helm 3 移除了 Tiller,简化了架构。现在,Helm 客户端直接与 Kubernetes API 服务器通信,执行所有的 Kubernetes 操作。这减少了复杂性,并提高了安全性,因为不再需要在集群中运行一个具有广泛权限的 Tiller 服务。
架构变化:
• Helm服务端Tiller被删除
• Release名称可以在不同命名空间重用
• 支持将Chart推送至Docker镜像仓库中
• 使用JSONChema验证Chartvalues
Helm版本以及其对应支持的Kubernetes版本
Helm版本 | 支持的Kubernetes版本 |
3.6.x | 1.21.x - 1.18.x |
3.5.x | 1.20.x - 1.17.x |
3.4.x | 1.19.x - 1.16.x |
3.3.x | 1.18.x - 1.15.x |
3.2.x | 1.18.x - 1.15.x |
3.1.x | 1.17.x - 1.14.x |
3.0.x | 1.16.x - 1.13.x |
2.16.x | 1.16.x - 1.15.x |
二、Helm部署
包括如何安装 Helm 客户端、添加和更新 Helm 仓库、搜索和查看 Chart 信息、安装和卸载应用
1.安装Helm
1.1下载 Helm 客户端
访问 Helm 的 GitHub 标签页面 https://github.com/helm/helm/releases 来下载适合操作系统的 Helm 版本。例如,如果使用的是 Linux 系统,可以下载 helm-v3.6.0-linux-amd64.tar.gz。
1.2安装Helm
解压下载的 Helm 压缩包,并将其移动到系统的可执行路径中,例如/usr/local/bin。
tar -zxvf helm-v3.6.0-linux-amd64.tar.gz mvlinux-amd64/helm /usr/local/bin/helm
1.3验证安装
#运行 helm version 来检查 Helm 是否已成功安装。 helm version
1.4命令补全
#为了提高使用 Helm 的效率,可以启用命令补全功能 echo"source <(helm completion bash)" >> ~/.bashrc
2.使用Helm安装Chart
2.1添加Helm仓库
#添加常用的 Helm 仓库,以便可以搜索和安装各种 Chart helm repo add bitnami https://charts.bitnami.com/bitnami helm repo add stable http://mirror.azure.cn/kubernetes/charts helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts helm repo add incubator https://charts.helm.sh/incubator
2.2更新Helm仓库
#更新 Helm 仓库列表,以确保可以访问最新的 Chart 版本 helm repo update
2.3查看 Helm 仓库列表
#查看已添加的 Helm 仓库 helm repo list
2.4删除Helm仓库
#如果不再需要某个 Helm 仓库,可以将其从列表中删除 helm repo remove incubator
2.5查看Chart信息
#查看特定 Chart 的基本信息或所有信息 helm show chart stable/mysql # 查看基本信息 helm show all stable/mysql # 获取所有信息
2.6安装 Chart
#使用 helm install 命令安装 Chart。可以指定一个 release 名称,或者使用 --generate-name 让 Helm 为生成一个随机名称 helm install my-redis bitnami/redis [-n default] # 指定 release 名称 helm install bitnami/redis --generate-name # 自动生成 release 名称
2.7查看所有Release
#列出所有已安装的 Helm release helmls #helm list 来获取更详细的信息 helm list
2.8查看Release状态
#查看特定 release 的状态信息 helm status my-redis
2.9删除Release
#使用 helm uninstall 命令删除指定的 Helm release helm uninstall my-redis
三、Helm Chart 自定义模板
1.查看Chart文件细节
charts 除了可以在 repo 中下载,还可以自己自定义,创建完成后通过 helm 部署到 k8s
Helm Chart 是 Helm 用来部署 Kubernetes 应用的包。一个 Chart 包含一系列的 Kubernetes 资源定义文件(YAML 格式),以及一个描述 Chart 的 Chart.yaml 文件和一个用于配置的 values.yaml 文件。自定义 Helm Chart 允许根据具体需求来创建和部署 Kubernetes 应用。
2.拉取 Helm Chart
mkdir/opt/helm cd/opt/helm helm pull stable/mysql ls mysql-1.6.9.tgz
3.查看Chart结构
tar xf mysql-1.6.9.tgz yum install -y tree tree mysql mysql ├── Chart.yaml #包含 chart 的元数据 ├── README.md #提供关于 chart 的信息和使用说明 ├── templates #包含 chart 的模板文件 │ ├── configurationFiles-configmap.yaml #配置文件的 ConfigMap 模板 │ ├── deployment.yaml #Deployment 资源的模板 │ ├── _helpers.tpl #辅助模板文件 │ ├── initializationFiles-configmap.yaml #初始化文件的 ConfigMap 模板 │ ├── NOTES.txt #安装后的说明和注意事项 │ ├── pvc.yaml #PersistentVolumeClaim 资源的模板 │ ├── secrets.yaml #Secret 资源的模板 │ ├── serviceaccount.yaml #ServiceAccount 资源的模板 │ ├── servicemonitor.yaml #ServiceMonitor 资源的模板 │ ├── service.yaml #Service 资源的模板 │ ├── ingress.yaml #Ingress 资源的模板 │ └── tests #包含测试相关的模板文件 │ ├── test-configmap.yaml │ └── test.yaml └── values.yaml #包含 chart 的默认配置值 #通过这个结构,我们可以看到 Helm chart 是如何组织和管理 Kubernetes 应用程序的部署配置的。用户可以根据需要编辑这些文件,以自定义应用程序的行为和配置。
4.Helm Chart结构
Helm chart 的关键组成部分的详细说明
4.1Chart.yaml
• 这是 Helm chart 的自描述文件,它包含了 chart 的基本信息。
• 必须包含 name 字段,用于指定 chart 的名称。
• 必须包含 version 字段,用于指定 chart 的版本号。
• 还可以包含其他元数据,如描述、图标、维护者信息等。
4.2模板
• Helm chart 包含一个或多个模板,这些模板是 Kubernetes 资源清单文件的文本模板。
• 模板中可以包含 Go 模板 语法,用于动态生成 Kubernetes 清单文件。
• 模板会根据 values.yaml 文件中的值进行填充和处理,生成最终的 Kubernetes 资源清单。
4.3具体模板文件
• NOTES.txt:这是一个文本文件,包含安装 chart 后显示给用户的信息,通常包括配置提示、使用说明等。
• deployment.yaml:这个模板定义了一个 Kubernetes Deployment 资源,用于指定如何部署应用程序的副本。
• service.yaml:这个模板定义了一个 Kubernetes Service 资源,通常用于提供对 Deployment 的网络访问。
• ingress.yaml:这个模板定义了一个 Kubernetes Ingress 资源,用于管理外部访问到 Service 的路由。
• _helpers.tpl:这个文件包含可重用的模板助手函数,可以在 chart 的其他模板中调用。
通过这些组件,Helm charts 为 Kubernetes 应用程序的部署提供了一种标准化和自动化的方法。用户可以通过修改 values.yaml 文件和模板来定制应用程序的部署,然后使用 Helm 命令进行部署和管理。
5.创建自定义的Chart
5.1创建自定义Helm Chart
helm create nginx #创建一个新的 Helm chart,例如 nginx tree nginx nginx ├── charts ├── Chart.yaml ├── templates │ ├── deployment.yaml │ ├── _helpers.tpl │ ├── hpa.yaml │ ├── ingress.yaml │ ├── NOTES.txt │ ├── serviceaccount.yaml │ ├── service.yaml │ └── tests │ └── test-connection.yaml └── values.yaml catnginx/templates/deployment.yaml #查看 templates/deployment.yaml 文件,了解如何在模板中使用 Go 模板语法引用 values.yaml 中的变量 #在 templates 目录下 yaml 文件模板中的变量(go template语法)的值默认是在 nginx/values.yaml 中定义的,只需要修改 nginx/values.yaml 的内容,也就完成了 templates 目录下 yaml 文件的配置。 比如在 deployment.yaml 中定义的容器镜像: image:"{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" catnginx/values.yaml | grep repository repository: nginx #以上变量值是在 create chart 的时候就自动生成的默认值,你可以根据实际情况进行修改。
5.2修改Helm Chart
#修改 chart vim nginx/Chart.yaml apiVersion: v2 name: nginx #chart名字 description: A Helm chartforKubernetes type: application #chart类型,application或library version: 0.1.0 #chart版本 appVersion: 1.16.0 #application部署版本 vim nginx/values.yaml replicaCount: 1 image: repository: nginx pullPolicy: IfNotPresent tag:"latest" #设置镜像标签,加上该内容 imagePullSecrets: [] nameOverride:"" fullnameOverride:"" serviceAccount: create:true annotations: {} name:"" podAnnotations: {} podSecurityContext: {} # fsGroup: 2000 securityContext: {} # capabilities: # drop: # - ALL # readOnlyRootFilesystem: true # runAsNonRoot: true # runAsUser: 1000 service: type: ClusterIP port: 80 ingress: enabled:true #开启 ingress className:"" annotations: {} # kubernetes.io/ingress.class: nginx # kubernetes.io/tls-acme: "true" hosts: - host: www.cxk.com #指定ingress域名 paths: - path: / pathType: Prefix #指定ingress路径类型 tls: [] # - secretName: chart-example-tls # hosts: # - chart-example.local resources: limits: cpu: 100m memory: 128Mi requests: cpu: 100m memory: 128Mi autoscaling: enabled:false minReplicas: 1 maxReplicas: 100 targetCPUUtilizationPercentage: 80 # targetMemoryUtilizationPercentage: 80 nodeSelector: {} tolerations: [] affinity: {}
5.3打包和部署Helm Chart
helm lint nginx #检查依赖和模版配置是否正确 helm package nginx #打包 chart,会在当前目录下生成压缩包 nginx-0.1.0.tgz #部署 chart helm install nginx ./nginx --dry-run --debug #使用 --dry-run 参数验证 Chart 的配置,并不执行安装 helm install nginx ./nginx -n default #部署 chart,release 版本默认为 1 或者 helm install nginx ./nginx-0.1.0.tgz #可根据不同的配置来 install,默认是 values.yaml helm install nginx ./nginx -f ./nginx/values.yaml helmls kubectl get pod,svc
5.4部署Ingress-Nginx
#部署 ingress wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml #下载 Ingress-Nginx 的配置文件 mandatory.yaml 和 service-nodeport.yaml kubectl apply -f mandatory.yaml kubectl apply -f service-nodeport.yaml #使用 kubectl apply 命令应用这些配置文件,以部署 Ingress 控制器和 NodePort 类型的 Service kubectl get pod,svc -n ingress-nginx kubectl get ingress vim /etc/hosts ..... 192.168.241.23 node02 www.cxk.com curl http://www.cxk.com:32733
5.5升级Helm Chart
#修改为 NodePort 访问后,升级 vim nginx/values.yaml service: type: NodePort #修改 values.yaml 文件以更改 Service 类型为 NodePort 并设置 nodePort port: 80 nodePort: 30080 ingress: enabled:false vim nginx/templates/service.yaml #模板以反映 Service 类型的变化 apiVersion: v1 kind: Service metadata: name: {{ include"nginx.fullname". }} labels: {{- include"nginx.labels". | nindent 4 }} spec: type: {{ .Values.service.type }} ports: - port: {{ .Values.service.port }} targetPort: http protocol: TCP name: http nodePort: {{ .Values.service.nodePort }} #指定 nodePort selector: {{- include"nginx.selectorLabels". | nindent 4 }} #升级 release,release 版本加 1 helm upgrade nginx nginx kubectl get svc curl 192.168.241.23:30080
通过这些步骤,可以创建和部署自定义的 Helm charts,以及管理和配置 Kubernetes 集群中的 Ingress 规则。这些步骤提供了一个从创建到部署再到升级的完整流程,有助于理解 Helm charts 的使用和管理。
四、回滚
使用 Helm 进行回滚操作以及如何在命令行中使用--set参数来部署或升级 Helm release 的信息
1.回滚Helm Release
1.1查看Release历史
helmhistorynginx #使用 helm history 命令查看 Helm release 的历史记录,包括每次更新的详细信息和状态
1.2执行回滚操作
helm rollback nginx 1 #使用 helm rollback 命令加上 release 名称和要回滚到的版本号来执行回滚操作。 helmhistorynginx #执行回滚后,可以再次使用 helm history 命令确认 release 是否已经成功回滚到指定版本
1.3维护Helm Chart
在 Helm chart 的templates目录下的 Kubernetes 清单文件配置好后,通常的维护工作主要涉及修改Chart.yaml和values.yaml文件。
•Chart.yaml:更新 chart 的元数据,如版本号、描述等。
•values.yaml:调整或添加配置参数,这些参数将应用于模板中,以定制 Kubernetes 资源的行为。
1.4使用-set参数部署或升级Release
在部署或升级 Helm release 时,可以使用--set参数在命令行中直接指定配置值。这些值将覆盖values.yaml文件中的同名参数。
#例如,要将 Nginx chart 的镜像标签升级到 1.15,可以使用以下命令 helm upgrade nginx nginx --setimage.tag='1.15' #这个命令会更新 Nginx chart 的镜像标签,而无需修改 values.yaml 文件。这种快捷方式在需要快速更改配置或在没有访问 values.yaml 文件的情况下非常有用。
总结来说,Helm 提供了灵活的方式来管理和维护 Kubernetes 应用程序的部署。通过回滚功能,可以轻松撤销更改;通过--set参数,可以在部署或升级时动态调整配置。这些功能使得 Helm 成为 Kubernetes 集群中应用程序部署和维护的强有力工具。
五、Helm仓库
使用 Harbor 作为本地 Helm 仓库,并将自定义的 Helm chart 推送至 Harbor 仓库的详细步骤
1.安装Harbor
1. 准备 Harbor 的离线安装包 harbor-offline-installer-v1.9.1.tgz 和 docker-compose 文件。
2. 配置 harbor.yml 文件,设置 Harbor 的主机名、管理员密码、数据存储路径等。
3. 使用 ./install.sh --with-clair --with-chartmuseum 命令安装 Harbor,并启用 Clair 服务和 chart 仓库服务。
#上传 harbor-offline-installer-v1.9.1.tgz 和 docker-compose 文件到 /opt 目录 cd/opt cpdocker-compose /usr/local/bin/ chmod+x /usr/local/bin/docker-compose curl -SL https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose #如果安装最新版的Docker需要安装高版本的Docker-Compose wget https://storage.googleapis.com/harbor-releases/release-1.9.0/harbor-offline-installer-v1.9.1.tgz tar zxf harbor-offline-installer-v1.9.1.tgz cdharbor/ vim harbor.yml hostname: 192.168.241.24 harbor_admin_password: Harbor12345 #admin用户初始密码 data_volume: /data #数据存储路径,自动创建 chart: absolute_url: enabled #在chart中启用绝对url log: level: info local: rotate_count: 50 rotate_size: 200M location: /var/log/harbor #日志路径 #安装带有 Clair service 和 chart 仓库服务的 Harbor ./install.sh --with-clair --with-chartmuseum
2.安装Helm Push插件
#在线安装 Helm Push 插件 helm plugin install https://github.com/chartmuseum/helm-push
wget https://github.com/chartmuseum/helm-push/releases/download/v0.8.1/helm-push_0.8.1_linux_amd64.tar.gz #离线安装 Helm Push 插件: mkdir~/.local/share/helm/plugins/helm-push -p tar -zxvf helm-push_0.8.1_linux_amd64.tar.gz -C ~/.local/share/helm/plugins/helm-push helm repols
3.配置Helm仓库
helm repo add harbor http://192.168.241.24/chartrepo/chart_repo --username=admin --password=Harbor12345 #登录到 Harbor 的 Web UI 界面,并创建一个新项目 chart_repo。 #浏览器访问:http://192.168.241.24 ,默认的管理员用户名和密码是 admin/Harbor12345 点击 “+新建项目” 按钮 填写项目名称为 “chart_repo”,访问级别勾选 “公开”,点击 “确定” 按钮,创建新项目 #添加 Harbor 项目作为 Helm 仓库: #这里的 repo 的地址是/chartrepo/,Harbor 中每个项目是分开的 repo。如果不提供项目名称, 则默认使用 library 这个项目。
4.推送Chart 到 Harbor
cd/opt/ helm push nginx harbor #使用 helm push 命令将 chart 推送到 Harbor 仓库
在 Harbor 的 Web UI 界面中查看chart_repo项目,确认已成功推送的 Helm Charts
通过这些步骤,可以将自定义的 Helm charts 推送到本地的 Harbor 仓库中,从而实现 Helm charts 的存储、管理和分发。Harbor 作为一个企业级的 Docker Registry 管理项目,也支持 Helm charts 的存储和分发,这使得它成为 Kubernetes 环境中管理 Helm charts 的理想选择。
六、总结
1.Helm命令总结
Helm命令总结
命令 | 含义 |
Completion | 命令补全 |
Create | 创建一个给定名称的Chart |
Dependency | 管理Chart的依赖关系 |
Env | Helm环境信息 |
Get | 获取给定Release的扩展信息 |
Help | 命令帮助 |
History | 获取Release历史 |
Install | 部署Chart |
Lint | 对Chart进行语法检查 |
List | Release列表,List可简写成Ls |
Package | 打包Chart |
Plugin | Install、List、UnInstall、Helm插件 |
Pull | 从Repo中下载Chart并(可选)将其解压到本地目录 |
Repo | ADD、List、Remove、Update、Index、Helm的Repo |
RollBack | 回滚Release到一个以前的版本 |
Search | 查询在Charts中的关键字 |
Show | 显示Chart的信息 |
Status | 显示给定Release的状态 |
Template | 本地渲染模板 |
Test | 测试运行Release |
Uninstall | 删除Release |
Upgrade | 升级Release |
Verify | 验证给定路径的Chart是否已签名且有效 |
Version | 显示Helm的版本信息 |
链接:
https://blog.csdn.net/weixin_46560589/article/details/135459378