打包Kubernetes部署 - 编写Helm图表

导航到

在我任职InfluxData期间,甚至在之前,我一直在使用容器,偶尔也会用它们做一些有用的事情!这让我尝试了Kubernetes,我发现它非常实用。在我的工作中,我不得不部署一些代码,比如内部仪表板、演示、报告和数据收集。其中大部分代码都运行在我维护的一个小型Kubernetes集群上。

最初我开始运行Kubernetes时,我发现跟踪所有的*.yaml文件非常痛苦。尽管我有一个仓库,我会把部署的当前状态保存在那里,但这仍然是一个管理噩梦。我不得不从旧项目复制到新项目中开始,保持仓库的更新状态也很痛苦!我甚至写了一个小bash程序来帮助解决这个问题。

总的来说,当你运行Kubernetes时,你会很快发现自己处于一个管理部署文件很繁琐,并且往往不使用最佳部署实践的地方。

这就是helm的作用。

Helm 是用于 Kubernetes 的模板、打包和部署管理器。它就像 Kubernetes 的 apt-getbrew。它由运行在您的集群中的服务器组成,该服务器渲染您的模板 tiller,以及命令行界面 helm。如果您对 Helm 图表完全陌生,请滚动到本文的底部查看一些有用的参考资料。

通过这次经历,我觉得编写一个简单的 helm 图表的快速指南很有意义,重点是工作流程。如果您想跟着做,请下载 helm请注意:需要熟悉 Kubernetes 和 Docker。

1. 查找要部署的应用程序

我将部署一个存储在我的 Github 中的小型节点应用程序。 WEC 是一个小型 Node.js 应用程序,它订阅了 Wikipedia Recent Changes 通告。当它接收到事件时,它会解析并将事件插入到 InfluxDB 实例中。我使用出色的 node-influx/node-influx JavaScript 客户端将数据写入数据库。

您可以在 /server.js. 中查看代码。

2. Docker 化它!

在创建 helm 图表时,您首先需要一个可运行的镜像。我为这个服务器创建了一个 Dockerfile。下一步是将它推送到可以从您的集群访问的 Docker 仓库。我使用 gcr.io 是因为它在 Google Cloud 中易于使用。其他选项是 Docker HubQuay.io。您也可以将其推送到私有仓库。要从此仓库构建和推送镜像,请运行

$ cd wec
$ export ORG=myorg
$ export REGISTRY=gcr.io
$ docker build -t $REGISTRY/$ORG/wec:latest .
$ docker push $REGISTRY/$ORG/wec:latest

3. 创建 Helm 图表草稿

helm 命令行界面有一个用于创建图表草稿的命令。这使得项目启动变得快速简单。要为 WEC 创建图表文件,只需运行 helm create wec。将在当前目录中创建一个名为 wec 的目录,其中包含以下文件

$ tree wec/
wec/
??? Chart.yaml
??? charts
??? templates
?   ??? NOTES.txt
?   ??? _helpers.tpl
?   ??? deployment.yaml
?   ??? service.yaml
??? values.yaml

2 directories, 6 files
  • Chart.yaml 包含图表的元数据。您可以使用默认值。
  • charts/ 保留任何依赖图表。您现在可以删除此文件夹。当从组件图表构建图表时使用。
  • templates/ 保留所有模板文件!这是您工作的地方。
  • values.yaml 保留您想要在模板中引用的任何变量。这些是您向最终用户提供的配置选项。

我已经将图表移动到一个名为 chart 的目录中。

4. 编写您的 .yaml 文件

Helm 随附了 deployment.yamlservice.yaml。如果您需要在图表中使用其他类型的 Kubernetes 对象,请参阅 kubernetes/charts 仓库中的示例

Helm 使用 Golang 模板 作为模板语言。它将展开 {{}} 中的任何变量。作为图表作者,您有一些 内置对象 可在图表文件中进行参考(例如 {{ .Release.Namespace }}),以及 values.yaml 文件(例如 {{ .Values.database_name }})。此外,还有两组模板辅助函数: SprigGolang 模板 函数。

