14、Helm Chart 仓库:搭建与使用指南

Helm Chart 仓库:搭建与使用指南

1. 引言

在软件管理中,包的共享和分发至关重要。Helm 通过 Chart 仓库实现了包的分发,它类似于 Debian 包仓库、Fedora 包数据库或 Comprehensive Perl Archive Network (CPAN),是简单的 HTTP(S) 网络服务,用户可以从中发现和下载可用的 Chart。

2. Chart 仓库索引

2.1 索引文件概述

所有的 Chart 仓库都包含一个特殊的索引文件 index.yaml ,它列出了所有可用的 Chart 及其下载位置。以下是一个简单的 index.yaml 文件示例:

apiVersion: v1
entries:
  superapp:
  - apiVersion: v2
    appVersion: 1.16.0
    created: "2020-04-27T17:46:52.60919-05:00"
    description: A Helm chart for Kubernetes
    digest: cd1f8d949aeb6a7a3c6720bfe71688d4add794881b78ad9715017581f7867db4
    name: superapp
    type: application
    urls:
    - superapp-0.1.0.tgz
    version: 0.1.0
generated: "2020-04-27T17:46:52.607943-05:00"

这个示例中只列出了一个名为 superapp 的 Chart,版本为 0.1.0

2.2 更真实的索引示例

通常,Chart 仓库会列出多个 Chart 及其所有可用版本,方便用户下载特定版本的 Chart。以下是一个更真实的示例:

apiVersion: v1
entries:
  cert-manager:
  - apiVersion: v1
    appVersion: v0.14.2
    created: "2020-04-08T11:38:26.281Z"
    description: A Helm chart for cert-manager
    digest: 160e1bd4906855b91c8ba42afe10af2d0443b184916e4534175890b1a7278f4e
    home: https://github.com/jetstack/cert-manager
    icon: https://raw.githubusercontent.com/jetstack/cert-manager/master/logo/logo.png
    keywords:
    - cert-manager
    - kube-lego
    - letsencrypt
    - tls
    maintainers:
    - email: dev@jetstack.io
      name: jetstack-dev
    name: cert-manager
    sources:
    - https://github.com/jetstack/cert-manager
    urls:
    - charts/cert-manager-v0.14.2.tgz
    version: v0.14.2
  - apiVersion: v1
    appVersion: v0.14.1
    created: "2020-03-25T18:30:16.354Z"
    description: A Helm chart for cert-manager
    digest: 629150400487df41af6c7acf2a3bfd8e691f657a930bc81e1dcf3b9d23329baf
    home: https://github.com/jetstack/cert-manager
    icon: https://raw.githubusercontent.com/jetstack/cert-manager/master/logo/logo.png
    keywords:
    - cert-manager
    - kube-lego
    - letsencrypt
    - tls
    maintainers:
    - email: dev@jetstack.io
      name: jetstack-dev
    name: cert-manager
    sources:
    - https://github.com/jetstack/cert-manager
    urls:
    - charts/cert-manager-v0.14.1.tgz
    version: v0.14.1
  tor-proxy:
  - apiVersion: v1
    created: "2018-11-16T09:23:13.538Z"
    description: A Helm chart for Kubernetes
    digest: 1d2fd11e22ba58bf0a263c39777f0f18855368b099aed7b03123ca91e55343e4
    name: tor-proxy
    urls:
    - charts/tor-proxy-0.1.1.tgz
    version: 0.1.1
generated: "2020-04-23T17:43:41Z"

这个示例展示了两个可用的 Chart: cert-manager tor-proxy ,共有三个可用版本。

2.3 索引文件的其他特性

  • 远程链接 :通常,Chart 存档( .tgz 文件)和索引文件位于同一位置,但索引文件也可以链接到不同域名的远程位置。例如:
