目录

一、概念

Helm 的核心概念

Helm 的工作流程

Helm 3 与 Helm 2 的区别

二、Helm部署

安装 Helm

下载 Helm 客户端:

安装 Helm:

验证 Helm 安装:

命令补全:

使用 Helm 安装 Chart

添加 Helm 仓库:

更新 Helm 仓库:

查看 Helm 仓库列表:

搜索 Chart:

删除 Helm 仓库:

查看 Chart 信息:

安装 Chart:

查看所有 release:

查看 release 状态:

删除 release:

三、Helm Chart 自定义模板

查看chart文件细节

Helm chart 结构

创建自定义的 chart

创建自定义 Helm Chart

修改 Helm Chart

打包和部署 Helm Chart

部署 Ingress-Nginx

升级 Helm Chart

四、回滚

回滚 Helm Release

查看 Release 历史:

执行回滚操作:

维护 Helm Chart

使用 –set 参数部署或升级 Release

五、Helm 仓库

安装 Harbor

安装 Helm Push 插件

配置 Helm 仓库

推送 Chart 到 Harbor

查看 Helm Charts


一、概念

Helm 是 Kubernetes 的包管理工具,它允许开发者和系统管理员通过定义、打包和部署应用程序来简化 Kubernetes 应用的管理工作。Helm 的出现是为了解决在 Kubernetes 环境中部署和管理复杂应用的挑战。

  • Helm 的官方网站是 Helm,在这里可以找到 Helm 的安装指南、文档、Chart 仓库和社区贡献信息。通过 Helm,用户可以更高效地管理和部署 Kubernetes 应用,实现快速迭代和持续集成。

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 创建多个 Release,每个 Release 都有自己的配置和状态。

Helm 的工作流程

  • 查找 Chart:用户可以在 Helm 的 Repository 中查找所需的 Chart。

  • 安装 Chart:使用 helm install 命令安装 Chart 到 Kubernetes 集群,创建一个 Release。

  • 管理 Release:用户可以使用 helm upgradehelm rollbackhelm uninstall 等命令来管理 Release,包括更新、回滚或卸载应用。

  • 维护 Repository:用户可以添加、更新和删除 Helm Repository,以管理可用的 Chart。

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部署

包括如何安装 Helm 客户端、添加和更新 Helm 仓库、搜索和查看 Chart 信息、安装和卸载应用

安装 Helm

下载 Helm 客户端

访问 Helm 的 GitHub 标签页面 https://github.com/helm/helm/tags 来下载适合操作系统的 Helm 版本。例如,如果使用的是 Linux 系统,可以下载 helm-v3.6.0-linux-amd64.tar.gz

安装 Helm

解压下载的 Helm 压缩包,并将其移动到系统的可执行路径中,例如 /usr/local/bin

tar -zxvf helm-v3.6.0-linux-amd64.tar.gzmv linux-amd64/helm /usr/local/bin/helm

验证 Helm 安装

运行 helm version 来检查 Helm 是否已成功安装。

helm version

命令补全

为了提高使用 Helm 的效率,可以启用命令补全功能。

source <(helm completion bash)

使用 Helm 安装 Chart

添加 Helm 仓库

添加常用的 Helm 仓库,以便可以搜索和安装各种 Chart。

helm repo add bitnami https://charts.bitnami.com/bitnamihelm repo add stable http://mirror.azure.cn/kubernetes/chartshelm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/chartshelm repo add incubator https://charts.helm.sh/incubator

更新 Helm 仓库

更新 Helm 仓库列表,以确保可以访问最新的 Chart 版本。

helm repo update

查看 Helm 仓库列表

查看已添加的 Helm 仓库。

helm repo list

搜索 Chart

stable 仓库中搜索可用的 Chart。

helm search repo stable

删除 Helm 仓库

如果不再需要某个 Helm 仓库,可以将其从列表中删除。

helm repo remove incubator

查看 Chart 信息

查看特定 Chart 的基本信息或所有信息。

helm show chart stable/mysql # 查看基本信息helm show all stable/mysql # 获取所有信息

安装 Chart

使用 helm install 命令安装 Chart。可以指定一个 release 名称,或者使用 --generate-name 让 Helm 为生成一个随机名称。

helm install my-redis bitnami/redis [-n default]# 指定 release 名称helm install bitnami/redis --generate-name # 自动生成 release 名称

查看所有 release

列出所有已安装的 Helm release。

helm ls

或者使用 helm list 来获取更详细的信息。

helm list

查看 release 状态

查看特定 release 的状态信息。

helm status my-redis

删除 release

使用 helm uninstall 命令删除指定的 Helm release。

helm uninstall my-redis

三、Helm Chart 自定义模板

