打包 Kubernetes 部署 - 编写 Helm Chart

导航至

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

起初,当我开始运行 Kubernetes 时,我发现跟踪我所有的 *.yaml 文件很麻烦。即使我有一个仓库来保存我当前部署的状态,但这仍然是一场管理噩梦。我最终会从旧项目中复制来开始新项目,并且保持仓库更新是一件痛苦的事情!我甚至编写了一个快速的小型 bash 程序来帮助解决这个问题。

底线是,当您运行 Kubernetes 时,您很快就会发现部署文件的管理变得繁琐,并且通常不符合部署最佳实践。

进入 helm

Helm 是 Kubernetes 的模板化打包和部署管理器。可以将其视为 Kubernetes 的 apt-getbrew。它由一个在您的集群中运行并呈现您的模板的服务器 tiller,以及一个命令行界面 helm 组成。(如果您完全不熟悉 Helm chart,请滚动到本文底部以获取一些方便的参考内容)。

通过这次经历,我认为开发一个快速指南来编写一个简单的 helm chart 并专注于工作流程是有意义的。如果您想继续学习,请下载 helm请注意:需要熟悉 Kubernetes 和 Docker。

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

我将部署一个小型 node 应用程序,它一直放在我的 Github 上。WEC 是一个小型的 nodejs 应用程序,它订阅 Wikipedia 最近更改 feed。当它收到事件时,它会解析事件并将其插入到 InfluxDB 实例中。我正在使用优秀的 node-influx/node-influx Javascript 客户端来写入数据库。

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

2. Docker 化!

创建 helm chart 时,您首先需要一个要运行的镜像。我为此服务器创建了一个 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 chart

helm cli 有一个命令来桩出您的 chart。这使得快速轻松地启动项目。要为 WEC 创建 chart 文件,只需运行 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 包含关于 chart 的元数据。您可以使用默认值。
  • charts/ 包含任何依赖 chart。您现在可以删除此文件夹。这在从组件 chart 构建 chart 时使用。
  • templates/ 包含您的所有模板文件!这是您工作的地方。
  • values.yaml 包含您想要在模板中引用的任何变量。这些是您呈现给最终用户的配置选项。

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

4. 编写您的 .yaml 文件

Helm 从 deployment.yamlservice.yaml 开始。如果您需要在 chart 中使用其他类型的 Kubernetes 对象,则 kubernetes/charts 仓库有一些很好的示例

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

方便的是,对于 wec,我们只需要一个 deploymentwec 订阅 Wikipedia feed 并接收返回的数据,而无需暴露端点!非常容易!除了指向数据库之外,我们还需要设置几个 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. 测试您的 chart

现在我们已经编写了一个 chart,我们需要看看它是否产生正确的结果。幸运的是,helm 有一些实用程序可以帮助解决这个问题。要查看 helm 将输出的部署文件,请运行以下命令

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

此调试输出在 chart 开发中非常有用,并且是在尝试将其安装到集群之前检查 chart 输出并检查任何错误的好方法。

提示:如果您在没有 --dry-run --debug 的情况下运行 helm install,并且您的 chart 报错,有时会留下一个幽灵发布版本。您可以通过将 --purge 选项传递给 helm delete {{ .Release.Name }} 来删除镜像。

6. 部署它!

当您准备好部署您的 chart 时,只需运行 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 实例。然后您可以享受探索数据的乐趣!这是一张 Wikipedia 上机器人编辑与人工编辑数量的图表(人类暂时领先)

7. 后续步骤

本指南仅触及 helm chart 的表面。Helm 还提供 hooks 以在 chart 生命周期中的不同点启用运行作业。还有一个优秀的 技巧和窍门 指南,用于调试常见问题。以及 打包 chart 以进行分发和构建 chart 仓库可能是另一篇博客文章的主题。如果您有其他问题,helm 社区在 Kubernetes slackhelm 频道中很活跃。

如果您有兴趣进一步尝试 InfluxData 堆栈,我们在主 charts 仓库中提供了我们所有产品的 charts

对于那些刚刚开始使用 Helm chart 的人,这里有一些关于 Helm chart 如何工作的基本问题的答案。

什么是 helm chart?

Helm 旨在帮助您在一个简单易用的地方管理所有 Kubernetes 应用程序——而 Helm chart 是帮助您定义、安装甚至升级您正在处理的最复杂应用程序的重要组成部分。chart 仅仅是描述 Kubernetes 相关资源分组的文件集合。

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

为什么使用 Helm chart?

从设计上讲,Kubernetes Helm chart 使创建、版本控制、共享和发布您的应用程序变得容易。它还旨在支持比您仅通过简单的复制和粘贴完成的工作流程更高级的工作流程。单个 chart 可能用于部署简单的东西,或更复杂的东西,例如包含服务器、缓存等的 Web 应用程序堆栈。

总的来说,Helm chart 是作为文件创建的,这些文件以非常特定的目录树类型布局,这对于您当时正在处理的项目很有意义。然后,可以根据最近更新的版本将其打包到存档中,此时可以以您认为合适的任何方式进行部署。

如何创建 Helm chart

创建 Helm chart 的过程非常简单——您可以直接从命令行执行此操作。您只需使用以下命令

  • helm create [在此处插入名称]

这个简单的命令将创建一个 chart 目录,以及 chart 中要使用的所有不同的常用文件和目录。但最重要的是,命令的最后一部分将是之后所有内容的给定名称。因此,如果您想创建一个以您当前正在处理的项目的名称命名的 Helm chart,您应该在执行之前将其作为命令的最后一部分包含在内。

如何更新已部署的 helm chart?

每当发布特定 Helm chart 的新版本,或者您想对当前版本的配置进行任何更改时,您始终可以使用以下命令

  • helm upgrade

这将采用您现有的发布版本,并仅根据您提供的信息升级所有内容。同样重要的是要注意,由于 Kubernetes chart 本质上可能非常庞大和复杂,因此 Helm 将始终尝试执行最直接的升级。这意味着,每当您运行该命令时,它都会更新自上次发布以来已更改的内容。因此,Helm chart 更新的发生速度将远远超出您的预期。

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

  • helm rollback

helm chart 的结构是什么?

虽然您的 Helm chart 的内部结构显然会因部署而异,但任何 Helm chart 树都将包含前面提到的 .yaml 文件、模板文件和 notes.txt 文件。特别是 notes.txt 文件始终在您启动应用程序时在命令行上打印。

如何从 docker 镜像创建 helm chart

在您获得适当的应用程序源代码并构建了 docker 镜像后,从该镜像创建新的 Helm chart 的过程非常简单。您只需发布镜像并使用“helm create”命令。然后,您可以编辑 values.yaml 文件并根据需要编辑 deployment.yaml 文件以包含您自己的变量。

请注意,要发布您的 docker 镜像,您需要将其上传到公共注册表。您可以选择的选项包括 Google Container Registry、Amazon EC2 Container Registry、Azure Container Registry、Quay 和当然还有 Docker Hub。只需登录您选择的公共注册表并将镜像发布到您的帐户即可。确认镜像在您的帐户中并且在您的仪表板上可见后,您可以继续执行该过程的其余部分。

如何在 Kubernetes 中部署 helm chart

连接到 Kubernetes 集群后,您可以使用以下命令部署 Helm chart

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

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