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: {}

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