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
重要说明:子图表不能从父图表中获取值。
通常被遗忘的时刻
还有几点:
- 资源名称-最多63个字符。
- 资源名称只能是数字,小写字母,“-”或“。”。
- 图表大小-不超过1 MB。如果您使用文件附件,这一点尤其重要。
- 该图表具有解析功能
.tpl
。 - 您可以指定命令删除图表的部署后将保留的资源
helm delete
。
好了!
现在您可以编写第一个图表。附加文件值得一提-图表不适合添加文件并将其结构保存在目录中。但是,在推荐页面上,您将找不到有关要绘制哪些内容和没有绘制哪些内容的信息。
头盔是一个相当年轻的工具,但潜力很大。不要忘记,集群上的棉绒,文档生成甚至是空运行模板都可以成为CI的一部分。Helm Workflow已经可用于GitHub了。
祝好运!
还有什么要读的: