在Helm中设计图表的快速指南

Frank Eiffert



Helm的Unsplash是用于在Kubernetes中应用,更新和管理应用程序的强大工具。Helm社区创建了许多开源图表。您可以使用单个命令来部署Redis,Nginx或Prometheus Operator。它们附带了您需要的一切,例如Ingress。Mail.ru云解决方案



团队翻译了一篇文章,描述了一种快速创建基本图表,显示有用命令和共享最佳实践的方法。他没有讲解Go模板语言的各个方面,因为Helm文档中涵盖了大多数方面。本教程提供了更多抽象方面和想法,以改善您的工作流程。



创建基本的图表结构



从一个简单的命令开始,它将创建一个示例图表结构:



$ helm create basic
Creating basic
$ tree basic
basic/
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml


这就是创建可部署图表的全部过程。该图表使您可以部署具有所有必要组件的应用程序。如果查看values.yaml,可以看到此应用程序将部署Nginx。



展开图表就像创建一样容易:



$ helm install basic


模板团队是您最好的朋友



在安装之前和更改图表之后,应立即检查模板中的所有内容是否正确处理。



要检查将确切部署到集群的内容,请使用以下命令:



$ helm template basic


该命令将输出所有模板生成的每个YAML。如果只想查看一个模板的结果,请使用:



$ helm template basic -x templates/service.yaml


结果将是这样的:



---
# Source: basic/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: release-name-basic
  labels:
    app.kubernetes.io/name: basic
    helm.sh/chart: basic-0.1.0
    app.kubernetes.io/instance: release-name
    app.kubernetes.io/version: "1.0"
    app.kubernetes.io/managed-by: Tiller
spec:
  type: ClusterIP
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app.kubernetes.io/name: basic
    app.kubernetes.io/instance: release-name


要使用自定义值测试模板,请使用:



$ helm template basic -x templates/service.yaml -f \ mypath/tocustomvalues.yaml


可以使用以下命令在集群上测试生成的模板:



$ helm install basic --dry-run --debug


皮棉!



在提交到存储库之前,您可以再增加一个步骤来清楚地检查代码-线性分析(统计分析):



$ helm lint basic/
==> Linting basic/
[INFO] Chart.yaml: icon is recommended
1 chart(s) linted, no failures


头盔具有功能



如果查看图表模板目录,则可以看到_helpers.tpl。您可以在此处添加功能,这些功能将在整个图表中提供。一个示例函数可能如下所示:



{{/*
Expand the name of the chart.
*/}}
{{- define "basic.name" -}} 
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} 
{{- end -}}


模板中功能的使用通过功能指示include



app.kubernetes.io/name: {{ include "basic.name" . }}


元标签



Kubernetes的重要部分是正确使用标签。如果您正在使用Helm部署多个清单,这非常重要。要轻松添加标签以查找Helm管理的资源,可以使用自己的函数:



{{/*
Common labels
*/}}
{{- define "basic.labels" -}} 
app.kubernetes.io/name: {{ include "basic.name" . }}
helm.sh/chart: {{ include "basic.chart" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end -}}


现在,很容易在图表中添加一些标签:



apiVersion: v1
kind: Service
metadata:
  name: {{ include "basic.fullname" . }}
  labels:
{{ include "basic.labels" . | indent 4 }}
...


如果要查找使用此图表创建的服务,请使用以下命令:



$ kubectl get svc -l helm.sh/chart=basic-0.1.0


评论将拯救您



有两种类型的注释:



  • #是一个简单的注释,在处理后仍保留在结果YML中。
  • {{-/ * ... * /-}}是由模板引擎丢弃的注释。




# app files volume
        {{- /*
          App files are configmaps created by cloud-app-play-files chart.
          App files contains files specific for app and environment.
          App name should be same as in deployment of cloud-app-play-files chart.
        */ -}} 
        {{- if .Values.include.appDir }}
        - name: {{ $appName }}-files
          configMap:
            name: {{ $appName }}-files


模板输出将如下所示:



       # app files volume
       - name: app-notification-files
         configMap:
           name: app-notification-files


如您所见,生成的清单仅包含一个简单的类型注释。使用哪种类型取决于您。但是,如果要在YAML中定义更复杂的管道或依赖项,则模板注释很有用。



同样重要的是要记住,也必须分析以#开头的注释。如果将Go模板放入注释中,则会对其进行评估。因此,注释也可以是模板。



确保保留文档



图表文档是必不可少的,尤其是如果您要发布图表。创建和维护文档的最简单方法是使用名为helm-docs的Golang软件包使用它,您可以生成一个README.md,其中包含来自values.yaml和chart.yaml的值,版本和描述表,或者使用其他自定义文件。





取自https://github.com/norwoodj/helm-docs的示例



如您所见,在注释中添加带有-的名称将导致表中的一行。此外,该表还包含其他信息,例如图表说明,名称和版本。Helm-docs可以与棉绒一起集成到预提交中。这很容易做到:



$ helm-docs
INFO[2020-07-23T15:30:38+02:00] Found Chart directories [.]                 
INFO[2020-07-23T15:30:38+02:00] Generating README Documentation for chart .


子图表的魔力



当您的图表成为制造架构的怪物时,最好将一些图表组件分解为较小的组件。这些称为子图或子图。



子图表与主图表同时部署。可以在与主图表相同的values.yaml文件中提供子图表的值。您也可以从GitHub连接它们,但是对于本文,我将在本地创建一个子图。



要开始使用主图表依赖的新子图表,请在主图表文件夹内创建一个图表目录。然后创建一个基本图表:



$ mkdir charts
$ cd charts
$ helm create subbasic


要连接子图表,请更改主图表的定义:



apiVersion: v1
appVersion: "1.0"
description: A Helm chart for Kubernetes
name: basic
version: 0.1.0
dependencies:
  - name: subbasic       


现在,每次启动命令时helm install,不仅会扩展主图表,还会扩展子图表。要在部署到服务时覆盖子图表引用名称,请在主图表的values.yaml中添加以下命令:



subbasic:
 service:
   type: NodePort
 nameOverride: "jojo"


现在运行命令template,查看子图表服务的修改后的输出。服务类型将随名称一起更改:



---
# Source: basic/charts/subbasic/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: release-name-jojo
  labels:
    app.kubernetes.io/name: jojo
    helm.sh/chart: subbasic-0.1.0
    app.kubernetes.io/instance: release-name
    app.kubernetes.io/version: "1.0"
    app.kubernetes.io/managed-by: Tiller
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app.kubernetes.io/name: jojo
    app.kubernetes.io/instance: release-name


重要说明:子图表不能从父图表中获取值。



通常被遗忘的时刻



还有几点:



  1. 资源名称-最多63个字符。
  2. 资源名称只能是数字,小写字母,“-”或“。”。
  3. 图表大小-不超过1 MB如果您使用文件附件,这一点尤其重要。
  4. 该图表具有解析功能.tpl
  5. 您可以指定命令删除图表的部署后将保留的资源helm delete


好了!



现在您可以编写第一个图表。附加文件值得一提-图表不适合添加文件并将其结构保存在目录中。但是,在推荐页面上,您将找不到有关要绘制哪些内容和没有绘制哪些内容的信息。



头盔是一个相当年轻的工具,但潜力很大。不要忘记,集群上的棉绒,文档生成甚至是空运行模板都可以成为CI的一部分。Helm Workflow已经可用于GitHub了



祝好运!



还有什么要读的:



  1. 头盔装置及其陷阱
  2. 自动生成Helm中的秘密
  3. 我们在Telegram中围绕Kubernetes的频道



All Articles