方便的是,对于 wec,我们只需要一个 部署wec 订阅了维基百科的源并接收数据,无需暴露端点!非常简单!我们还需要设置几个 ENV 来指向数据库,除此之外,默认文件看起来相同。我们希望在 values.yaml 文件中将数据库连接参数公开,以便轻松进行数据库配置。以下是我们的部署文件

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  # Template helpers are stored in /templates/_helpers.yaml
  name: {{ template "fullname" . }}
  labels:
    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
spec:
  replicas: {{ .Values.replicaCount }}
  template:
    metadata:
      labels:
        app: {{ template "fullname" . }}
    spec:
      containers:
      - name: {{ .Chart.Name }}
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
        imagePullPolicy: {{ .Values.image.pullPolicy }}
        env: 
        - name: DATABSE_NAME
          # `quote`-ing strings prevents type errors on yaml parsing
          value: {{ .Values.database_name | quote }}
        - name: INFLUX_URL
          value: {{ .Values.influx_url | quote }}
        - name: INFLUX_PORT
          value: {{ .Values.influx_port | quote }}
        - name: BATCH_SIZE
          value: {{ .Values.batch_size | quote }}
        - name: CONNECTION_URL
          value: {{ .Values.connection_url | quote }}

以及默认的 values.yaml

replicaCount: 1
image:
repository: gcr.io/influx-perf-testing/wec
tag: latest
pullPolicy: Always
database_name: 'wikipedia'
influx_url: "db-influxdb.prod"
influx_port: "8086"
batch_size: 10
connection_url: 'https://stream.wikimedia.org/rc'

5. 测试你的图表

现在我们已经编写了一个图表,我们需要看看它是否能产生正确的结果。幸运的是,Helm有一些实用工具可以帮助我们。要查看Helm将输出的部署文件,请运行以下命令

$ helm install --dry-run --debug --name test --namespace test chart/wec/

这种调试输出对于图表开发非常有用,并且是检查你的图表输出并检查错误的好方法,在尝试在集群上安装之前。

提示:如果你在没有 --dry-run --debug 的情况下运行 helm install,有时图表会出现错误,并且可能会留下一个幽灵式发布。你可以通过传递 --purge 选项给 helm delete {{ .Release.Name }} 来删除镜像。

6. 部署它!

当你准备好部署你的图表时,只需运行 helm install --name wec --namespace wec ./chart/wec/ 进行安装!

当你运行安装时,你应该会看到 NOTES.txt 的输出。这应该会给出如何进行健康检查或与部署交互的说明。

$ helm install --name wec --namespace wec ./chart/wec/
NAME: foo
LAST DEPLOYED: Fri Mar 10 09:04:37 2017
NAMESPACE: bar
STATUS: DEPLOYED

RESOURCES:
==> extensions/v1beta1/Deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
foo-wec 1 1 1 0 0s

NOTES:
Watch for you pods to come up by running the following command:

- kubectl get pods --namespace bar -l app=foo-wec -w

Check the logs on a running pod with the following:

- kubectl logs $(kubectl get pods --namespace bar -l app=foo-wec -o jsonpath='{ .items[0].metadata.name }')

一旦部署运行,你应该能够看到事件流入你的InfluxDB实例。然后你可以尽情探索数据!这是一个关于维基百科上机器人与人类编辑数量对比的图表(人类暂时领先)

7. 下一步

本指南只是对 helm 图表的一个简介。Helm还提供了钩子,以便在图表生命周期中的不同点运行作业。还有一个关于如何调试常见问题的优秀技巧和窍门指南。至于打包图表以进行分发和构建图表仓库,可能需要另一篇博客文章。如果你有更多问题,helm 社区在Kubernetes Slackhelm频道非常活跃。

如果你对InfluxData堆栈的实验更感兴趣,我们将在主图表仓库中提供我们所有产品的图表。

对于刚开始使用Helm图表的大家,这里有一些关于Helm图表如何工作的基础问题的答案。

