Helm仓库的使用

本节介绍如何创建和使用 Helm仓库。 chart库是存储chart包的地方,软件包都存储在helm仓库中。

官方 chart 库由 Helm Charts 维护 。当然,我们也H可以轻松创建和运行自己的 chart 库。本教程,你能学到如何创建一个helm的仓库。


创建一个 chart 仓库

chart库是带有一个 index.yaml 文件和任意个打包 chart 的 HTTP 服务器。我们可以将一个压缩文件上传到一个http服务器

注意: 对于 Helm 2.0.0,chart库没有任何内部认证。

由于 chart 库可以是任何可以提供 YAML 和 tar 文件的web服务器,只要能从浏览器上打开或者下载,就可以了。

仓库只需要是可以回答GET请求的HTTP服务器,因此我们可以使用nginx、tomcat、node.js作为服务器都可以。


Helm仓库的结构

Helm仓库的结构由打包的 chart 和一个名为的index.yaml的文件组成, index.yaml 其中包含helm库中所有 chart 的索引。

例如,Helm仓库的文件结构 https://example.com/charts 如下所示,只需要把这些放到一个http服务器中就可以了。

charts/
  |
  |- index.yaml
  |
  |- alpine-0.1.2.tgz
  |
  |- alpine-0.1.2.tgz.prov

这种情况下,索引文件包含有关一个 chart(Alpine chart)的信息,并提供该 chart 的下载 URL https://example.com/charts/alpine-0.1.2.tgz

不要求 chart 包与 index.yaml 文件位于同一台服务器上 。但是,放在一起这样做通常是最简单的。

helm仓库是不是很简单呢?现在我们只需要知道index.yaml的格式就可以了。


index.yaml索引文件

索引文件是一个叫做 yaml 文件 index.yaml。它包含一些关于包的元数据,包括 chart 的 Chart.yaml 文件的内容。一个有效的 chart 库必须有一个索引文件。索引文件包含有关 chart 库中每个 chart 的信息。helm repo index 命令将根据包含打包的 chart 的给定本地目录生成索引文件。

下面一个索引文件的例子:

apiVersion: v1
entries:
  alpine:
    - created: 2016-10-06T16:23:20.499814565-06:00
      description: Deploy a basic Alpine Linux pod
      digest: 99c76e403d752c84ead610644d4b1c2f2b453a74b921f422b9dcb8a7c8b559cd
      home: https://k8s.io/helm
      name: alpine
      sources:
      - https://github.com/helm
      urls:
      - https://technosophos.github.io/tscharts/alpine-0.2.0.tgz
      version: 0.2.0
    - created: 2016-10-06T16:23:20.499543808-06:00
      description: Deploy a basic Alpine Linux pod
      digest: 515c58e5f79d8b2913a10cb400ebb6fa9c77fe813287afbacf1a0b897cd78727
      home: https://k8s.io/helm
      name: alpine
      sources:
      - https://github.com/helm
      urls:
      - https://technosophos.github.io/tscharts/alpine-0.1.0.tgz
      version: 0.1.0
  nginx:
    - created: 2016-10-06T16:23:20.499543808-06:00
      description: Create a basic nginx HTTP server
      digest: aaff4545f79d8b2913a10cb400ebb6fa9c77fe813287afbacf1a0b897cdffffff
      home: https://k8s.io/helm
      name: nginx
      sources:
      - https://github.com/helm/charts
      urls:
      - https://technosophos.github.io/tscharts/nginx-1.1.0.tgz
      version: 1.1.0
generated: 2016-10-06T16:23:20.499029981-06:00

可以使用 helm serve 启动本地服务器,在本地测试所有内容。

$ helm serve --repo-path ./charts
Regenerating index. This may take a moment.
Now serving you on 127.0.0.1:8879

上面启动了一个本地 web 服务器,为它在 ./charts 目录找到的 chart 提供服务。serve 命令将在启动过程中自动生成一个 index.yaml 文件。

helm server 是在本地启动命令的简单方法,只需要一个目录就行。


创建helm仓库的另外方法

本部分介绍了提供 helm库的几种方法。


ChartMuseum

Helm 提供了一个 open-source Helm 库服务叫 ChartMuseum ,我们可以自己安装这个程序.

ChartMuseum 支撑多种云存储后端. 配置它指向你存放 chart 包的目录或者 bucket,index.yaml 文件会自动动态生成。

它也可以通过 Helm chart 部署:

helm install stable/chartmuseum

命令执行后,出现以下提示:

NAME:   wrapping-rat
LAST DEPLOYED: Thu Mar 12 14:44:19 2020
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Deployment
NAME                      READY  UP-TO-DATE  AVAILABLE  AGE
wrapping-rat-chartmuseum  0/1    1           0          0s

==> v1/Pod(related)
NAME                                       READY  STATUS    RESTARTS  AGE
wrapping-rat-chartmuseum-5fd89f599f-mkx6d  0/2    Init:0/1  0         0s

