chart的高级功能

除了chart元数据和模板集合之外,关于chart还有更多的内容。

chart可以有依赖项,值可以有模式,Helm有不同生命周期的钩子,你可以签署chart,等等。在本章中,除了模板之外你还将学习chart的其他元素。

1. chart依赖项

依赖项是软件包管理器及其软件包的常见元素。chart可以依赖于其他chart。这使得可以把服务封装在一个chart中,可以重用chart,也可以同时使用多个chart。

我们以一个安装流行博客软件WordPress的chart为例来说明依赖项。WordPress依赖于一个兼容MySQL的数据库来存储博客内容、用户信息和其他配置。

兼容MySQL的数据库可以被其他应用程序使用,也可以作为服务使用。将MySQL与WordPress结合使用的一种处理方法是将其清单放在WordPress chart中。

另一种处理方法是使用一个独立的MySQL chart,而WordPress chart依赖于它。

将一个MySQL兼容的数据库作为一个独立的chart使它能够被多个应用程序使用,并且可以独立地构建和测试数据库。

依赖项在Chart.yaml文件中指定。以下是chart中(该chart名为rocket)Chart.yaml文件的依赖项部分:

Chart.yaml

apiVersion: v2
name: rocket
description: Go fast!
version: 1.0.0
appVersion: 9.17.49
icon: https://wile.example.com/rocket.svg
keywords:
  - road runner
  - rocket
home: https://wile.example.com/
sources:
  - https://github.com/masterminds/learning-helm/blob/master/chapter6/rocket
maintainers:
  - name: ACME Corp
    email: maintainers@example.com
  - name: Wile E. Coyote
    email: wile@example.com
dependencies:
  - name: booster
    version: ^1.0.0
    repository: https://raw.githubusercontent.com/Masterminds/learning-helm/master/chapter6/repository/

着重看dependencies部分:

  • 存储库中依赖chart的名称。

  • chart的版本范围字符串。

  • 要从中检索chart的存储库。

要在指定范围内解析依赖项的最新版本并检索它,可以使用以下命令:

$ helm dependency update .

运行命令后,你将看到以下输出:

Update Complete. ⎈Happy Helming!⎈
Saving 1 charts
Downloading booster from repo https://raw.githubusercontent.com/Masterminds/learning-helm/master/chapter6/repository/
Deleting outdated charts

运行以上命令导致了一些步骤。 首先,Helm解析了最新版本的booster chart。它使用存储库中的元数据来知道哪些版本的chart可用。

从元数据和指定的版本范围中,Helm找到了最佳匹配。

解析的信息将写入Chart.lock文件。

在Chart.lock文件中包含的不是版本范围,而是要使用的依赖项的特定版本。

这对再现性很重要。

Chart.lock文件由Helm管理。下一次运行helm dep up(简写语法)时,来自用户的更改将被覆盖。

这类似于其他平台上的依赖项管理器的锁定文件操作。

一旦Helm知道要使用的特定版本,它就会下载相关chart并将其放入charts子目录。

重要的是依赖chart必须在charts目录中,因为这是Helm从中获取内容以渲染模板的地方。

chart可以以归档文件或目录形式存在于chart目录中。

当Helm从存储库下载它们时,会将它们存储在它们的归档形式中。

如果你有Chart.lock但是charts目录中没有内容,可以通过运行命令helm dependency build来重建charts目录。

这将使用锁文件检索已确定版本的依赖项。

一旦具备了依赖项,Helm将在运行helm installhelm upgrade等命令时渲染它们的资源。

指定依赖项时,可能还需要将配置从父chart或主chart传递到依赖chart。

如果我们回顾一下WordPress的例子,会发现这可以用来设置要使用的数据库的名称。

Helm提供了在父chart的值内执行此操作的方法。

在主chart的values.yaml文件中,可以使用依赖chart的名称创建一个新部分。

在此部分中,你可以设置要传入的值。只需设置要更改的chart,因为values.yaml文件中包含的依赖chart将用作默认值。

在rocket chart的values.yaml文件中有一个如下部分:

booster:
  image:
    tag: 9.17.49

Helm知道该部分是用于booster chart的。

在本例中,它将镜像标记设置为特定值。

依赖chart中的任何值都可以这样设置。运行helm install等命令时,可以使用标志来设置(例如,–set)依赖项的值 以及主chart的值。

