15、Helm 工具使用及相关项目介绍

Helm 工具使用及相关项目介绍

1. 使用 GitHub Pages 作为 Chart 仓库

当你将 index.yaml 文件推送到 Git 仓库,并且网站使用最新提交处于活动状态时,就可以像使用其他任何 Chart 仓库一样使用它。操作步骤如下:
- 添加 GitHub Pages Chart 仓库到本地仓库:
- 若使用默认域名:

$ helm repo add gh-pages https://yourusername.github.io/mycharts/
- 若使用自定义域名:
$ helm repo add gh-pages https://example.com
2. 使用 Chart 仓库

拥有可用的 Chart 仓库后,就可以使用 Helm CLI 来利用它。 helm repo 顶级子命令下有几个用于处理 Chart 仓库的命令,下面详细介绍这些命令的使用方法。

2.1 添加仓库

使用 Chart 仓库的第一步是为其分配一个唯一的名称(例如 mycharts ),并将其添加到 Helm 已知的仓库列表中。首次添加仓库时,Helm 会从提供的 URL 获取 index.yaml 并将其本地存储。

$ helm repo add mycharts http://localhost:8080
"mycharts" has been added to your repositories

若运行 Python 示例,查看 Chart 仓库的日志,会看到对 GET /index.yaml 的传入请求:

127.0.0.1 - - [06/May/2020 15:31:07] "GET /index.yaml HTTP/1.1" 200 -
2.2 下载 Chart

要直接从仓库下载 Chart,使用 helm pull 命令:

$ helm pull mycharts/superapp

Helm 将根据语义版本控制自动找到最新版本,也可以指定版本:

$ helm pull mycharts/superapp --version 0.1.0

这将在工作区中生成一个新的 Chart 存档( .tgz 文件):

$ ls *.tgz
superapp-0.1.0.tgz

该存档可以直接安装:

$ helm install superapp-dev superapp-0.1.0.tgz

也可以直接从已添加的仓库安装 Chart:

$ helm install superapp-dev mycharts/superapp
2.3 列出仓库

了解系统中已经添加了哪些 Chart 仓库通常很有帮助,这有助于决定是否使用其中一个来下载 Chart 或从系统中完全删除其中一个。

$ helm repo list
NAME     URL
mycharts http://localhost:8080

若需要以机器可读的格式获取列表,可以使用 --output / -o 选项:
- 获取 YAML 格式列表:

$ helm repo list -o yaml
- name: mycharts
  url: http://localhost:8080
  • 获取 JSON 格式列表:
$ helm repo list -o json
[{"name":"mycharts","url":"http://localhost:8080"}]
2.4 更新仓库

新的 Chart 版本发布后,仓库所有者会将 .tgz 包添加到仓库存储中,并使用新条目更新 index.yaml 。为了获取仓库索引的最新版本,使用 helm repo update 命令:

$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "mycharts" chart repository
Update Complete. Happy Helming!

若运行 Python 示例,再次会在 Chart 仓库的输出日志中注意到对 GET /index.yaml 的传入请求。无论仓库索引的内容是否更改,该文件都会被获取并下载到缓存中,覆盖之前保存的版本。

2.5 删除仓库

要删除仓库,可以使用 helm repo remove 命令:

$ helm repo remove mycharts
"mycharts" has been removed from your repositories

这将删除 Helm 缓存中存储的该仓库的所有引用。

3. 实验性 OCI 支持

Helm 的 OCI 支持仍被认为是高度实验性的,尽管该领域的开发仍在进行中,但本节描述的语法可能很快会过时。

3.1 当前 Chart 仓库系统的挑战

当前的 Chart 仓库系统虽然易于使用,但存在一些关键挑战:
- 没有命名空间的概念,仓库的所有 Chart 都列在一个索引中。
- 没有细粒度的访问控制,要么可以访问仓库中的所有 Chart,要么一个都不能访问。
- 名称不同但原始内容完全相同的 Chart 包会被存储两次。
- 仓库索引可能变得非常大,导致 Helm 消耗大量内存。

3.2 OCI 简介

OCI 代表开放容器倡议,是一个开放的治理结构,旨在围绕容器格式和运行时创建开放的行业标准。其中一个标准是分发规范,它描述了用于分发容器映像的 HTTP API,该 API 是通用的,也可以应用于非容器映像的各种事物,如 Helm Chart。从 Helm 3.0.0 开始,添加了向基于 OCI 的容器注册表推送和拉取 Chart 的实验性支持。

3.3 OCI 分发规范的历史
  • 2013 年,Docker 推出了自己的容器引擎。
  • 2014 年,CoreOS 推出了 rkt,这是一个具有开放标准的替代引擎,Kubernetes Pod 的概念直接来自 rkt。
  • 2015 年,为了弥合分歧,开放容器倡议成立,以协作制定容器运行时和映像的开放标准。
  • 同时,Docker 也在开发其注册表 API 的 v2 版本, docker pull docker push 的底层 HTTP 调用基于此 API。Docker 注册表开始在行业中广泛采用,催生了如 Quay.io 等公司,云提供商如亚马逊网络服务也开始提供自己的托管选项。
  • 2018 年,Docker 将其注册表 v2 规范捐赠给 OCI,命名为分发规范,使更广泛的社区能够在 Docker 的基础上继续开发。该规范如今作为一个具有强大 API 的通用存储解决方案不断发展。
3.4 启用 OCI 支持

目前,要在环境中设置以下内容以启用 OCI 支持:

$ export HELM_EXPERIMENTAL_OCI=1
3.5 运行本地注册表

Docker Distribution 项目(也称为 Docker 注册表)是 Docker 注册表 v2 API 的原始实现,它开箱即支持 Helm Chart。若安装了 Docker,可以使用以下命令在容器中轻松运行端口 5000 上的本地注册表:

$ docker run -d --name oci-registry -p 5000:5000 registry

查看注册表日志(按 Ctrl-C 退出):

$ docker logs -f oci-registry

停止注册表:

$ docker rm -f oci-registry

Docker 注册表有几个与身份验证、存储等相关的配置选项。若要使用单个用户名 - 密码组合配置基本身份验证,首先创建一个 .htpasswd 文件:

$ htpasswd -cB -b auth.htpasswd myuser mypass

然后启动注册表,挂载 .htpasswd 文件并设置 REGISTRY_AUTH 环境变量:

$ docker run -d --name oci-registry -p 5000:5000 \
    -v $(pwd)/auth.htpasswd:/etc/docker/registry/auth.htpasswd \
    -e REGISTRY_AUTH="{htpasswd: {realm: localhost, path: /etc/docker/registry/auth.htpasswd}}" registry
3.6 登录注册表

要对注册表进行身份验证,使用 helm registry login 命令(系统会提示手动输入密码):

$ helm registry login -u myuser localhost:5000
Password:
Login succeeded

这会使用提供的凭据向注册表的 /v2/ 路径发出一个简单的 GET 请求,以确定凭据是否有效。如果有效,凭据将存储在 Helm 配置文件中。若启用了任何 Docker 凭据存储(如 macOS 上的 osxkeychain ),用户名和密码将安全地存储在那里。

3.7 登出注册表

要从系统中删除给定注册表的凭据,使用 helm registry logout 命令:

$ helm registry logout localhost:5000
Logout succeeded
3.8 在缓存中存储 Chart

在将 Chart 上传到注册表之前,必须先将其保存到缓存中,这会将 Chart 从正常状态转换为内容可寻址的块,并为其赋予唯一标识符。

$ helm chart save mychart/ localhost:5000/myrepo/mychart
ref:     localhost:5000/myrepo/mychart:2.7.0
digest:  1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617
size:    2.4 KiB
name:    mychart
version: 2.7.0
2.7.0: saved

也可以使用自定义标签,如 stable

$ helm chart save mychart/ localhost:5000/myrepo/mychart:stable
ref:     localhost:5000/myrepo/mychart:stable
digest:  1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617
size:    2.4 KiB
name:    mychart
version: 2.7.0
stable: saved
3.9 列出缓存中的 Chart

使用 helm chart list 命令显示当前存储在缓存中的所有 Chart:

$ helm chart list
REF                                               VERSION DIGEST  SIZE
localhost:5000/myrepo/mychart:2.7.0               2.7.0   84059d7 454 B
localhost:5000/stable/acs-engine-autoscaler:2.2.2 2.2.2   d8d6762 4.3 KiB
localhost:5000/stable/aerospike:0.2.1             0.2.1   4aff638 3.7 KiB
localhost:5000/stable/airflow:0.13.0              0.13.0  c46cc43 28.1 KiB
localhost:5000/stable/anchore-engine:0.10.0       0.10.0  3f3dcd7 34.3 KiB
3.10 从缓存中导出 Chart

若要提取缓存中 Chart 的源文件,必须先将其导出到本地目录,使用 helm chart export 命令:

$ helm chart export localhost:5000/myrepo/mychart:2.7.0
ref:     localhost:5000/myrepo/mychart:2.7.0
digest:  1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617
size:    2.4 KiB
name:    mychart
version: 2.7.0
Exported chart to mychart/

Chart 的名称将用于确定输出路径(例如 mychart/ )。

3.11 向注册表推送 Chart

将 Chart 推送到注册表(即上传)后,其他人就可以使用它。登录到注册表并将想要推送的 Chart 保存到缓存后,使用 helm chart push 命令推送 Chart:

$ helm chart push localhost:5000/myrepo/mychart:2.7.0
The push refers to repository [localhost:5000/myrepo/mychart]
ref:     localhost:5000/myrepo/mychart:2.7.0
digest:  1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617
size:    2.4 KiB
name:    mychart
version: 2.7.0
2.7.0: pushed to remote (1 layer, 2.4 KiB total)
3.12 从注册表拉取 Chart

Chart 推送到注册表后,其他用户可以拉取(即下载)它们。从注册表拉取 Chart 会将其放入本地缓存,使用 helm chart pull 命令:

$ helm chart pull localhost:5000/myrepo/mychart:2.7.0
2.7.0: Pulling from localhost:5000/myrepo/mychart
ref:     localhost:5000/myrepo/mychart:2.7.0
digest:  1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617
size:    2.4 KiB
name:    mychart
version: 2.7.0
Status: Downloaded newer chart for localhost:5000/myrepo/mychart:2.7.0
3.13 从缓存中删除 Chart

要从本地缓存中删除 Chart,使用 helm chart remove 命令:

$ helm chart remove localhost:5000/myrepo/mychart:2.7.0
2.7.0: removed
4. 相关项目

Helm 的 Chart 仓库系统催生了一系列开源工具,以进一步增强使用体验,以下介绍一些与 Chart 仓库相关的项目。

4.1 ChartMuseum
  • 项目主页:https://github.com/helm/chartmuseum
  • 简介:ChartMuseum 是一个简单的 Chart 仓库 Web 服务器,配置它指向包含 Chart 包的存储位置,它将动态生成 index.yaml ,还提供用于从存储中上传、查询和删除 Chart 包的 HTTP API。此外,它还有许多用于身份验证、多租户和缓存的配置设置,使其成为托管私有或内部 Chart 仓库用户的热门选择。
  • 支持的后端:
    • 阿里云 OSS 存储
    • 亚马逊 S3
    • 百度云 BOS 存储
    • DigitalOcean Spaces
    • etcd
    • 谷歌云存储
    • 本地文件系统
    • 微软 Azure Blob 存储
    • Minio
    • 网易云 NOS 存储
    • Openstack 对象存储
    • 甲骨文云基础设施对象存储
    • 腾讯云对象存储
4.2 Harbor
  • 项目主页:https://github.com/goharbor/harbor
  • 简介:Harbor 是一个功能齐全的注册表,具有额外的安全和管理功能。它为 Helm Chart 提供了一个 UI,并在后端利用 ChartMuseum 作为多租户 Chart 仓库,还支持 Helm 的实验性 OCI 功能集。与 Helm 类似,Harbor 是一个毕业的顶级 CNCF 项目。
4.3 Chart Releaser
  • 项目主页:https://github.com/helm/chart-releaser
  • 简介:Chart Releaser(简称 cr )是一个命令行工具,它利用 GitHub 版本来托管 Chart 包。它能够检测 Git 仓库中的 Chart,将它们打包,并将每个 Chart 作为工件上传到以唯一 Chart 版本命名的 GitHub 版本中。使用 cr 上传 Chart 后,该工具还可用于根据 GitHub 版本和相关工件的内容生成 index.yaml 文件,该仓库索引可以静态托管在 GitHub Pages 或其他地方。
4.4 S3 插件
  • 项目主页:https://github.com/hypnoglow/helm-s3
  • 简介:S3 插件是一个 Helm 插件,允许使用私有亚马逊 S3 存储桶作为 Chart 仓库。
4.5 GCS 插件
  • 项目主页:https://github.com/hayorov/helm-gcs
  • 简介:GCS 插件是一个 Helm 插件,允许使用私有谷歌云存储桶作为 Chart 仓库。