查看chart文件细节

  • charts 除了可以在 repo 中下载,还可以自己自定义,创建完成后通过 helm 部署到 k8s。

Helm Chart 是 Helm 用来部署 Kubernetes 应用的包。一个 Chart 包含一系列的 Kubernetes 资源定义文件(YAML 格式),以及一个描述 Chart 的 Chart.yaml 文件和一个用于配置的 values.yaml 文件。自定义 Helm Chart 允许根据具体需求来创建和部署 Kubernetes 应用。

  • 拉取 Helm Chart:

  • 创建一个目录用于存放 Helm charts,例如 /opt/helm

  • 使用 helm pull 命令从 Helm 仓库拉取特定的 chart,例如 stable/mysql

  • 查看拉取的 chart 文件,确认文件存在。

mkdir /opt/helmcd /opt/helmhelm pull stable/mysqllsmysql-1.6.9.tgz
  • 查看 Chart 结构:

  • 使用 tar 命令解压缩拉取的 chart 文件,例如 mysql-1.6.9.tgz

  • 使用 ls 命令列出解压缩后的 chart 文件夹内容。

  • 安装 tree 命令(如果尚未安装),以便更好地查看文件和目录结构。

  • 使用 tree 命令查看 chart 的详细结构,包括所有文件和子目录。

tar xf mysql-1.6.9.tgzyum install -y treetree mysqlmysql├── Chart.yaml├── README.md├── templates│ ├── configurationFiles-configmap.yaml│ ├── deployment.yaml│ ├── _helpers.tpl│ ├── initializationFiles-configmap.yaml│ ├── NOTES.txt│ ├── pvc.yaml│ ├── secrets.yaml│ ├── serviceaccount.yaml│ ├── servicemonitor.yaml│ ├── service.yaml│ ├── ingress.yaml│ └── tests│ ├── test-configmap.yaml│ └── test.yaml└── values.yaml
  • Chart 结构概览:

  • Chart 包的根目录包含了多个文件和子目录,这些是构成 Helm chart 的基本元素。

  • 主要文件和目录包括:

    • 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:包含测试相关的模板文件。

    • values.yaml:包含 chart 的默认配置值。

  • 通过这个结构,我们可以看到 Helm chart 是如何组织和管理 Kubernetes 应用程序的部署配置的。用户可以根据需要编辑这些文件,以自定义应用程序的行为和配置。

Helm chart 结构

Helm chart 的关键组成部分的详细说明:

  • Chart.yaml:

  • 这是 Helm chart 的自描述文件,它包含了 chart 的基本信息。

  • 必须包含 name 字段,用于指定 chart 的名称。

  • 必须包含 version 字段,用于指定 chart 的版本号。

  • 还可以包含其他元数据,如描述、图标、维护者信息等。

  • 模板:

  • Helm chart 包含一个或多个模板,这些模板是 Kubernetes 资源清单文件的文本模板。

  • 模板中可以包含 Go 模板 语法,用于动态生成 Kubernetes 清单文件。

  • 模板会根据 values.yaml 文件中的值进行填充和处理,生成最终的 Kubernetes 资源清单。

  • 具体模板文件:

  • 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 命令进行部署和管理。

创建自定义的 chart

创建自定义 Helm Chart

  • 使用 helm create 命令创建一个新的 Helm chart,例如 nginx

  • 使用 tree 命令查看新创建的 chart 结构,包括 Chart.yamlvalues.yamltemplates 目录等。

  • 查看 templates/deployment.yaml 文件,了解如何在模板中使用 Go 模板语法引用 values.yaml 中的变量。

helm create nginxtree nginxnginx├── charts├── Chart.yaml├── templates│ ├── deployment.yaml│ ├── _helpers.tpl│ ├── hpa.yaml│ ├── ingress.yaml│ ├── NOTES.txt│ ├── serviceaccount.yaml│ ├── service.yaml│ └── tests│ └── test-connection.yaml└── values.yamlcat nginx/templates/deployment.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 }}"cat nginx/values.yaml | grep repositoryrepository: nginx#以上变量值是在 create chart 的时候就自动生成的默认值,你可以根据实际情况进行修改。

修改 Helm Chart

  • 修改 Chart.yaml 文件以更新 chart 的元数据,如 nameversionappVersion

  • 修改 values.yaml 文件以设置默认的配置值,如 replicaCountimageservice 类型等。

