赞
踩
目录
Helm 是 Kubernetes 的包管理工具,它允许开发者和系统管理员通过定义、打包和部署应用程序来简化 Kubernetes 应用的管理工作。Helm 的出现是为了解决在 Kubernetes 环境中部署和管理复杂应用的挑战。
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 都有自己的配置和状态。
查找 Chart:用户可以在 Helm 的 Repository 中查找所需的 Chart。
安装 Chart:使用 helm install
命令安装 Chart 到 Kubernetes 集群,创建一个 Release。
管理 Release:用户可以使用 helm upgrade
、helm rollback
、helm uninstall
等命令来管理 Release,包括更新、回滚或卸载应用。
维护 Repository:用户可以添加、更新和删除 Helm Repository,以管理可用的 Chart。
Helm 2:在 Helm 2 中,采用了客户端-服务器模型,其中客户端是 Helm,服务器端是 Tiller。Tiller 作为 Kubernetes 集群中的一个 Deployment 运行,负责管理 Helm 的 Release 和执行 Kubernetes 操作。
Helm 3:Helm 3 移除了 Tiller,简化了架构。现在,Helm 客户端直接与 Kubernetes API 服务器通信,执行所有的 Kubernetes 操作。这减少了复杂性,并提高了安全性,因为不再需要在集群中运行一个具有广泛权限的 Tiller 服务。
包括如何安装 Helm 客户端、添加和更新 Helm 仓库、搜索和查看 Chart 信息、安装和卸载应用
访问 Helm 的 GitHub 标签页面 https://github.com/helm/helm/tags 来下载适合操作系统的 Helm 版本。例如,如果使用的是 Linux 系统,可以下载 helm-v3.6.0-linux-amd64.tar.gz
。
解压下载的 Helm 压缩包,并将其移动到系统的可执行路径中,例如 /usr/local/bin
。
- tar -zxvf helm-v3.6.0-linux-amd64.tar.gz
- mv linux-amd64/helm /usr/local/bin/helm
运行 helm version
来检查 Helm 是否已成功安装。
helm version
为了提高使用 Helm 的效率,可以启用命令补全功能。
source <(helm completion bash)
添加常用的 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
更新 Helm 仓库列表,以确保可以访问最新的 Chart 版本。
helm repo update
查看已添加的 Helm 仓库。
helm repo list
在 stable
仓库中搜索可用的 Chart。
helm search repo stable
如果不再需要某个 Helm 仓库,可以将其从列表中删除。
helm repo remove incubator
查看特定 Chart 的基本信息或所有信息。
- helm show chart stable/mysql # 查看基本信息
- helm show all stable/mysql # 获取所有信息
使用 helm install
命令安装 Chart。可以指定一个 release 名称,或者使用 --generate-name
让 Helm 为生成一个随机名称。
- helm install my-redis bitnami/redis [-n default] # 指定 release 名称
- helm install bitnami/redis --generate-name # 自动生成 release 名称
列出所有已安装的 Helm release。
helm ls
或者使用 helm list
来获取更详细的信息。
helm list
查看特定 release 的状态信息。
helm status my-redis
使用 helm uninstall
命令删除指定的 Helm release。
helm uninstall my-redis
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/helm
- cd /opt/helm
-
- helm pull stable/mysql
-
- ls
- mysql-1.6.9.tgz
查看 Chart 结构:
使用 tar
命令解压缩拉取的 chart 文件,例如 mysql-1.6.9.tgz
。
使用 ls
命令列出解压缩后的 chart 文件夹内容。
安装 tree
命令(如果尚未安装),以便更好地查看文件和目录结构。
使用 tree
命令查看 chart 的详细结构,包括所有文件和子目录。
- tar xf mysql-1.6.9.tgz
-
- yum install -y tree
-
- tree mysql
- mysql
- ├── 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 的关键组成部分的详细说明:
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 命令进行部署和管理。
使用 helm create
命令创建一个新的 Helm chart,例如 nginx
。
使用 tree
命令查看新创建的 chart 结构,包括 Chart.yaml
、values.yaml
和 templates
目录等。
查看 templates/deployment.yaml
文件,了解如何在模板中使用 Go 模板语法引用 values.yaml
中的变量。
- helm create 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
-
- cat 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 repository
- repository: nginx
- #以上变量值是在 create chart 的时候就自动生成的默认值,你可以根据实际情况进行修改。

