helm通过打包的方式,支持发布的版本管理和控制,很大程度上简化了Kubernetes应用的部署和管理。
Helm本质就是让k8s的应用管理(Deployment、Service等)可配置,能动态生成。通过动态生成K8S资源清单文(deployment.yaml、service.yaml)。然后kubectl自动调用K8S资源部署。
Helm,避免了我们去完成同样的资源对象在到多个环境中配置和维护过程。它能够把这些零零散散的应用资源文件放在一起进行统一配置,极大方便了开发人员对K8s集群应用的管理。
Helm 组件及相关术语
Helm是官方提供类似于YUM的包管理,是部署环境的流程封装,Helm有三个重要的概念:chart、release和Repository
-
Helm:Helm 是一个命令行下的客户端工具。主要用于 Kubernetes 应用程序 Chart 的创建、打包、发布以及创建和管理本地和远程的 Chart 仓库。
-
Tiller:Tiller 是 Helm 的服务端,部署在 Kubernetes 集群中。Tiller 用于接收 Helm 的请求,并根据 Chart 生成 Kubernetes 的部署文件( Helm 称为 Release ),然后提交给 Kubernetes 创建应用。Tiller 还提供了 Release 的升级、删除、回滚等一系列功能。
-
Chart:Helm 的软件包,采用 TAR 格式。类似于 APT 的 DEB 包或者 YUM 的 RPM 包,其包含了一组定义 Kubernetes 资源相关的 YAML 文件。Chart有特定的文件目录结构,如果开发者想自定义一个新的 Chart,只需要使用Helm create命令生成一个目录结构即可进行开发。
-
Repoistory:Helm 的软件仓库,Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository, 官方仓库的地址是https://hub.helm.sh。
-
Release:使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Release。

1、Chart Install 过程:
-
Helm从指定的目录或者tgz文件中解析出Chart结构信息
-
Helm将指定的Chart结构和Values信息通过gRPC传递给Tiller
-
Tiller根据Chart和Values生成一个Release
-
Tiller将Release发送给Kubernetes用于生成Release
2、Chart Update过程:
-
Helm从指定的目录或者tgz文件中解析出Chart结构信息
-
Helm将要更新的Release的名称和Chart结构,Values信息传递给Tiller
-
Tiller生成Release并更新指定名称的Release的History
-
Tiller将Release发送给Kubernetes用于更新Release
3、Chart Rollback过程:
-
Helm将要回滚的Release的名称传递给Tiller
-
Tiller根据Release的名称查找History
-
Tiller从History中获取上一个Release
-
Tiller将上一个Release发送给Kubernetes用于替换当前Release
配置验证
需要helm压缩包(可以在github/helm/helm按照需求下载)
将文件解压:tar xf helm-v4.2.0-linux-amd64.tar.gz
进入目录:cd linux-amd64/
将命令添加到:cp helm /usr/local/sbin/
执行命令 helm

创建nginx-pod: helm create nginx

镜像拉取方式,也可以拉取本地镜像

service类型和端口号

ingress默认未开启

打开可以做资源限制

探针的编写,存活探针和就绪探针

自动调度,HPA配置,pod的最小数和最大数,cpu的平均使用率和内存的平均使用率

挂卷,外部存储放在哪

进入到nginx目录中可以创建
helm install nginx .

验证,访问地址

更改values.yaml文件,replicaCount: 5 之后不能用创建,要用更新

回滚操作

helm search repo mysql
在你本地已经添加的所有 Helm 仓库里,搜索有没有 mysql 相关的安装包(Chart 包)
Default values for nginx.
This is a YAML-formatted file.
Declare variables to be passed into your templates.
==============================================
1. 副本数配置
==============================================
Pod 副本数量
replicaCount: 5
==============================================
2. 容器镜像配置
==============================================
image:
镜像仓库地址
repository: nginx
镜像拉取策略:Always/IfNotPresent/Never
pullPolicy: IfNotPresent
镜像标签(为空则使用 Chart 默认 appVersion)
tag: ""
拉取私有镜像所需的 Secret 名称(数组)
imagePullSecrets: []
覆盖资源名称(短名称)
nameOverride: ""
覆盖资源完整名称
fullnameOverride: ""
==============================================
3. ServiceAccount 配置
==============================================
serviceAccount:
是否自动创建 ServiceAccount
create: true
是否自动挂载 API 凭证到 Pod
automount: true
ServiceAccount 注解
annotations: {}
ServiceAccount 名称(不填则自动生成)
name: ""
==============================================
4. Pod 元数据配置
==============================================
Pod 注解
podAnnotations: {}
Pod 标签
podLabels: {}
==============================================
5. 安全上下文
==============================================
Pod 级别安全上下文
podSecurityContext:
容器文件系统属组
fsGroup: 2000
容器级别安全上下文
securityContext:
移除所有 Linux 能力权限
capabilities:
drop:
- ALL
根文件系统只读
readOnlyRootFS: true
以非 root 用户运行
runAsNonRoot: true
运行用户 UID
runAsUser: 1000
==============================================
6. Service 服务暴露配置
==============================================
service:
Service 类型:ClusterIP / NodePort / LoadBalancer / ExternalName
type: NodePort
Service 内部端口
port: 80
容器端口(对应 Pod 端口)
targetPort: 80
NodePort 固定端口(仅 type=NodePort 时可用,不指定则自动分配)
nodePort: ""
Service 注解
annotations: {}
==============================================
7. Ingress 外部访问配置
==============================================
ingress:
是否启用 Ingress
enabled: false
Ingress 控制器类名
className: ""
Ingress 注解
annotations: {}
域名与路径配置
hosts:
- host: chart-example.local
paths:
- path: /
pathType: ImplementationSpecific
HTTPS 证书配置
tls: []
==============================================
8. Gateway API HTTPRoute(新一代网关)
==============================================
httpRoute:
enabled: false
annotations: {}
parentRefs:
- name: gateway
sectionName: http
hostnames:
- chart-example.local
rules:
-
matches:
-
path:
type: PathPrefix
value: /headers
==============================================
9. 资源限制(CPU / 内存)
==============================================
resources:
资源上限
limits:
cpu: 100m
memory: 128Mi
资源申请(启动预留)
requests:
cpu: 100m
memory: 128Mi
==============================================
10. 健康检查(存活 + 就绪探针)
==============================================
livenessProbe:
httpGet:
path: /
port: http
启动后等待时间
initialDelaySeconds: 30
检查间隔
periodSeconds: 10
超时时间
timeoutSeconds: 5
失败阈值
failureThreshold: 3
readinessProbe:
httpGet:
path: /
port: http
initialDelaySeconds: 5
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
==============================================
11. 自动扩缩容 HPA
==============================================
autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 100
targetCPUUtilizationPercentage: 80
targetMemoryUtilizationPercentage: 80
==============================================
12. 存储卷挂载
==============================================
额外存储卷
volumes: []
容器内挂载路径
volumeMounts: []
==============================================
13. 节点调度配置
==============================================
节点选择器
nodeSelector: {}
污点容忍度
tolerations: []
节点亲和性 / Pod 亲和性
affinity: {}