...
  - appVersion: 2.10.1
    created: 2019-01-14T23:25:37.125126859Z
    description: A simple, powerful publishing platform that allows you to share your stories with the world
    digest: dcadf39f81253a9a016fcab1b74aba1d470e015197152affdaeb1b337221cc5c
    engine: gotpl
    home: http://www.ghost.org/
    icon: https://bitnami.com/assets/stacks/ghost/img/ghost-stack-220x234.png
    keywords:
    - ghost
    - blog
    - http
    - web
    - application
    - nodejs
    - javascript
    maintainers:
    - email: containers@bitnami.com
      name: Bitnami
    name: ghost
    sources:
    - https://github.com/bitnami/bitnami-docker-ghost
    urls:
    - https://charts.example.com/ghost-6.2.3.tgz 
    version: 6.2.3
...
  • 其他字段 :每个条目中还包含 Chart 的元数据,如 description ,以及一个 digest 字段,包含 Chart 存档的 Secure Hash Algorithm (SHA - 256) 校验和。此外,顶级字段 generated 描述了索引的创建时间(RFC 3339 格式), apiVersion 描述了索引的 API 版本,目前只有 v1 版本。

2.4 生成索引

可以使用自定义程序或手动编写来生成仓库索引,Helm 也提供了内置功能来生成索引。操作步骤如下:
1. 创建一个空目录 charts/ 作为 Chart 仓库的根目录:

$ mkdir -p charts/
  1. charts/ 目录中生成仓库索引:
$ helm repo index charts/
  1. 查看生成的 index.yaml 文件:
$ cat charts/index.yaml
apiVersion: v1
entries: {}
generated: "2020-04-28T09:55:29.517285-05:00"

由于 charts/ 目录中还没有任何 Chart,所以 entries 为空。
4. 创建一个示例 Chart 并打包到 charts/ 目录中:

$ helm create superapp
Creating superapp
$ helm package superapp/ --destination charts/
Successfully packaged chart and saved it to: charts/superapp-0.1.0.tgz
  1. 再次生成索引:
$ helm repo index charts/
$ cat charts/index.yaml
apiVersion: v1
  entries:
    superapp:
    - apiVersion: v2
      appVersion: 1.16.0
      created: "2020-04-28T10:12:22.507943-05:00"
      description: A Helm chart for Kubernetes
      digest: 46f9ddeca12ec0bc257a702dac7d069af018aed2a87314d86b230454ac033672
      name: superapp
      type: application
      urls:
      - superapp-0.1.0.tgz
      version: 0.1.0
generated: "2020-04-28T10:12:22.507289-05:00"

现在可以看到 superapp Chart 已列在 entries 部分。

2.5 向现有索引添加内容

在某些场景(如 CI/CD)中,可能只有一个现有的 index.yaml 文件和一个新打包的 Chart 存档。可以使用 --merge 选项来基于现有索引添加内容。操作步骤如下:
1. 创建一个新的工作目录 workspace/

$ mkdir -p workspace/
  1. 将现有的索引文件复制到 workspace/ 目录中,并命名为 index-old.yaml
$ cp charts/index.yaml workspace/index-old.yaml
  1. 创建另一个 Helm Chart 并打包到 workspace/ 目录中:
$ helm create duperapp
Creating duperapp
$ helm package duperapp/ --destination workspace/
Successfully packaged chart and saved it to: workspace/duperapp-0.1.0.tgz
  1. 运行以下命令,根据 index-old.yaml 中的现有条目和 workspace/ 目录中的 .tgz 文件创建一个新的 index.yaml 文件:
$ helm repo index workspace/ --merge workspace/index-old.yaml
  1. workspace/ 目录中的文件移动到 charts/ 目录中,覆盖旧的索引文件:
$ mv workspace/duperapp-0.1.0.tgz charts/
$ mv workspace/index.yaml charts/
  1. 查看新的索引文件:
