Helm3 使用

1、Helm介绍及使用

1.1 Helm简介

Helm 帮助管理 Kubernetes 应用程序——Helm Charts 帮助您定义、安装和升级最复杂的 Kubernetes 应用程序。

1.2 Helm 3与Helm 2

Helm3相较于Helm2:

  • Helm3移除了Tiller
  • 改进了升级策略:三路策略合补丁
  • 发布名称限制在namespace范围内
  • 引入了GO的path导入
  • 使用JSON格式验证Chart Values
  • 将requirement,yaml 合并到Chart.yaml
  • name安装时是必需的,如果不指定可以使用–generate-name自动生成名称
  • 支持Library chart
  • Chart.yaml apiVersion切换到了v2同时兼容v1
  • 一些命令的重新命名

1.3 Helm支持K8S版本

Helm 版本 支持的 Kubernetes 版本
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

1.4 Helm3 chart 默认目录结构

helm create test   // 创建chart,目录结构如下
tree test

test
├── charts                           // 存放依赖的chart
├── Chart.yaml                       // 包含Chart的基本信息,包括chart版本,名称等
├── templates                        // 目录下存放应用一系列 k8s 资源的 yaml 模板
│   ├── deployment.yaml 
│   ├── _helpers.tpl                 //定义一些可重用的模板片断,此文件中的定义在任何资源定义模板中可用
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt                    // 介绍chart 部署后的帮助信息,如何使用chart等
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml                      // 包含了必要的值定义(默认值), 用于存储 templates 目录中模板文件中用到变量的值

1.5 常用命令

helm version                            // 查看helm版本
helm create xxx                         // 创建一个xxx charts
helm install xxx1 ./xxx                 // 部署安装xxx,设置名称为xxx1
helm uninstall xxx1                     // 卸载删除xxx1
helm list                               // 列出已经部署的charts
helm package ./xxx                      // 打包charts
helm template helm_charts-0.1.1.tgz     // 查看生成的模板
helm repo add --username admin --password password myharbor xxx  // 增加repo
helm repo update                        // 更新仓库资源

1.6 values.yaml文件

1.6.1 简介

Chart开发者可以在chart中提供一个命名为 values.yaml 的文件。这个文件包含了默认值,Chart用户可以提供一个包含了value的YAML文件。可以在命令行使用 helm install命令时提供。

1.6.2 预定的value值

Values通过模板中.Values对象可访问的values.yaml文件(或者通过 --set 参数)提供, 但可以模板中访问其他预定义的数据片段。以下值是预定义的,对每个模板都有效,并且可以被覆盖。和所有值一样,名称 区分大小写

