使用 Helm Charts

目录

1. 理解 Helm

Helm 是一个包管理工具,简化了在 Alauda 容器平台集群上部署应用程序和服务的过程。Helm 使用一种称为 charts 的打包格式。一个 Helm chart 是描述 Kubernetes 资源的文件集合。在集群中创建一个 chart 会生成一个称为 release 的 chart 运行实例。每次创建 chart,或升级或回滚 release 时,都会创建一个增量修订版本。

1.1. 主要特性

Helm 提供以下功能:

  • 在 chart 仓库中搜索大量的 charts
  • 修改现有的 charts
  • 使用 Kubernetes 资源创建自己的 charts
  • 打包应用程序并将其作为 charts 共享

1.2. 目录

目录基于 Helm 构建,提供全面的 Chart 分发管理平台,扩展了 Helm CLI 工具的局限性。该平台使开发人员能够通过用户友好的界面更方便地管理、部署和使用 charts。

术语定义

术语定义备注
应用程序目录Helm Charts 的一站式管理平台
Helm Charts应用程序打包格式
HelmRequestCRD。定义部署 Helm Chart 所需的配置模版应用
ChartRepoCRD。对应于 Helm charts 仓库模版仓库
ChartCRD。对应于 Helm Charts模版

1.3 理解 HelmRequest

在 Alauda 容器平台中,Helm 部署主要通过一种称为 HelmRequest 的自定义资源进行管理。这种方法扩展了标准 Helm 的功能,并将其无缝集成到 Kubernetes 原生资源模型中。

HelmRequest 与 Helm 的区别

标准 Helm 使用 CLI 命令来管理 releases,而 Alauda 容器平台使用 HelmRequest 资源来定义、部署和管理 Helm charts。主要区别包括:

  1. 声明式与命令式:HelmRequest 提供了一种声明式的 Helm 部署方法,而传统的 Helm CLI 是命令式的。
  2. Kubernetes 原生:HelmRequest 是一种直接与 Kubernetes API 集成的自定义资源。
  3. 持续协调:Captain 持续监控并协调 HelmRequest 资源与其期望状态。
  4. 多集群支持:HelmRequest 支持通过平台在多个集群之间进行部署。
  5. 平台功能集成:HelmRequest 可以与其他平台功能集成,例如应用程序资源。
HelmRequest 与应用程序集成

HelmRequest 和应用程序资源在概念上有相似之处,用户可能希望将它们统一视图。该平台提供了一种机制,将 HelmRequest 同步为应用程序资源。

用户可以通过添加以下注释来标记 HelmRequest 以作为应用程序进行部署:

alauda.io/create-app: "true"

启用此功能后,平台 UI 将显示额外的字段和链接到相应的应用程序页面。

部署工作流

通过 HelmRequest 部署 charts 的工作流包括:

  1. 用户 创建或更新 HelmRequest 资源
  2. HelmRequest 包含 chart 引用和要应用的值
  3. Captain 处理 HelmRequest 并创建 Helm Release
  4. Release 包含已部署的资源
  5. Metis 监控带有应用程序注释的 HelmRequests,并将其同步到应用程序
  6. Application 提供已部署资源的统一视图