$ cat charts/index.yaml
apiVersion: v1
entries:
  duperapp:
  - apiVersion: v2
    appVersion: 1.16.0
    created: "2020-04-28T11:34:26.780267-05:00"
    description: A Helm chart for Kubernetes
    digest: 30ea14a4ce92e0d1aea7626cb30dfbac68a87dca360d0d76a55460b004d62f52
    name: duperapp
    type: application
    urls:
    - duperapp-0.1.0.tgz
    version: 0.1.0
  superapp:
  - apiVersion: v2
    appVersion: 1.16.0
    created: "2020-04-28T10:12:22.507943-05:00"
    description: A Helm chart for Kubernetes
    digest: 46f9ddeca12ec0bc257a702dac7d069af018aed2a87314d86b230454ac033672
    name: superapp
    type: application
    urls:
    - superapp-0.1.0.tgz
    version: 0.1.0
generated: "2020-04-28T11:34:26.779758-05:00"

需要注意的是,如果多个系统同时进行合并操作,可能会出现竞态条件,导致索引中缺少一个或多个 Chart。可以通过确保该过程仅同步执行(例如,由单个 CI 作业负责为仓库创建 index.yaml )来缓解这个问题,也可以使用动态 Web 服务器来生成 index.yaml 的内容。

3. 设置 Chart 仓库

3.1 静态特性

Chart 仓库的一个优点是它们可以是完全静态的,这意味着可以将文件放在简单的 Web 服务器(如 Apache 或 Nginx)后面直接提供服务,甚至可以使用对象存储提供商(如 Amazon S3)。当客户端请求 index.yaml 时,服务器端不需要进行大量计算,静态 Web 服务器只需打开文件并将原始内容返回给客户端。

3.2 使用 Python 创建简单的 Chart 仓库

为了创建一个本地测试仓库,可以使用 Python 的内置静态 Web 服务器。操作步骤如下:
1. 按照前面“生成索引”部分的说明创建 charts/ 目录,包含 index.yaml superapp-0.1.0.tgz duperapp-0.1.0.tgz 文件。
2. 启动本地 Web 服务器:
- 使用 Python 3:

$ ( cd charts/ && python3 -m http.server --bind 127.0.0.1 8080 )
- 使用 Python 2:
$ ( cd charts/ && python -m SimpleHTTPServer 8080 )

需要注意的是,Python 2 版本的命令会监听所有接口( 0.0.0.0 ),而 Python 3 版本只监听回环接口( 127.0.0.1 )。在运行此命令之前,请确保 charts/ 目录中包含所需的文件。
3. 在另一个终端窗口中,使用 curl 测试获取 index.yaml 文件:

$ curl -sO http://localhost:8080/index.yaml
$ ls *.yaml
index.yaml
  1. 验证是否可以获取 Chart 存档:
$ curl -sO http://localhost:8080/superapp-0.1.0.tgz
$ curl -sO http://localhost:8080/duperapp-0.1.0.tgz
$ ls *.tgz
duperapp-0.1.0.tgz 
superapp-0.1.0.tgz

如果 curl 命令成功,则表示 Chart 仓库已准备好与 Helm 一起使用。

3.3 保护 Chart 仓库

在许多情况下,可能希望限制对 Chart 仓库的访问或维护用户访问资源的审计跟踪。Helm 内置支持用户对受基本认证或 mTLS 保护的 Chart 仓库进行身份验证。

3.3.1 基本认证

Chart 仓库可以通过基本访问认证(Basic Auth)进行保护,这要求用户提供有效的用户名/密码组合才能访问服务器上的资源。服务器在处理请求之前会先检查 Authorization 头,例如:

Authorization: Basic bXl1c2VyOm15cGFzcw== 

其中,不透明字符串是用户名 + “:” + 密码的 Base64 编码。由于 Authorization 头的内容未加密,强烈建议在提供基本认证凭据时同时使用 HTTPS。在首次添加仓库时,可以在命令行中提供用户名和密码组合,指示 Helm 在对该仓库进行请求时使用基本认证:

$ helm repo add mycharts http://localhost:8080 --username myuser --password mypass
"mycharts" has been added to your repositories
3.3.2 客户端证书

大多数通过 HTTPS 进行的客户端 - 服务器通信允许客户端根据服务器提供的 SSL 证书验证服务器的身份。使用相互 TLS 认证(mTLS)时,服务器还可以根据客户端在 TLS 握手期间提供的单独 SSL 证书验证客户端的身份。以下是一个简单的 Nginx 服务器配置,为 Chart 仓库启用 mTLS:

events { }
http {
    server {
        root /chartrepo;
        listen 443 ssl;
        server_name charts.example.com;
        ssl_certificate /certs/server.crt; 
        ssl_certificate_key /certs/server.key; 
        ssl_client_certificate /certs/client-ca.pem; 
        ssl_verify_client on;
        proxy_set_header SSL_CLIENT_CERT $ssl_client_cert;
    }
}

获取客户端证书的步骤如下:
1. 生成新的私钥和证书签名请求(CSR):

$ mkdir -p ~/client-certs/
$ cd ~/client-certs/
$ openssl genrsa -out francis.key 4096
$ openssl req -new -key francis.key -out francis.csr

在生成 CSR 时,提示输入“Common Name”时必须输入一个值,建议使用能够标识客户端的值(例如,“francis”)。其他字段可以留空,但建议填写。
2. 使用服务器上配置的证书颁发机构( client-ca.pem )和关联的私钥( client-ca.key ),从 CSR 生成新的客户端证书:

$ openssl x509 -req -in francis.csr -CA /certs/client-ca.pem -CAkey /certs/client-ca.key -out francis.crt -sha256
  1. 在添加新的 Chart 仓库时,通过指定 --cert-file --key-file 选项使用该证书进行身份验证:
$ helm repo add client-cert-repo https://charts.example.com --cert-file ~/client-certs/francis.crt --key-file ~/client-certs/francis.key
"client-cert-repo" has been added to your repositories

如果服务器使用自签名证书,可以指定 --ca-file 选项指向受信任的证书或证书束:

$ helm repo add client-cert-repo-selfsigned https://charts.example.com --cert-file ~/client-certs/francis.crt --key-file ~/client-certs/francis.key --ca-file /certs/server.crt
"client-cert-repo-selfsigned" has been added to your repositories

需要注意的是, --cert-file --key-file --ca-file 使用的路径都存储在与仓库关联的 Helm 缓存中,不要移动这些文件,否则未来对仓库的请求将因缺少客户端身份验证所需的文件而失败。

3.4 真实世界示例:使用 GitHub Pages

GitHub 提供了一个免费的静态托管解决方案 GitHub Pages,如果不介意将 Chart 公开,GitHub Pages 是托管 Chart 仓库的一个不错选择,且无需成本。此外,GitHub Pages 允许使用自定义域名指向 GitHub Pages 站点。以下是使用 GitHub Pages 设置公共 Helm Chart 仓库的步骤:

3.4.1 创建新的 Git 仓库
  1. 登录 GitHub 后,点击屏幕右上角,选择“New repository”。
  2. 为 Git 仓库命名,这里使用 mycharts 作为示例。
  3. 确保选择将仓库标记为“Public”,这是使用 GitHub Pages 的前提条件。
  4. 选择“Initialize this repository with a README”,以便立即克隆仓库。
  5. 可以选择一个许可证(如“MIT License”),表示该仓库中的源代码可以免费使用和重新使用。
  6. 点击“Create repository”。

需要注意 Helm 仓库(Chart 仓库)和托管在 GitHub 上的 Git 仓库(用于版本控制)之间的区别。

3.4.2 启用 GitHub Pages
  1. 导航到仓库的 Settings 面板。
  2. 在主设置中,向下滚动到 GitHub Pages 部分。
  3. 对于 Source 选项,选择“main branch”,这将使 GitHub 在每次向主分支进行新提交时重新部署 GitHub Pages 站点。
  4. 点击 Save。