修改 Chart.yaml
文件以更新 chart 的元数据,如 name
、version
和 appVersion
。
修改 values.yaml
文件以设置默认的配置值,如 replicaCount
、image
和 service
类型等。
- //修改 chart
- vim nginx/Chart.yaml
- apiVersion: v2
- name: nginx #chart名字
- description: A Helm chart for Kubernetes
- 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.gzb.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: {}

使用 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
-
- //部署 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-prod.yaml
-
- helm ls
-
- kubectl get pod,svc

下载 Ingress-Nginx 的配置文件 mandatory.yaml
和 service-nodeport.yaml
。
使用 kubectl apply
命令应用这些配置文件,以部署 Ingress 控制器和 NodePort 类型的 Service。
查看 Ingress 控制器和 Service 的状态,确保它们正常运行。
通过编辑 /etc/hosts
文件将域名 www.gzb.com
指向 Ingress 控制器的 IP 地址。
使用 curl
命令测试 Ingress 是否能够正确代理请求。
- #部署 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
-
- kubectl apply -f mandatory.yaml
- kubectl apply -f service-nodeport.yaml
-
- kubectl get pod,svc -n ingress-nginx
-
- kubectl get ingress
-
- vim /etc/hosts
- .....
- 192.168.42.34 node02 www.gzb.com
-
- curl http://www.gzb.com:30665

修改 values.yaml
文件以更改 Service 类型为 NodePort 并设置 nodePort
。
修改 templates/service.yaml
模板以反映 Service 类型的变化。
使用 helm upgrade
命令升级已部署的 chart,更新 Service 类型和端口。
再次使用 curl
命令测试 NodePort 是否能够正确代理请求。
- //修改为 NodePort 访问后,升级
- vim nginx/values.yaml
- service:
- type: NodePort
- port: 80
- nodePort: 30080
-
- ingress:
- enabled: false
-
- vim nginx/templates/service.yaml
- 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.41.34:30080

通过这些步骤,可以创建和部署自定义的 Helm charts,以及管理和配置 Kubernetes 集群中的 Ingress 规则。这些步骤提供了一个从创建到部署再到升级的完整流程,有助于理解 Helm charts 的使用和管理。
使用 Helm 进行回滚操作以及如何在命令行中使用 --set
参数来部署或升级 Helm release 的信息
helm history
命令查看 Helm release 的历史记录,包括每次更新的详细信息和状态。helm history nginx
使用 helm rollback
命令加上 release 名称和要回滚到的版本号来执行回滚操作。
执行回滚后,可以再次使用 helm history
命令确认 release 是否已经成功回滚到指定版本。
- helm rollback nginx 1
- helm history nginx
在 Helm chart 的 templates
目录下的 Kubernetes 清单文件配置好后,通常的维护工作主要涉及修改 Chart.yaml
和 values.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 集群中应用程序部署和维护的强有力工具。
使用 Harbor 作为本地 Helm 仓库,并将自定义的 Helm chart 推送至 Harbor 仓库的详细步骤
准备 Harbor 的离线安装包 harbor-offline-installer-v1.9.1.tgz
和 docker-compose
文件。
配置 harbor.yml
文件,设置 Harbor 的主机名、管理员密码、数据存储路径等。
使用 ./install.sh --with-clair --with-chartmuseum
命令安装 Harbor,并启用 Clair 服务和 chart 仓库服务。
- #上传 harbor-offline-installer-v1.9.1.tgz 和 docker-compose 文件到 /opt 目录
- cd /opt
- cp docker-compose /usr/local/bin/
- chmod +x /usr/local/bin/docker-compose
-
- tar zxf harbor-offline-installer-v1.9.1.tgz
- cd harbor/
-
- vim harbor.yml
- hostname: 192.168.10.19
- 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

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.gz
-
- mkdir ~/.local/share/helm/plugins/helm-push
- tar -zxvf helm-push_0.8.1_linux_amd64.tar.gz -C ~/.local/share/helm/plugins/helm-push
-
- helm repo ls
登录到 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 这个项目。
cd /opt/helm
helm push
命令将 chart 推送到 Harbor 仓库:helm push nginx harbor
chart_repo
项目,确认已成功推送的 Helm Charts。通过这些步骤,可以将自定义的 Helm charts 推送到本地的 Harbor 仓库中,从而实现 Helm charts 的存储、管理和分发。Harbor 作为一个企业级的 Docker Registry 管理项目,也支持 Helm charts 的存储和分发,这使得它成为 Kubernetes 环境中管理 Helm charts 的理想选择。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。