4.6 Git 插件
  • 项目主页:https://github.com/aslafy-z/helm-git
  • 简介:Git 插件是一个 Helm 插件,允许使用包含 Chart 源文件的 Git 仓库作为 Chart 仓库,它支持子路径、自定义引用以及 HTTPS 和 SSH Git URL。
5. Helm 插件和启动器

Helm 有很多功能和方法有助于在 Kubernetes 上交付应用程序,也可以自定义和扩展 Helm 提供的功能,下面介绍两种进一步增强和自定义 Helm 使用的方法:插件和启动器。

5.1 插件

Helm 插件是可以直接从 Helm CLI 访问的外部工具,允许在不修改 Helm 的 Go 源代码的情况下向 Helm 添加自定义子命令,这与其他工具(如 kubectl )中实现的插件系统设计类似。此外,下载器插件允许指定与 Chart 仓库通信的自定义协议,这在有自定义身份验证方法或需要以某种方式修改 Helm 从仓库获取 Chart 的方法时很有用。

5.2 安装第三方插件

许多第三方插件是开源的,并在 GitHub 上公开可用,其中许多插件使用 “helm - plugin” 标签/主题以便于查找。以下是一些在 GitHub 上可以找到的 Helm 插件示例:
- helm/helm - 2to3 :用于将 Helm 2 版本就地转换为 Helm 3 版本的插件。
- jkroepke/helm - secrets :用于有效管理 YAML 格式秘密的插件。
- maorfr/helm - backup :用于将 Helm 版本备份/恢复到文本文件的插件。
- karuppiah7890/helm - schema - gen :根据 values.yaml 生成 values.schema.json 的插件。
- hickeyma/helm - mapkubeapis :用于更新包含已弃用 Kubernetes API 的 Helm 版本元数据的插件。

找到要安装的插件后,获取其版本控制 URL,Git、SVN、Bazaar(Bzr)和 Mercurial(Hg)URL 目前都支持。例如,有一个用于管理 Helm 启动器的简单插件位于 https://github.com/salesforce/helm - starter ,其版本控制 URL 为 https://github.com/salesforce/helm - starter.git
安装插件,运行 helm plugin install 并将版本控制 URL 作为第一个参数:

$ helm plugin install https://github.com/salesforce/helm-starter.git
Installed plugin: starter

如果安装成功,就可以使用该插件:

$ helm starter --help
Fetch, list, and delete helm starters from github.
Available Commands:
    helm starter fetch GITURL       Install a bare Helm starter from Github
                                      (e.g., git clone)
    helm starter list               List installed Helm starters
    helm starter delete NAME        Delete an installed Helm starter
    --help                          Display this text

列出所有已安装的插件:

$ helm plugin list
NAME    VERSION DESCRIPTION
starter 1.0.0   This plugin fetches, lists, and deletes helm starters from github.

尝试更新插件:

$ helm plugin update starter
Updated plugin: starter

若要从系统中卸载插件:

$ helm plugin remove starter
Uninstalled plugin: starter

除非另有指定,Helm 在安装插件时将使用 Git 仓库默认分支上的 plugin.yaml 和源代码。若要指定要使用的 Git 标签,在安装时使用 --version 标志:

$ helm plugin install https://github.com/databus23/helm-diff.git --version v3.1.0

也可以直接从 tarball URL 安装插件,Helm 将下载 tarball 并将其解压缩到插件目录:

$ helm plugin install https://example.com/archives/myplugin-0.6.0.tar.gz

还可以从本地目录安装插件,Helm 将创建指向原始文件的符号链接:

$ helm plugin install /path/to/myplugin
$ ls -la "$(helm env HELM_PLUGINS)"
total 8
drwxrwxr-x 2 myuser myuser 4096 Jul  3 21:49 .
drwxrwxr-x 4 myuser myuser 4096 Jul  1 21:38 ..
lrwxrwxrwx 1 myuser myuser   21 Jul  3 21:49 myplugin -> /path/to/myplugin
5.3 启动器

启动器扩展了使用 helm create 为不同类型的应用程序生成新 Helm Chart 的可能性。例如,可能有一个为内部微服务构建的 Helm Chart,它非常适合作为未来微服务的示例,可以将该 Chart 转换为启动器,每次开始具有类似要求的新项目时都可以使用它。通过利用插件和启动器,可以在 Helm 的开箱即用功能基础上构建,以简化和自动化日常工作流程任务。

Helm 工具使用及相关项目介绍(续)