3.4.3 可选:使用自定义域名
  1. GitHub Pages 站点默认以 github.io 域名的子域名形式托管,例如 https://yourusername.github.io/mycharts/
  2. 如果有自定义域名,可以在域名注册商的 Web 控制台(或用于设置权威名称服务器的服务控制台)中创建一个新的 DNS 记录,指向 yourusername.github.io 。如果使用根域名,使用 ALIAS 记录类型;如果使用子域名,使用 CNAME 记录类型。
  3. 返回 GitHub 中的仓库设置,在“Custom domain”输入框中输入为其设置了 DNS 记录的域名。
  4. GitHub 可能需要长达一小时的时间为域名生成 TLS 证书。证书准备好后,应在设置中看到类似“Your site is published at https://example.com.” 的文本。看到此文本后,确保启用 Enforce HTTPS 选项,以便仅通过 HTTPS 访问站点。
3.4.4 添加 Chart 仓库文件
  1. 在 GitHub UI 中找到仓库的克隆 URL,将新的 GitHub 仓库克隆到本地系统:
$ git clone git@github.com:youruser/mycharts.git
Cloning into 'mycharts'...
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 7 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (7/7), done.
  1. 进入 Git 仓库目录:
$ cd mycharts/
  1. 创建一个名为 pineapple 的 Chart,将其打包到仓库根目录,并创建一个 index.yaml 文件:
$ mkdir -p src/
$ helm create src/pineapple
Creating src/pineapple
$ helm package src/pineapple/
Successfully packaged chart and saved it to: /home/user/mycharts/pineapple-0.1.0.tgz
$ helm repo index .
  1. 提交并将所有新文件推送到 GitHub:
$ git add .
$ git commit -m "Add pineapple chart v0.1.0"
[main 9bba19d] Add pineapple chart v0.1.0
 13 files changed, 395 insertions(+)
 create mode 100644 index.yaml
 create mode 100644 pineapple-0.1.0.tgz
 create mode 100644 src/pineapple/.helmignore
 create mode 100644 src/pineapple/Chart.yaml
 create mode 100644 src/pineapple/templates/NOTES.txt
 create mode 100644 src/pineapple/templates/_helpers.tpl
 create mode 100644 src/pineapple/templates/deployment.yaml
 create mode 100644 src/pineapple/templates/hpa.yaml
 create mode 100644 src/pineapple/templates/ingress.yaml
 create mode 100644 src/pineapple/templates/service.yaml
 create mode 100644 src/pineapple/templates/serviceaccount.yaml
 create mode 100644 src/pineapple/templates/tests/test-connection.yaml
 create mode 100644 src/pineapple/values.yaml
$ git push origin main
Enumerating objects: 20, done.
Counting objects: 100% (20/20), done.
Delta compression using up to 12 threads
Compressing objects: 100% (17/17), done.

通过以上步骤,就可以使用 GitHub Pages 轻松设置一个公共 Helm Chart 仓库。

4. Helm 3 的 OCI 支持的下一代 Chart 仓库

Helm 3 增加了实验性的 Open Container Initiative (OCI) 支持,这一前沿功能允许用户将 Helm Chart 与容器镜像一起存储在容器注册表中。与传统的 Chart 仓库不同,OCI 支持为 Helm Chart 的存储和分发带来了新的灵活性和标准化。

4.1 OCI 支持的优势

  • 与容器生态系统集成 :OCI 是容器行业的标准,将 Helm Chart 存储在容器注册表中可以更好地与现有的容器化工作流程集成。
  • 标准化存储 :遵循 OCI 标准意味着 Helm Chart 的存储和分发方式更加统一,便于不同工具和平台之间的互操作性。
  • 版本控制和标签 :容器注册表提供了强大的版本控制和标签功能,可以更方便地管理不同版本的 Helm Chart。

4.2 使用 OCI 支持的基本步骤

虽然这是实验性功能,但使用 OCI 支持存储和使用 Helm Chart 的基本步骤如下:
1. 推送 Chart 到 OCI 注册表

$ helm chart save ./mychart oci://myregistry.example.com/myrepo/mychart:v1.0.0
$ helm chart push oci://myregistry.example.com/myrepo/mychart:v1.0.0
  1. 从 OCI 注册表拉取 Chart
$ helm chart pull oci://myregistry.example.com/myrepo/mychart:v1.0.0
  1. 安装拉取的 Chart