Release.Name: 版本名称(非chart的)
Release.Namespace: 发布的chart版本的命名空间
Release.Service: 组织版本的服务
Release.IsUpgrade: 如果当前操作是升级或回滚,设置为true
Release.IsInstall: 如果当前操作是安装,设置为true
Chart: Chart.yaml的内容。因此,chart的版本可以从 Chart.Version 获得, 并且维护者在Chart.Maintainers里。
Files: chart中的包含了非特殊文件的类图对象。这将不允许您访问模板, 但是可以访问现有的其他文件(除非被.helmignore排除在外)。 使用{{ index .Files "file.name" }}可以访问文件或者使用{{.Files.Get name }}功能。 您也可以使用{{ .Files.GetBytes }}作为[]byte方位文件内容。
Capabilities: 包含了Kubernetes版本信息的类图对象。({{ .Capabilities.KubeVersion }} 和支持的Kubernetes API 版本({{ .Capabilities.APIVersions.Has "batch/v1" }})
1.6.3 value文件说明

values文件被定义为YAML格式。chart会包含一个默认的values.yaml文件。 Helm安装命令允许用户使用附加的YAML values覆盖这个values。

chart包含的默认values文件 必须 被命名为values.yaml。可以在命令行指定的文件可以是其他名称。

Values文件可以声明顶级chart的值,以及charts/目录中包含的其他任意chart。

1.7 chart.yaml 文件

1.7.1 文件内容

包含如下字段,其他字段将被忽略。

apiVersion: chart API 版本 (必需) helm3支持v1、v2
name: chart名称 (必需)
version: 语义化2 版本(必需) 语义化版本2.0.0:https://semver.org/spec/v2.0.0.html
kubeVersion: 兼容Kubernetes版本的语义化版本(可选)
description: 一句话对这个项目的描述(可选)
type: chart类型 (可选)application/library
keywords:
  - 关于项目的一组关键字(可选)
home: 项目home页面的URL (可选)
sources:
  - 项目源码的URL列表(可选)
dependencies: # chart 必要条件列表 (可选)
  - name: chart名称 (nginx)
    version: chart版本 ("1.2.3")
    repository: 仓库URL ("https://example.com/charts") 或别名 ("@repo-name")
    condition: (可选) 解析为布尔值的yaml路径,用于启用/禁用chart (e.g. subchart1.enabled )
    tags: # (可选)
      - 用于一次启用/禁用 一组chart的tag
    enabled: (可选) 决定是否加载chart的布尔值
    import-values: # (可选)
      - ImportValue 保存源值到导入父键的映射。每项可以是字符串或者一对子/父列表项
    alias: (可选) chart中使用的别名。当你要多次添加相同的chart时会很有用
maintainers: # (可选)
  - name: 维护者名字 (每个维护者都需要)
    email: 维护者邮箱 (每个维护者可选)
    url: 维护者URL (每个维护者可选)
icon: 用做icon的SVG或PNG图片URL (可选)
appVersion: 包含的应用版本(可选)。不需要是语义化的
deprecated: 不被推荐的chart (可选,布尔值)
annotations:
  example: 按名称输入的批注列表 (可选).
1.7.2 部分字段说明
  • apiVersion

    需要Helm 3的chart,apiVersion 字段应该是 v2。Chart支持之前apiVersion 设置为 v1 的Helm 版本, 并且在Helm 3中仍然可安装。

    v1v2的改变:

    1. dependencies字段定义了chart的依赖,针对于v1版本的chart被放置在分隔开的requirements.yaml文件中.

    2. type`字段, 用于识别应用和库类型的chart.

  • appVersion

    appVersion 字段与 version 字段无关。它是指定应用程序版本的一种方式。 比如drupal chart 可以是 appVersion: 8.2.1, 表示包含在chart中(默认)的Drupal 版本是 8.2.1。 这个字段是信息字段,对chart版本的计算没有影响

  • kubeVersion

    可选的 kubeVersion 字段可以在支持的Kubernetes版本上定义语义化版本约束,Helm 在安装chart时会验证这个版本约束, 并在集群运行不支持的Kubernetes版本时显示失败。

    版本约束可以包括空格分隔和比较运算符,比如:

    >= 1.13.0 < 1.15.0
    >= 1.13.0 < 1.14.0 || >= 1.14.1 < 1.15.0
    
  • dependencies

    当前chart依赖的其他chart会在dependencies字段定义为一个列表。

    dependencies:
    - name: apache
    version: 1.2.3
    repository: https://example.com/charts
    - name: mysql
    version: 3.2.1
    repository: https://another.example.com/charts
    • name字段是你需要的chart的名称

    • version字段是你需要的chart的版本

  • repository字段是chart仓库的完整URL。注意你必须使用helm repo add在本地添加仓库

    • 可以使用仓库的名称代替URL

1.8 helm 资源部署顺序及删除顺序:

此处官方文档并未说明依赖及Chart的的部署顺序,经过查找与代码分析,此处说明其部署顺序。

1.8.1 部署顺序

在执行helm install时,chart内的资源以及依赖项资源会被聚合在一个集合内,先按照类型排序,再按照名称进行排序,类型排序顺序代码如下:

// InstallOrder is the order in which manifests should be installed (by Kind).
//
// Those occurring earlier in the list get installed before those occurring later in the list.
var InstallOrder KindSortOrder = []string{
    "Namespace",
    "NetworkPolicy",
    "ResourceQuota",
    "LimitRange",
    "PodSecurityPolicy",
    "PodDisruptionBudget",
    "Secret",
    "ConfigMap",
    "StorageClass",
    "PersistentVolume",
    "PersistentVolumeClaim",
    "ServiceAccount",
    "CustomResourceDefinition",
    "ClusterRole",
    "ClusterRoleList",
    "ClusterRoleBinding",
    "ClusterRoleBindingList",
    "Role",
    "RoleList",
    "RoleBinding",
    "RoleBindingList",
    "Service",
    "DaemonSet",
    "Pod",
    "ReplicationController",
    "ReplicaSet",
    "Deployment",
    "HorizontalPodAutoscaler",
    "StatefulSet",
    "Job",
    "CronJob",
    "Ingress",
    "APIService",
}
1.8.2 删除顺序
// UninstallOrder is the order in which manifests should be uninstalled (by Kind).
//
// Those occurring earlier in the list get uninstalled before those occurring later in the list.
var UninstallOrder KindSortOrder = []string{
    "APIService",
    "Ingress",
    "Service",
    "CronJob",
    "Job",
    "StatefulSet",
    "HorizontalPodAutoscaler",
    "Deployment",
    "ReplicaSet",
    "ReplicationController",
    "Pod",
    "DaemonSet",
    "RoleBindingList",
    "RoleBinding",
    "RoleList",
    "Role",
    "ClusterRoleBindingList",
    "ClusterRoleBinding",
    "ClusterRoleList",
    "ClusterRole",
    "CustomResourceDefinition",
    "ServiceAccount",
    "PersistentVolumeClaim",
    "PersistentVolume",
    "StorageClass",
    "ConfigMap",
    "Secret",
    "PodDisruptionBudget",
    "PodSecurityPolicy",
    "LimitRange",
    "ResourceQuota",
    "NetworkPolicy",
    "Namespace",
}

源码见相关链接。

2、相关链接

发表评论

邮箱地址不会被公开。

Captcha Code