如果同一chart上有两个依赖项,则可以选择在Chart.yaml文件上使用别名(alias)属性。

此属性适用于要在name、version和其他属性旁使用替代名称的每个依赖项。

使用alias,你可以为每个依赖项指定一个唯一的名称,以便在其他地方(如values.yaml文件)引用。

参考文献:

https://www.bookstack.cn/read/helm-3.7.1-zh/c181f93165dcab38.md

2. 库类型Chart

参考文献

https://www.bookstack.cn/read/helm-3.7.1-zh/f3f0a05a1bde5886.md

3. 钩子

Helm提供了一种在发布过程中钩住事件并采取行动的方法。如果你希望将一些动作捆绑为发布的一部分,这将非常有用。

例如,在升级过程中对数据库进行备份的能力,同时确保在升级Kubernetes资源之前进行备份。

钩子类似于常规模板,它们封装的功能是通过运行在Kubernetes集群中的容器以及应用程序的其他资源提供的。

钩子与其他资源的区别在于设置了特殊注解。当Helm看到helm.sh/hook注解时,它将资源用作钩子。

4. 向chart中添加测试

测试是软件开发不可或缺的一部分,Helm通过使用test钩子和Kubernetes资源提供了测试chart的能力。

这意味着测试在Kubernetes集群中与工作负载(可以访问chart安装的组件)一起运行。

除了Helm中内置的chart测试之外,Helm项目还提供了一个名为Chart Testing的测试工具。由于Chart Testing建立在Helm客户端的特性之上,因此我们将首先查看Helm客户端中内置的功能。

4.1 Helm测试

Helm有一个helm test命令,该命令在运行的chart实例上执行test钩子。

实现这些钩子的资源可以用来检查数据库能否访问、数据库模式是否正确就位、工作负载之间的连接是否工作以及其他操作细节。

如果测试失败,Helm将使用非零的退出代码退出,并向你提供失败的Kubernetes资源的名称。

非零的退出代码在与某些自动测试系统(以这种方式检测故障)配对时非常有用。当你拥有Kubernetes资源的名称时,可以查看日志以查看失败的内容。测试通常位于templates目录的tests子目录中。将测试放在这个目录中提供了一个有用的分离。这是一个约定,不是运行测试所必需的。

anvil/templates/tests/test-connection.yaml

apiVersion: v1
kind: Pod
metadata:
  name: "{{ include "anvil.fullname" . }}-test-connection"
  labels:
    {{- include "anvil.labels" . | nindent 4 }}
  annotations:
    "helm.sh/hook": test-success
spec:
  containers:
    - name: wget
      image: busybox
      command: ['wget']
      args: ['{{ include "anvil.fullname" . }}:{{ .Values.service.port }}']
  restartPolicy: Never

这个测试是在运行helm create时默认为Nginx创建的。它碰巧也可以对与booster应用程序的连接进行测试。这个简单的测试说明了测试的结构。

$ helm install myapp anvil/
NAME: myapp
LAST DEPLOYED: Sat May  7 05:05:27 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=anvil,app.kubernetes.io/instance=myapp" -o jsonpath="{.items[0].metadata.name}")
  echo "Visit http://127.0.0.1:8080 to use your application"

 $ helm test myapp
Pod myapp-anvil-test-connection pending
Pod myapp-anvil-test-connection pending
Pod myapp-anvil-test-connection pending
Pod myapp-anvil-test-connection succeeded
NAME: myapp
LAST DEPLOYED: Sat May  7 05:05:27 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE:     myapp-anvil-test-connection
Last Started:   Sat May  7 05:06:28 2022
Last Completed: Sat May  7 05:06:48 2022
Phase:          Succeeded
NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=anvil,app.kubernetes.io/instance=myapp" -o jsonpath="{.items[0].metadata.name}")
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl --namespace default port-forward $POD_NAME 8080:80

4.2 Chart Testing工具

Chart Testing可以用各种方式安装和使用。例如,你可以将其用作开发系统上的二进制应用程序或持续集成系统中的容器中的二进制应用程序。在项目页面(https://oreil.ly/sJXpR)上可了解有关使用和设置它的更多信息。

5. 安全注意事项

参考文档

https://helm.sh/zh/docs/topics/provenance/