$ helm install myrelease oci://myregistry.example.com/myrepo/mychart:v1.0.0

4.3 注意事项

  • 实验性功能 :目前 OCI 支持仍处于实验阶段,可能存在一些不稳定或未完善的地方。
  • 注册表配置 :需要确保使用的容器注册表支持 OCI 标准,并且已经正确配置了访问权限。

5. Helm 生态系统中与 Chart 仓库相关的项目

Helm 生态系统中有许多与 Chart 仓库相关的项目,这些项目可以帮助用户更高效地管理和使用 Chart 仓库。

5.1 ChartMuseum

  • 功能概述 :ChartMuseum 是一个开源的 Helm Chart 仓库服务器,它可以动态生成 index.yaml 文件,避免了手动生成索引的繁琐过程。
  • 使用场景 :在 CI/CD 环境中,多个系统同时更新索引时可能会出现竞态条件,ChartMuseum 可以解决这个问题,确保索引的一致性。
  • 部署示例 :可以使用 Docker 快速部署 ChartMuseum:
$ docker run -d -p 8080:8080 -e DEBUG=true -e STORAGE=local -e STORAGE_LOCAL_ROOTDIR=/charts chartmuseum/chartmuseum

5.2 Harbor

  • 功能概述 :Harbor 是一个企业级的容器镜像和 Helm Chart 注册表,提供了安全、高性能的存储和分发解决方案。
  • 使用场景 :适用于需要对 Chart 仓库进行严格访问控制和审计的企业环境。
  • 部署示例 :可以按照 Harbor 的官方文档进行部署,通常需要进行一系列的配置和初始化步骤。

5.3 其他项目

除了 ChartMuseum 和 Harbor,还有一些其他的项目也提供了与 Chart 仓库相关的功能,如 Helm Hub(一个公共的 Helm Chart 仓库聚合平台)等。

6. 总结

Helm Chart 仓库是 Helm 生态系统中不可或缺的一部分,它为 Helm Chart 的共享和分发提供了便利。通过本文的介绍,我们了解了 Chart 仓库的索引文件、如何生成和更新索引、如何设置和保护 Chart 仓库,以及一些与 Chart 仓库相关的项目。

6.1 关键要点回顾

  • Chart 仓库索引 index.yaml 文件是 Chart 仓库的核心,它列出了所有可用的 Chart 及其下载位置。
  • 生成和更新索引 :可以使用 Helm 的内置功能生成和更新索引,也可以使用 --merge 选项向现有索引添加内容。
  • 设置和保护仓库 :Chart 仓库可以是静态的,也可以使用 Python 等工具创建简单的仓库。同时,可以使用基本认证和 mTLS 保护仓库的访问。
  • OCI 支持 :Helm 3 的 OCI 支持为 Chart 的存储和分发带来了新的可能性。
  • 相关项目 :Helm 生态系统中有许多与 Chart 仓库相关的项目,可以根据不同的需求选择使用。

6.2 未来展望

随着 Helm 和容器技术的不断发展,Chart 仓库的功能和性能也将不断提升。OCI 支持的成熟和更多相关项目的出现将进一步完善 Helm 生态系统,为用户提供更加便捷、安全和高效的 Chart 管理体验。

6.3 流程图总结

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;

    A(创建 Chart 仓库):::process --> B(生成索引文件):::process
    B --> C(设置仓库服务):::process
    C --> D{保护仓库?}:::process
    D -->|是| E(基本认证或 mTLS):::process
    D -->|否| F(公开访问):::process
    E --> G(使用仓库):::process
    F --> G
    H(OCI 支持):::process --> I(推送 Chart 到 OCI 注册表):::process
    I --> J(拉取和使用 Chart):::process
    K(相关项目):::process --> L(ChartMuseum):::process
    K --> M(Harbor):::process
    K --> N(其他项目):::process

通过以上的总结和流程图,我们可以更清晰地看到 Helm Chart 仓库的整个生命周期和相关技术点。希望本文能够帮助你更好地理解和使用 Helm Chart 仓库。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值