组件定义
  • HelmRequest:描述所需 Helm chart 部署的自定义资源定义
  • Captain:处理 HelmRequest 资源并管理 Helm releases 的控制器(源代码可在 https://github.com/alauda/captain 获取)
  • Release:已部署的 Helm chart 实例
  • Charon:监控 HelmRequests 并创建相应应用程序资源的组件
  • Application:已部署资源的统一表示,提供额外的管理能力
  • Archon-api:负责平台内特定高级 API 功能的组件

2 通过 CLI 部署 Helm Charts 作为应用程序

2.1 工作流概述

准备 chart → 打包 chart → 获取 API 令牌 → 创建 chart 仓库 → 上传 chart → 上传相关镜像 → 部署应用程序 → 更新应用程序 → 卸载应用程序 → 删除 chart 仓库

2.2 准备 Chart

Helm 使用一种称为 charts 的打包格式。一个 chart 是描述 Kubernetes 资源的文件集合。单个 chart 可用于部署从简单的 pod 到复杂的应用程序堆栈的任何内容。

请参考官方文档:Helm Charts Documentation

示例 chart 目录结构:

nginx/
├── Chart.lock
├── Chart.yaml
├── README.md
├── charts/
│   └── common/
│       ├── Chart.yaml
│       ├── README.md
│       ├── templates/
│       │   ├── _affinities.tpl
│       │   ├── _capabilities.tpl
│       │   ├── _errors.tpl
│       │   ├── _images.tpl
│       │   ├── _ingress.tpl
│       │   ├── _labels.tpl
│       │   ├── _names.tpl
│       │   ├── _secrets.tpl
│       │   ├── _storage.tpl
│       │   ├── _tplvalues.tpl
│       │   ├── _utils.tpl
│       │   ├── _warnings.tpl
│       │   └── validations/
│       │       ├── _cassandra.tpl
│       │       ├── _mariadb.tpl
│       │       ├── _mongodb.tpl
│       │       ├── _postgresql.tpl
│       │       ├── _redis.tpl
│       │       └── _validations.tpl
│       └── values.yaml
├── ci/
│   ├── ct-values.yaml
│   └── values-with-ingress-metrics-and-serverblock.yaml
├── templates/
│   ├── NOTES.txt
│   ├── _helpers.tpl
│   ├── deployment.yaml
│   ├── extra-list.yaml
│   ├── health-ingress.yaml
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── ldap-daemon-secrets.yaml
│   ├── pdb.yaml
│   ├── server-block-configmap.yaml
│   ├── serviceaccount.yaml
│   ├── servicemonitor.yaml
│   ├── svc.yaml
│   └── tls-secrets.yaml
├── values.descriptor.yaml
├── values.schema.json
└── values.yaml

关键文件描述:

  • values.descriptor.yaml(可选):与 ACP UI 一起使用,以显示用户友好的表单
  • values.schema.json(可选):验证 values.yaml 内容并呈现简单的 UI
  • values.yaml(必需):定义 chart 部署参数

2.3 打包 Chart

使用 helm package 命令打包 chart:

helm package nginx
# 输出: 成功打包 chart 并将其保存到: /charts/nginx-8.8.0.tgz

2.4 获取 API 令牌

  1. Alauda Container Platform 中,点击右上角的头像 => 个人资料
  2. 点击 添加 API 令牌
  3. 输入适当的描述和剩余有效期
  4. 保存显示的令牌信息(仅显示一次)

2.5 创建 Chart 仓库

通过 API 创建本地 chart 仓库:

curl -k --request POST \
--url https://$ACP_DOMAIN/catalog/v1/chartrepos \
--header 'Authorization:Bearer $API_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
  "apiVersion": "v1",
  "kind": "ChartRepoCreate",
  "metadata": {
    "name": "test",
    "namespace": "cpaas-system"
  },
  "spec": {
    "chartRepo": {
      "apiVersion": "app.alauda.io/v1beta1",
      "kind": "ChartRepo",
      "metadata": {
        "name": "test",
        "namespace": "cpaas-system",
        "labels": {
          "project.cpaas.io/catalog": "true"
        }
      },
      "spec": {
        "type": "Local",
        "url": null,
        "source": null
      }
    }
  }
}'

2.6 上传 Chart

将打包的 chart 上传到仓库:

curl -k --request POST \
--url https://$ACP_DOMAIN/catalog/v1/chartrepos/cpaas-system/test/charts \
--header 'Authorization:Bearer $API_TOKEN' \
--data-binary @"/root/charts/nginx-8.8.0.tgz"

2.7 上传相关镜像

  1. 拉取镜像:docker pull nginx
  2. 保存为 tar 包:docker save nginx > nginx.latest.tar
  3. 加载并推送到私有注册表:
docker load -i nginx.latest.tar
docker tag nginx:latest 192.168.80.8:30050/nginx:latest
docker push 192.168.80.8:30050/nginx:latest

2.8 部署应用程序

通过 API 创建应用程序资源:

curl -k --request POST \
--url https://$ACP_DOMAIN/acp/v1/kubernetes/$CLUSTER_NAME/namespaces/$NAMESPACE/applications \
--header 'Authorization:Bearer $API_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
  "apiVersion": "app.k8s.io/v1beta1",
  "kind": "Application",
  "metadata": {
    "name": "test",
    "namespace": "catalog-ns",
    "annotations": {
      "app.cpaas.io/chart.source": "test/nginx",
      "app.cpaas.io/chart.version": "8.8.0",
      "app.cpaas.io/chart.values": "{\"image\":{\"pullPolicy\":\"IfNotPresent\"}}"
    },
    "labels": {
      "sync-from-helmrequest": "true"
    }
  }
}'

2.9 更新应用程序

使用 PATCH 请求更新应用程序:

curl -k --request PATCH \
--url https://$ACP_DOMAIN/acp/v1/kubernetes/$CLUSTER_NAME/namespaces/$NAMESPACE/applications/test \
--header 'Authorization:Bearer $API_TOKEN' \
--header 'Content-Type: application/merge-patch+json' \
--data '{
  "apiVersion": "app.k8s.io/v1beta1",
  "kind": "Application",
  "metadata": {
    "annotations": {
      "app.cpaas.io/chart.values": "{\"image\":{\"pullPolicy\":\"Always\"}}"
    }
  }
}'

2.10 卸载应用程序

删除应用程序资源:

curl -k --request DELETE \
--url https://$ACP_DOMAIN/acp/v1/kubernetes/$CLUSTER_NAME/namespaces/$NAMESPACE/applications/test \
--header 'Authorization:Bearer $API_TOKEN'

2.11 删除 Chart 仓库

curl -k --request DELETE \
--url https://$ACP_DOMAIN/apis/app.alauda.io/v1beta1/namespaces/cpaas-system/chartrepos/test \
--header 'Authorization:Bearer $API_TOKEN'

3. 通过 UI 部署 Helm Charts 作为应用程序

3.1 工作流概述

将模板添加到可管理的仓库 → 上传模板 → 管理模板版本

3.2 前提条件

模板仓库由平台管理员添加。请联系平台管理员以获取具有 管理 权限的可用 Chart 或 OCI Chart 类型模板仓库名称。

3.3 将模板添加到可管理的仓库

  1. 转到 目录

  2. 在左侧导航栏中,点击 Helm Charts

  3. 点击页面右上角的 添加模板,并根据以下参数选择模板仓库。

    参数描述
    模板仓库直接将模板同步到具有 管理 权限的 Chart 或 OCI Chart 类型模板仓库。分配给此 模板仓库 的项目所有者可以直接使用该模板。
    模板目录当所选模板仓库类型为 OCI Chart 时,必须选择或手动输入存储 Helm Chart 的目录。
    注意:手动输入新模板目录时,平台将在模板仓库中创建此目录,但存在创建失败的风险。
  4. 点击 上传模板,将本地模板上传到仓库。

  5. 点击 确认。模板上传过程可能需要几分钟,请耐心等待。

    注意:当模板状态从 Uploading 更改为 Upload Successful 时,表示模板已成功上传。

  6. 如果上传失败,请根据以下提示进行故障排除。

    注意:非法文件格式意味着上传的压缩包中的文件存在问题,例如缺少内容或格式不正确。

3.4 删除特定版本的模板

如果某个版本的模板不再适用,可以将其删除。

操作步骤

  1. 转到 目录

  2. 在左侧导航栏中,点击 Helm Charts

  3. 点击 Chart 卡片以查看详细信息。

  4. 点击 管理版本

  5. 找到不再适用的模板,点击 删除,并确认。

    删除版本后,相应的应用程序将无法更新。