==> v1/Secret
NAME                      TYPE    DATA  AGE
wrapping-rat-chartmuseum  Opaque  0     0s

==> v1/Service
NAME                      TYPE       CLUSTER-IP  EXTERNAL-IP  PORT(S)   AGE
wrapping-rat-chartmuseum  ClusterIP  10.1.71.87  <none>       8080/TCP  0s


NOTES:
 ** Please be patient while the chart is being deployed **

Get the ChartMuseum URL by running:

  export POD_NAME=$(kubectl get pods --namespace default -l "app=chartmuseum" -l "release=wrapping-rat" -o jsonpath="{.items[0].metadata.name}")
  echo http://127.0.0.1:8080/
  kubectl port-forward $POD_NAME 8080:8080 --namespace default

安装上面的提示,你就能访问启动的ChartMuseum了。


使用docker安装ChartMuseum

也可以使用docker安装ChartMuseum,Docker image:

docker run --rm -it \
  -p 8080:8080 \
  -v $(pwd)/charts:/charts \
  -e DEBUG=true \
  -e STORAGE=local \
  -e STORAGE_LOCAL_ROOTDIR=/charts \
  chartmuseum/chartmuseum

你可以将它加到本地存储库:

helm repo add chartmuseum http://localhost:8080

ChartMuseum 提供其他特性, 如 chart 上传的 API. 查看更多信息 README.

如果想老师完整介绍一下chartmuseum的使用,可以给我们留言哦。


普通的 web 服务器

要配置普通 Web 服务器来服务 Helm chart,只需执行以下操作:

  • 将索引和 chart 置于服务器目录中
  • 确保 index.yaml 可以在没有认证要求的情况下访问
  • 确保 yaml 文件的正确内容类型(text/yamltext/x-yaml

例如,如果想在 $WEBROOT/charts 以外的目录为 chart 提供服务,请确保 Web 根目录中有一个 charts/ 目录,并将索引文件和 chart 放入该文件夹内。

普通web服务的搭建,我们这里就不举例了,如果有需要可以留言给老师。


创建一个helm仓库,并更新索引

现在已有一个helm存储库,那么怎么维护他呢?

让我们上传一个 软件包(chart) 和一个索引文件到存储库。chart 库中的 chart 必须正确打包(helm package chart-name/)和版本(遵循 SemVer 2 标准)。

好了,我们正式开始创建一个仓库。

准备好打包 chart 后,创建一个新目录,并将打包 chart 移动到该目录。

$ helm package docs/examples/alpine/
$ mkdir fantastic-charts
$ mv alpine-0.1.0.tgz fantastic-charts/
$ helm repo index fantastic-charts --url https://fantastic-charts.storage.googleapis.com

最后一条命令采用刚创建的本地目录的路径和远程 chart 库的 URL,并在给定的目录路径中生成 index.yaml

https://fantastic-charts.storage.googleapis.com这是你要讲index.yaml和tgz包放到的位置,如果你要放在本地,127.0.0.1也是可以的。

现在可以使用同步工具或手动将 chart 和索引文件上传到 chart 库。如果使用 Google 云端存储,请使用 gsutil 客户端查看此示例工作流程。对于 GitHub,可以简单地将 chart 放入适当的目标分支中。


新添加 chart 添加到现有存储库

每次将新 chart 添加到存储库时,都必须重新生成索引。helm repo index 命令将 index.yaml 从头开始完全重建该文件,但仅包括它在本地找到的 chart。

可以使用 --merge 标志向现有 index.yaml 文件增量添加新 chart(在使用远程存储库(如 GCS)时,这是一个很好的选择)。运行 helm repo index --help 以了解更多信息,

确保上传修改后的 index.yaml 文件和 chart。如果生成了出处 provenance 文件,也要上传。


与他人分享 chart

准备好分享 chart 时,只需让别人知道存储库的 URL 是什么就可以了。

他们将通过 helm repo add [NAME] [URL] 命令将仓库添加到他们的 helm 客户端,并可以起一个带有任何想用来引用仓库的名字。

$ helm repo add fantastic-charts https://fantastic-charts.storage.googleapis.com
$ helm repo list
fantastic-charts    https://fantastic-charts.storage.googleapis.com

如果 chart 由 HTTP 基本认证支持,也可以在此处提供用户名和密码:

$ helm repo add fantastic-charts https://fantastic-charts.storage.googleapis.com --username my-username --password my-password
$ helm repo list
fantastic-charts    https://fantastic-charts.storage.googleapis.com

** 注意:** 如果存储库不包含有效信息库 index.yaml 文件,则添加不会成功。

之后,用户将能够搜索 chart。更新存储库后,他们可以使用该 helm repo update 命令获取最新的 chart 信息。

原理是helm repo addhelm repo update命令获取index.yaml文件并将它们存储在 $HELM_HOME/repository/cache/目录中。这是helm search 找到有关chart的信息的地方。