6. 插件使用流程总结

为了更清晰地展示 Helm 插件的使用流程,下面通过一个 mermaid 流程图来呈现:

graph LR
    A[查找插件] --> B[获取版本控制 URL]
    B --> C{选择安装方式}
    C -->|版本控制 URL| D[运行 helm plugin install URL]
    C -->|tarball URL| E[运行 helm plugin install tarball_URL]
    C -->|本地目录| F[运行 helm plugin install 本地目录路径]
    D --> G{安装是否成功}
    E --> G
    F --> G
    G -->|是| H[使用插件]
    G -->|否| I[检查问题并重新安装]
    H --> J[使用 helm plugin list 查看已安装插件]
    J --> K{是否需要更新插件}
    K -->|是| L[运行 helm plugin update 插件名]
    K -->|否| M{是否需要卸载插件}
    L --> M
    M -->|是| N[运行 helm plugin remove 插件名]
    M -->|否| O[结束操作]
7. 启动器使用示例

假设我们已经有一个适合作为启动器的 Helm Chart,以下是将其转换为启动器并使用的步骤:

7.1 转换为启动器

将现有的 Helm Chart 转换为启动器,通常只需要将其整理好,确保结构清晰,关键文件完整。

7.2 使用启动器创建新 Chart

使用 helm create 命令结合启动器来创建新的 Helm Chart:

$ helm create --starter <启动器名称> <新 Chart 名称>

例如,如果启动器名称为 my - microservice - starter ,新 Chart 名称为 new - microservice ,则命令如下:

$ helm create --starter my-microservice-starter new-microservice
8. 不同存储后端选择对比

ChartMuseum 支持多种存储后端,为了方便选择,下面列出不同后端的特点对比表格:
| 存储后端 | 优点 | 缺点 | 适用场景 |
| ---- | ---- | ---- | ---- |
| 阿里云 OSS 存储 | 高可靠性,易于与阿里云其他服务集成 | 依赖阿里云环境 | 在阿里云上部署的项目 |
| 亚马逊 S3 | 全球广泛使用,成熟稳定 | 可能存在跨区域费用 | 国际化项目 |
| 本地文件系统 | 简单易用,无需额外配置 | 扩展性差,不适合多节点共享 | 测试环境或小型项目 |
| 谷歌云存储 | 高性能,与谷歌云服务集成良好 | 依赖谷歌云环境 | 在谷歌云平台上的项目 |
| 微软 Azure Blob 存储 | 与微软 Azure 生态融合好 | 对非 Azure 用户不友好 | 在 Azure 平台上的项目 |

9. 常见问题及解决方法

在使用 Helm 工具及相关项目的过程中,可能会遇到一些常见问题,下面是一些问题及对应的解决方法列表:

9.1 插件安装失败
  • 问题描述 :运行 helm plugin install 命令时提示安装失败。
  • 可能原因 :网络问题、版本控制 URL 错误、权限不足等。
  • 解决方法 :检查网络连接,确认版本控制 URL 正确,确保有足够的权限进行安装操作。
9.2 启动器无法使用
  • 问题描述 :使用 helm create --starter 命令时,提示找不到启动器。
  • 可能原因 :启动器未正确安装或名称输入错误。
  • 解决方法 :检查启动器是否已正确安装,确认启动器名称输入无误。
9.3 从注册表拉取 Chart 失败
  • 问题描述 :运行 helm chart pull 命令时,提示拉取失败。
  • 可能原因 :注册表地址错误、未登录注册表、网络问题等。
  • 解决方法 :检查注册表地址是否正确,使用 helm registry login 命令登录注册表,检查网络连接。
10. 总结

Helm 作为 Kubernetes 上强大的包管理工具,通过其丰富的功能和相关项目,为用户提供了便捷的 Chart 管理和部署体验。使用 GitHub Pages 作为 Chart 仓库,结合 OCI 支持,能够满足不同场景下的需求。ChartMuseum、Harbor 等相关项目进一步扩展了 Helm 的功能,而插件和启动器则允许用户根据自身需求进行定制和扩展。在使用过程中,了解各种操作命令和工具的特点,以及掌握常见问题的解决方法,能够帮助我们更高效地使用 Helm 工具,简化和自动化日常工作流程任务。

通过以上对 Helm 工具及相关项目的介绍,希望能帮助读者更好地理解和应用 Helm,提升在 Kubernetes 上的应用部署效率。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值