//修改 chartvim nginx/Chart.yamlapiVersion: v2name: nginx #chart名字description: A Helm chart for Kubernetestype: application #chart类型,application或libraryversion: 0.1.0#chart版本appVersion: 1.16.0#application部署版本vim nginx/values.yamlreplicaCount: 1image:repository: nginxpullPolicy: IfNotPresenttag: "latest"#设置镜像标签imagePullSecrets: []nameOverride: ""fullnameOverride: ""serviceAccount:create: trueannotations: {}name: ""podAnnotations: {}podSecurityContext: {}# fsGroup: 2000securityContext: {}# capabilities:# drop:# - ALL# readOnlyRootFilesystem: true# runAsNonRoot: true# runAsUser: 1000service:type: ClusterIPport: 80ingress:enabled: true #开启 ingressclassName: ""annotations: {}# kubernetes.io/ingress.class: nginx# kubernetes.io/tls-acme: "true"hosts:- host: www.gzb.com #指定ingress域名paths:- path: /pathType: Prefix#指定ingress路径类型tls: []#- secretName: chart-example-tls#hosts:#- chart-example.localresources:limits:cpu: 100mmemory: 128Mirequests:cpu: 100mmemory: 128Miautoscaling:enabled: falseminReplicas: 1maxReplicas: 100targetCPUUtilizationPercentage: 80# targetMemoryUtilizationPercentage: 80nodeSelector: {}tolerations: []affinity: {}

打包和部署 Helm Chart

  • 使用 helm lint 命令检查 chart 的依赖和模板配置是否正确。

  • 使用 helm package 命令打包 chart,生成 .tgz 文件。

  • 使用 helm install 命令部署 chart,可以选择使用 --dry-run--debug 参数进行测试。

  • 使用 helm install 命令正式部署 chart,可以指定命名空间和配置文件。

helm lint nginx#检查依赖和模版配置是否正确helm package nginx #打包 chart,会在当前目录下生成压缩包 nginx-0.1.0.tgz//部署 charthelm 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.yamlhelm install nginx ./nginx -f ./nginx/values-prod.yamlhelm lskubectl get pod,svc

部署 Ingress-Nginx

  • 下载 Ingress-Nginx 的配置文件 mandatory.yamlservice-nodeport.yaml

  • 使用 kubectl apply 命令应用这些配置文件,以部署 Ingress 控制器和 NodePort 类型的 Service。

  • 查看 Ingress 控制器和 Service 的状态,确保它们正常运行。

  • 通过编辑 /etc/hosts 文件将域名 www.gzb.com 指向 Ingress 控制器的 IP 地址。

  • 使用 curl 命令测试 Ingress 是否能够正确代理请求。

#部署 ingresswget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yamlwget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yamlkubectl apply -f mandatory.yamlkubectl apply -f service-nodeport.yamlkubectl get pod,svc -n ingress-nginxkubectl get ingressvim /etc/hosts.....192.168.42.34 node02 www.gzb.comcurl http://www.gzb.com:30665

升级 Helm Chart

  • 修改 values.yaml 文件以更改 Service 类型为 NodePort 并设置 nodePort

  • 修改 templates/service.yaml 模板以反映 Service 类型的变化。

  • 使用 helm upgrade 命令升级已部署的 chart,更新 Service 类型和端口。

  • 再次使用 curl 命令测试 NodePort 是否能够正确代理请求。

//修改为 NodePort 访问后,升级vim nginx/values.yamlservice:type: NodePortport: 80nodePort: 30080ingress:enabled: falsevim nginx/templates/service.yamlapiVersion: v1kind: Servicemetadata:name: {{ include "nginx.fullname" . }}labels:{{- include "nginx.labels" . | nindent 4 }}spec:type: {{ .Values.service.type }}ports:- port: {{ .Values.service.port }}targetPort: httpprotocol: TCPname: httpnodePort: {{ .Values.service.nodePort }}#指定 nodePortselector:{{- include "nginx.selectorLabels" . | nindent 4 }}#升级 release,release 版本加 1helm upgrade nginx nginx kubectl get svccurl 192.168.41.34:30080

通过这些步骤,可以创建和部署自定义的 Helm charts,以及管理和配置 Kubernetes 集群中的 Ingress 规则。这些步骤提供了一个从创建到部署再到升级的完整流程,有助于理解 Helm charts 的使用和管理。

四、回滚

使用 Helm 进行回滚操作以及如何在命令行中使用 --set 参数来部署或升级 Helm release 的信息

回滚 Helm Release

查看 Release 历史:
  • 使用 helm history 命令查看 Helm release 的历史记录,包括每次更新的详细信息和状态。
helm history nginx
执行回滚操作:
  • 使用 helm rollback 命令加上 release 名称和要回滚到的版本号来执行回滚操作。

  • 执行回滚后,可以再次使用 helm history 命令确认 release 是否已经成功回滚到指定版本。

helm rollback nginx 1helm history nginx

维护 Helm Chart

