官方文档首页

概述

任何应用程序的部署、版本控制和更新通常都需要规划和管理,以确保部署正确版本的软件库和配置设置,使部署的应用程序能够正常运行。

在这里插入图片描述

Helm 是 Kubernetes 的包管理器,它将应用程序的所有资源和部署信息组合到单个部署包中。

在这里插入图片描述

Helm 使用四个组件来管理 Kubernetes 群集上的应用程序部署。

  • Helm 客户端
  • Helm chart
  • Helm release
  • Helm 仓库 repositories,或者叫 repos

Helm 客户端

Helm 客户端是客户端安装的二进制文件,负责创建和提交部署 Kubernetes 应用程序所需的清单文件。 客户端负责用户与 Kubernetes 群集之间的交互。

Helm 客户端适用于所有主要操作系统,安装在客户端电脑上。

在这里插入图片描述

官方安装文档:

安装Helm

Chart

描述相关的一组 Kubernetes 资源的模板化部署包。 它包含为了让应用程序在 Kubernetes 群集上运行而为其生成和部署清单文件所需的所有信息。

Charts包含Chart.yaml文件和模板,默认值(values.yaml),以及相关依赖。

文件/文件夹 描述
Chart.yaml 一个 YAML 文件,其中包含有关chart的信息。
values.yaml chart的默认配置值。
templates/ 包含chart的部署模板的文件夹。
LICENSE 包含chart许可证的纯文本文件。
README.md 一个 Markdown 文件,其中包含有关如何使用chart的说明。
values.schema.json** 一个架构文件,用于在 values.yaml 文件上应用结构。
charts/ 一个文件夹,其中包含主chart的所有子chart。
crds/ 自定义资源定义。
templates/Notes.txt 包含模板用法说明的文本文件

Charts开发设计了良好定义的目录结构,并且打包成了一种称为 chart archive 文件格式。

Chart包

Chart包(chart archive)是被tar和gzip压缩(并且可选签名)的chart.

Chart依赖 (子chart)

Chart可以依赖于其他的chart。 依赖可能会以以下两种方式出现:

  • 软依赖: 如果另一个chart没有在集群中安装,chart可能会无法使用。Helm未对这个案例提供工具。 这个案例中,依赖会被分别管理。
  • 硬依赖: 一个chart可以包含 (在它的charts/目录中) 另一个它所依赖的chart。这个案例中, 安装chart的同时会安装所有依赖。chart和它的依赖会作为一个集合进行管理。

当一个chart(通过helm package)打包时所有的依赖都会和它绑定。

Release

Chart版本根据 语义化版本2.0 细则 发布。

Helm release是使用chart部署的应用程序或应用程序组。 每次安装chart时,都会在群集上创建应用程序的新实例。 每个实例都有一个release名称,可用于与特定的应用程序实例进行交互,Helm库会利用release 来跟踪这个安装。

在这里插入图片描述

版本号

单个版本号可以被升级多次。通过连续技术来跟踪升级发布版本。在第一次helm install之后,一个版本 会有 release number 1,每一次版本升级或回滚,版本号都会升级。

回滚

每一次发布会更新chart或者配置。当生成发布历史后,一次发布也可以被 rolled back 之前的发布版本号。 回滚使用 helm rollback 命令实现。

重要: 每一次回滚版本会生成一个新的发布版本号。

例:

操作 版本号
install release 1
upgrade release 2
upgrade release 3
rollback 1 release 4 (但使用release 1的配置)
Values (Values文件, values.yaml)

Values 提供了一种使用用户自己的信息覆盖模板默认值的方式。

Helm Chart是"参数化的", 这意味着chart开发者可以在安装时显式配置。比如说,chart可以暴露username字段, 允许为服务设置一个用户名。

这些可暴露的变量在Helm用语中称为 values

Values可以在 helm install时和helm upgrade时设置,直接把它们传值进来,也可以使用values.yaml文件设置。

Helm 仓库/存储库

Helm chart可以被存储在专用的HTTP服务器上,称之为 chart 仓库repositories,或者就叫 repos)。

chart仓库服务器就是一个简单的HTTP服务器,提供一个index.yaml 文件来描述一批chart, 并且提供每个chart的下载位置信息。(很多chart仓库同时提供chart和 index.yaml文件。)

在这里插入图片描述

Helm 项目承载了许多公共chart,并且存在你可以从中重复使用chart的许多存储库。

Helm客户端可以指向0个或多个chart仓库。默认没有配置仓库。Chart仓库可以随时使用helm repo add命令添加。

Helm 如何处理chart

Helm 客户端实现了一个基于 Go 语言的模板引擎,用于分析某个chart的文件夹中所有可用的文件。 模板引擎通过将chart的 templates/ 文件夹中的模板与 Chart.yamlvalues.yaml 文件中的值组合使用来创建 Kubernetes 清单文件。

在这里插入图片描述

在清单文件可用后,客户端可以安装、升级和删除在生成的清单文件中定义的应用程序。

定义 Chart.yaml 文件

Chart.yaml 是 Helm chart定义中所需的文件之一,它提供有关chart的信息。 该文件的内容包括三个必填字段和各种可选字段。

三个必填字段为:

  • apiVersion 此值是要使用的chart API 版本。 对于使用 Helm 3 的chart,请将版本设置为 v2
  • chart的 name
  • chart的 version。 版本号使用语义版本控制 2.0.0,并遵循 MAJOR.MINOR.PATCH 版本号表示法。
apiVersion: v2
name: nginx
description: A Helm chart for Kubernetes