什么是Helm图表?

Helm旨在帮助你在一个简单、易于使用的位置管理所有的Kubernetes应用程序——而Helm图表是帮助您定义、安装和升级您正在处理的最复杂应用程序的重要组成部分。图表不过是一系列文件,描述了一组相关的Kubernetes资源。

有问题的 Kubernetes Helm 图表目录名称将只是图表本身的名称,不包含任何版本信息。在该目录内部,Helm 将创建一个包含所有列出文件名的结构。其中之一将是 Chart.yaml 文件,这是图表正常工作的必需文件。在这里,您可以找到关于图表名称、API 版本、SemVer 2 版本、项目关键词列表等重要信息。您还可以包括其他可选信息,如项目的源代码 URL、维护人员的姓名和其他联系方式等。

为什么使用 Helm 图表?

按设计,Kubernetes Helm 图表可以轻松地创建、版本控制、共享和发布您的应用程序。它还旨在支持比单纯复制粘贴更高级的工作流程。一个图表可能用于部署简单的东西,也可能用于部署更复杂的东西,如包含服务器、缓存等的完整 Web 应用程序堆栈。

总的来说,Helm 图表作为文件创建,布局在一个非常特别的目录树中,这取决于您当时正在工作的项目。然后,根据最新更新的版本将它们打包成存档,此时您可以根据自己的需要以任何方式部署它们。

如何创建 Helm 图表

创建 Helm 图表的过程非常简单——您可以直接在命令行中完成。您只需使用以下命令

  • helm create [插入名称]

此单个命令将创建一个图表目录,以及图表内部使用的所有不同类型的常见文件和目录。但最重要的是,命令的最后一部分将是之后所有内容的给定名称。所以如果您想创建一个名为您当前正在工作的项目的 Helm 图表,您应在执行前将名称包括在命令的最后一部分。

如何更新已部署的 Helm 图表?

每当发布特定 Helm 图表的新版本,或者您想更改当前发布的配置时,您始终可以使用以下命令

  • helm upgrade

这将根据您提供的信息升级现有发布中的所有内容。需要注意的是,由于 Kubernetes 图表本质上可能非常大且复杂,Helm 总是会尝试执行最直接的升级。这意味着每次您运行该命令时,它都会更新自上次发布以来发生变化的内容。正因为如此,Helm 图表更新速度比您可能预期的要快得多。

请注意,如果您对任何更新不满意并想回滚到之前的版本,您也可以使用以下命令

  • helm rollback

Helm 图表的组成结构是什么?

虽然您的 Helm 图表的内部结构显然会根据部署而有所不同,但任何 Helm 图表树都将包含上述 .yaml 文件、模板文件和一个 notes.txt 文件。特别是 notes.txt 文件,每次您启动应用程序时都会在命令行上打印出来。

如何从 Docker 镜像创建 helm 图表

在您获取了适当的应用程序源代码并构建了 Docker 镜像之后,从该镜像创建新的 Helm 图表的过程很简单。您只需发布镜像并使用“helm create”命令。然后,您可以编辑 values.yaml 文件和编辑 deployment.yaml 文件,以适合您自己的变量。

请注意,为了发布您的Docker镜像,您需要将其上传到公共仓库。您可以选择的选项包括Google Container Registry、Amazon EC2 Container Registry、Azure Container Registry、Quay以及当然,Docker Hub。只需登录您选择的公共仓库,并将镜像发布到您的账户。一旦您确认镜像已存在于您的账户且在仪表板上可见,您就可以继续后续流程。

如何在Kubernetes中部署Helm图表

连接到您的Kubernetes集群后,可以使用以下命令部署您的Helm图表:

  • helm install [请在此处插入名称] ./helm-chart/go-k8s/

您应该将[请在此处插入名称]占位符替换为您实际的Helm图表发布名称。一旦部署了Helm图表,您将能够收集有关图表的大量有用信息,这些信息可以帮助您更好地管理未来的项目。一旦正确配置了数据库,您也将能够访问应用程序并继续对其进行工作。