在 Helm chart 的 templates 目录下的 Kubernetes 清单文件配置好后,通常的维护工作主要涉及修改 Chart.yamlvalues.yaml 文件。

  • Chart.yaml:更新 chart 的元数据,如版本号、描述等。

  • values.yaml:调整或添加配置参数,这些参数将应用于模板中,以定制 Kubernetes 资源的行为。

使用 --set 参数部署或升级 Release

在部署或升级 Helm release 时,可以使用 --set 参数在命令行中直接指定配置值。这些值将覆盖 values.yaml 文件中的同名参数。

例如,要将 Nginx chart 的镜像标签升级到 1.15,可以使用以下命令:

helm upgrade nginx nginx --set image.tag='1.15'

这个命令会更新 Nginx chart 的镜像标签,而无需修改 values.yaml 文件。这种快捷方式在需要快速更改配置或在没有访问 values.yaml 文件的情况下非常有用。

总结来说,Helm 提供了灵活的方式来管理和维护 Kubernetes 应用程序的部署。通过回滚功能,可以轻松撤销更改;通过 --set 参数,可以在部署或升级时动态调整配置。这些功能使得 Helm 成为 Kubernetes 集群中应用程序部署和维护的强有力工具。


五、Helm 仓库

使用 Harbor 作为本地 Helm 仓库,并将自定义的 Helm chart 推送至 Harbor 仓库的详细步骤

安装 Harbor

  • 准备 Harbor 的离线安装包 harbor-offline-installer-v1.9.1.tgzdocker-compose 文件。

  • 配置 harbor.yml 文件,设置 Harbor 的主机名、管理员密码、数据存储路径等。

  • 使用 ./install.sh --with-clair --with-chartmuseum 命令安装 Harbor,并启用 Clair 服务和 chart 仓库服务。

#上传 harbor-offline-installer-v1.9.1.tgz 和 docker-compose 文件到 /opt 目录cd /optcp docker-compose /usr/local/bin/chmod +x /usr/local/bin/docker-composetar zxf harbor-offline-installer-v1.9.1.tgzcd harbor/vim harbor.ymlhostname: 192.168.10.19harbor_admin_password: Harbor12345 #admin用户初始密码data_volume: /data #数据存储路径,自动创建chart:absolute_url: enabled#在chart中启用绝对urllog:level: infolocal:rotate_count: 50rotate_size: 200Mlocation: /var/log/harbor#日志路径#安装带有 Clair service 和 chart 仓库服务的 Harbor./install.sh --with-clair --with-chartmuseum

安装 Helm Push 插件

  • 在线安装 Helm Push 插件:
helm plugin install https://github.com/chartmuseum/helm-push
  • 离线安装 Helm Push 插件:

  • 下载插件压缩包 helm-push_0.8.1_linux_amd64.tar.gz

  • 解压缩并将其放置在 ~/.local/share/helm/plugins/helm-push 目录下。

wget https://github.com/chartmuseum/helm-push/releases/download/v0.8.1/helm-push_0.8.1_linux_amd64.tar.gzmkdir ~/.local/share/helm/plugins/helm-pushtar -zxvf helm-push_0.8.1_linux_amd64.tar.gz -C ~/.local/share/helm/plugins/helm-pushhelm repo ls

配置 Helm 仓库

  • 登录到 Harbor 的 Web UI 界面,并创建一个新项目 chart_repo

  • 浏览器访问:http://192.168.10.19 ,默认的管理员用户名和密码是 admin/Harbor12345 点击 “+新建项目” 按钮 填写项目名称为 “chart_repo”,访问级别勾选 “公开”,点击 “确定” 按钮,创建新项目

  • 添加 Harbor 项目作为 Helm 仓库:

helm repo add harbor http://192.168.10.19/chartrepo/chart_repo --username=admin --password=Harbor12345

这里的 repo 的地址是/chartrepo/,Harbor 中每个项目是分开的 repo。如果不提供项目名称, 则默认使用 library 这个项目。

推送 Chart 到 Harbor

  • 切换到包含 Helm chart 的目录。
cd /opt/helm
  • 使用 helm push 命令将 chart 推送到 Harbor 仓库:
helm push nginx harbor

查看 Helm Charts

  • 在 Harbor 的 Web UI 界面中查看 chart_repo 项目,确认已成功推送的 Helm Charts。

通过这些步骤,可以将自定义的 Helm charts 推送到本地的 Harbor 仓库中,从而实现 Helm charts 的存储、管理和分发。Harbor 作为一个企业级的 Docker Registry 管理项目,也支持 Helm charts 的存储和分发,这使得它成为 Kubernetes 环境中管理 Helm charts 的理想选择。