# A chart can be either an 'application' or a 'library' chart.
#
# Application charts are a collection of templates that can be packaged into versioned archives
# to be deployed.
#
# Library charts provide useful utilities or functions for the chart developer. They're included as
# a dependency of application charts to inject those utilities and functions into the rendering
# pipeline. Library charts do not define any templates and therefore cannot be deployed.
type: application

# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 0.1.0

# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using.
# It is recommended to use it with quotes.
appVersion: "1.16.0"

上面的 type 字段可以创建chart来安装应用程序或库。 默认chart类型为 application,可将其设置为 library 以指定chart 来安装库。

许多可选字段可用来定制chart部署过程。 例如,你可以使用 dependencies 字段指定chart的其他要求。 例如,依赖于数据库的 Web 应用。

定义chart模板

Helm chart模板是描述不同部署类型清单文件的文件。 chart模板以 Go 模板语言编写,提供了用于自动创建 Kubernetes 对象清单文件的其他模板函数。

模板文件存储在chart的 templates/ 文件夹中,由模板引擎进行处理以创建最终的对象清单。

root@master01:~/nginx# ll templates/
total 40
drwxr-xr-x 3 root root 4096 Dec  9 04:11 ./
drwxr-xr-x 4 root root 4096 Dec 10 02:20 ../
-rw-r--r-- 1 root root 1826 Dec  9 04:07 deployment.yaml
-rw-r--r-- 1 root root 1762 Dec  9 04:07 _helpers.tpl
-rw-r--r-- 1 root root  910 Dec  9 04:07 hpa.yaml
-rw-r--r-- 1 root root 2075 Dec  9 04:07 ingress.yaml
-rw-r--r-- 1 root root 1739 Dec  9 04:07 NOTES.txt
-rw-r--r-- 1 root root  316 Dec  9 04:07 serviceaccount.yaml
-rw-r--r-- 1 root root  355 Dec  9 04:07 service.yaml
drwxr-xr-x 2 root root 4096 Dec  9 04:07 tests/

以deployment.yaml为例


root@master01:~/nginx# cat templates/deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "nginx.fullname" . }}
  labels:
    {{- include "nginx.labels" . | nindent 4 }}
spec:
  {{- if not .Values.autoscaling.enabled }}
  replicas: {{ .Values.replicaCount }}
  {{- end }}
  selector:
    matchLabels:
      {{- include "nginx.selectorLabels" . | nindent 6 }}
  template:
    metadata:
      {{- with .Values.podAnnotations }}
      annotations:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      labels:
        {{- include "nginx.selectorLabels" . | nindent 8 }}
    spec:
      {{- with .Values.imagePullSecrets }}
      imagePullSecrets:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      serviceAccountName: {{ include "nginx.serviceAccountName" . }}
      securityContext:
        {{- toYaml .Values.podSecurityContext | nindent 8 }}
      containers:
        - name: {{ .Chart.Name }}
          securityContext:
            {{- toYaml .Values.securityContext | nindent 12 }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /
              port: http
          readinessProbe:
            httpGet:
              path: /
              port: http
          resources:
            {{- toYaml .Values.resources | nindent 12 }}
      {{- with .Values.nodeSelector }}
      nodeSelector:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.affinity }}
      affinity:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.tolerations }}
      tolerations:
        {{- toYaml . | nindent 8 }}
      {{- end }}

Helm chart允许定义包含值占位符的清单模板,以避免对值进行硬编码。

注意 {{.Values.<property>}} 语法的使用。 此语法允许为每个自定义值创建占位符。

可以通过传递值参数或修改 values.yaml 文件来替代 Helm chart的值。

如:上面定义的:replicas: {{ .Values.replicaCount }},在使用 --set 参数的情况下运行 helm install,将部署模板的 replicaCount 设置为五个副本。

helm install --set replicaCount=5 webapp bitnami/nginx

手动创建 Helm chart的过程很繁琐。 创建 Helm chart的一种简单方法是使用 helm create 命令创建新的 Helm chart。 然后,根据你的应用程序的要求自定义自动生成的文件。

定义 values.yaml 文件

使用chart值自定义 Helm chart的配置。 在部署chart时,chart值可以是预定义的,也可以由用户提供。

预定义的 值是一个区分大小写的值,它是在 Helm chart的上下文中预定义的,不能由用户更改。 例如,可以使用 Release.Name 来引用发布或 Release.IsInstall 的名称,以检查当前操作是否是一个安装。可以使用预定义的值从 Chart.yaml 的内容中提取数据。 例如,如果想要检查chart的版本,则引用 Chart.Version
记住,只能引用已知字段。 可以将预定义的值视为常量,以在创建的模板中使用它们。

在模板文件中包含值名称的语法是通过将值名称括在双大括号中来完成的,例如 {{.Release.Name}}。 请注意,值名称前使用了句点。 以此方式使用句点时,句点将充当查找运算符,并指示该变量的当前作用域。

例如,下面的 YAML 代码段包含在值文件中定义的字典。

object:
  key: value

若要访问模板中的值,可以使用以下语法:

{{ .Values.object.key }}

在上面的deployment.yaml的例子中

apiVersion: apps/v1
...
    spec:
...
      containers:
...
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
...
# root@master01:~/nginx# cat values.yaml 
# Default values for nginx.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

replicaCount: 1

image:
  repository: nginx
  tag: v19.3
  pullPolicy: IfNotPresent

在模板引擎应用值后,最终结果将如以下示例所示:

apiVersion: apps/v1
...
    spec:
...
      containers:
...
          image: nginx:v19.3
          imagePullPolicy: IfNotPresent
...
Logo

开源、云原生的融合云平台

更多推荐