容器与 Helm Chart 的共存 - 基于 OCI 的注册表

2025-06-08

容器与 Helm Chart 的共存 - 基于 OCI 的注册表

如果您正在使用 Kubernetes,那么您很可能正在使用 Helm,或者至少正在考虑使用。本文将指导您如何以一种非传统的方式发布 Helm Chart——使用基于 OCI 的注册表

首先,我们将简要介绍基于 OCI 的注册表是什么以及它们如何帮助我们,在了解一些理论之后,我们将创建一个 Helm 图表,将其推送到 OCI 注册表,并使用它实际部署一些东西。

向我们表达您的支持🙏🏻

ProductHunt 发布

在开始之前,我们想提一下,我们计划在 Product Hunt 上发布第一个版本!点击“通知我”按钮,当我们发布并准备好接收您的反馈时,您会收到通知 🔔

如果您为我们的存储库加注星标并帮助我们将我们的工具展示给其他开发人员,我们将非常感激⭐

基于 Helm OCI 的注册表

Helm 仓库用于存储 Helm Chart。通过它们,我们可以将应用程序发布并版本化为打包的 Helm Chart,供其他人安装到集群中。它们还能更轻松地进行版本控制和资源回滚。总而言之,Helm Chart 是一个集中式存储位置。

Helm 仓库本质上是一个简单的 HTTP 服务器,它提供一个index.yaml文件,其中包含该仓库中存储的 Chart 信息,例如版本、描述以及 Chart 内容的下载地址(通常在同一台服务器上)。点击此处index.yaml了解更多关于该文件的信息

OCI代表开放容器计划,其组织目标是定义容器格式和运行时的规范。

乍一看,它似乎与我们刚才提到的 Helm 仓库无关;至少对我来说是这样。OCI 仓库主要托管容器镜像,但我们可以在那里存储不同类型的内容。我们可以托管的类型之一就是Helm Charts

有了这样的注册表,您可以将所有镜像和 Helm Chart 托管在同一个地方。最重要的是,您不需要维护 Helm 仓库index.yaml文件,这使得 Chart 的管理更加容易。

您可以在 Helm 存储库和容器(OCI)注册表上提供完全相同的图表;这两种方法之间的唯一区别在于您如何维护图表。

您可以使用多个不同的容器注册表来存储 Helm 图表:

亲自动手

现在我们已经掌握了基础知识,让我们在实践中了解这些 OCI Chart,并使用它们来部署我们的应用程序。我们将创建一个 Chart,将其推送到 DockerHub,然后使用它将我们的应用程序部署到 Kubernetes 集群中。为了将我们定义的 Chart 中的资源部署到 Kubernetes 集群中,我们将使用Cyclops

在 OCI 注册表上创建 Helm 图表

首先,我们要创建一个 Helm Chart。要创建 Chart,请创建一个新目录

mkdir oci-demo
Enter fullscreen mode Exit fullscreen mode

并将下面列出的文件添加到创建的目录中。您可以根据需要随意自定义图表,但为了演示的目的,我们将创建一个具有以下结构的基本图表:

.
└── oci-demo
    ├── Chart.yaml                 # YAML file containing information about the chart
    ├── templates                  # Directory of templates that, when combined with values, will generate valid Kubernetes manifest files.
    │         ├── deployment.yaml  # K8s resources are separated into multiple files. Feel free to add more or change existing
    │         └── service.yaml
    ├── values.schema.json         # JSON Schema for imposing a structure on the values.yaml file
    └── values.yaml                # The default configuration values for this chart
Enter fullscreen mode Exit fullscreen mode

您可以在 Helm 的官方文档中找到有关每个文件/目录的更多信息

图表.yaml

让我们从以下开始Chart.yaml

# Chart.yaml

apiVersion: v1
name: oci-demo
version: 0.0.0
Enter fullscreen mode Exit fullscreen mode

我不想讲得太详细,我会带你去302看 Helm 文档。

模板文件夹

下一步是定义我们的打包应用程序需要哪些 Kubernetes 资源。我们在/templates文件夹中定义这些资源。如之前的图表结构所示,我们只需向应用程序添加 adeployment和 a 。service

这些文件的内容如下:

# templates/deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: {{ .Values.name }}
  name: {{ .Values.name }}
spec:
  replicas: {{ .Values.replicas }}
  selector:
    matchLabels:
      app: {{ .Values.name }}
  template:
    metadata:
      labels:
        app: {{ .Values.name }}
    spec:
      containers:
      - image: {{ .Values.image -}}:{{ .Values.version }}
        name: {{ .Values.name }}
        ports:
        - containerPort: 80
          name: http

Enter fullscreen mode Exit fullscreen mode


# templates/service.yaml

{{- if .Values.service }}
apiVersion: v1
kind: Service
metadata:
  name: {{ .Values.name }}
  labels:
    app: {{ .Values.name }}
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
      name: http
  selector:
    app: {{ .Values.name }}
{{- end }}

Enter fullscreen mode Exit fullscreen mode

价值观定义

/templates我们定义的文件夹中,显然只有模板。最好为这些模板定义默认值。我们将使用values.yaml以下方法:

name: demo
replicas: 3

image: nginx
version: 1.14.2

service: true
Enter fullscreen mode Exit fullscreen mode

这些是默认值,任何使用图表的人很可能都会想要更改它们。但是,如果有人使用图表时提供了无效数据,弄乱了值,会发生什么情况?例如,设置replicas: twoservice: no。另一个可能弄乱的是值的名称,因此有人可能会使用instance: 3而不是replicas: 3

这两个例子看起来都很明显,而且你不会弄乱,但随着图表的增长,values.yaml文件也会随之增长。Bitnami 的 Redis 图表就是一个很好的例子。我鼓励你浏览一下它的值文件。一会儿见!

现在您回来了,可能已经明白了为什么验证值并定义其结构是有意义的。让我们对图表进行同样的操作。

但首先,让我们定义一下此验证的规则:

  • service是布尔类型
  • nameimageversion是字符串
  • replicas是一个整数
  • replicas≥ 0
  • 只允许某些值version;让这些值为1.14.11.14.21.15.0

这么短的值文件里竟然包含这么多规则!不过,有了这些规则,我们就能安心地部署图表,不用担心出错。

现在我们已经定义了这些,我们的 JSON 模式将如下所示:

{
  "properties": {
    "name": {
      "description": "Application name",
      "type": "string"
    },
    "replicas": {
      "description": "Number of replicas",
      "type": "integer",
      "minimum": 0
    },
    "image": {
      "description": "Container Image",
      "type": "string"
    },
    "version": {
      "description": "Container image version",
      "type": "string",
      "enum": ["1.14.1", "1.14.2", "1.15.0"]
    },
    "service": {
      "description": "Expose your application",
      "type": "boolean"
    }
  },
  "order": ["name", "replicas", "image", "version", "service"],
  "title": "Values",
  "type": "object"
}
Enter fullscreen mode Exit fullscreen mode

您可以在Helm 文档中找到有关如何为 Helm 图表编写 JSON 模式的更多信息

推送至 Docker Hub

如果您还没有 Docker Hub 帐户,您应该创建一个来托管您的图表。

要将我们的图表推送到 OCI 注册表,我们需要使用以下命令将图表打包成 tarball:

helm package oci-demo
Enter fullscreen mode Exit fullscreen mode

现在应该有一个名为 的 tarball 文件oci-demo-0.0.0.tgz

接下来,您需要使用 Helm 登录 Docker Hub:

helm registry login registry-1.docker.io -u {username}
Enter fullscreen mode Exit fullscreen mode

最后,将图表推送到远程注册表:

helm push oci-demo-0.0.0.tgz oci://registry-1.docker.io/{username}
Enter fullscreen mode Exit fullscreen mode

在Docker Hub上检查你的工件,你应该会看到新创建的 Helm 图表。点击图表,你会看到更多关于该图表及其版本的信息。

Docker Hub 标签

使用 OCI 图表

现在,我们的 Helm 图表已经准备就绪,让我们开始使用它吧。首先,让我们启动一个 Kubernetes 集群。如果您已经有一个正在运行的 Kubernetes 集群,请直接使用它,跳过此步骤。

创建 minikube 集群

当我想尝试一个新的 Kubernetes 工具时,我会在 Minikube 集群上试用。Minikube 本质上是一个 Kubernetes 集群,你可以在自己的机器上运行,并且在使用完成后可以轻松拆卸。

如果你使用的是 Mac,则可以通过 brew 安装:

brew install minikube
Enter fullscreen mode Exit fullscreen mode

在此处查看其安装指南→ https://minikube.sigs.k8s.io/docs/start/

要实际运行集群,只需点击:

minikube start
Enter fullscreen mode Exit fullscreen mode

快速检查一切是否正常;让我们列出所有命名空间:

kubectl get ns

NAME              STATUS   AGE
default           Active   11s
kube-node-lease   Active   13s
kube-public       Active   13s
kube-system       Active   13s
Enter fullscreen mode Exit fullscreen mode

将 OCI 图表部署到 Kubernetes 集群中

您可以使用纯 Helm 部署新创建的 Helm Chart,但让我们更进一步。我们很可能希望使用特定的值来编辑该部署,并随着时间的推移进行更改,因此让我们使其更加用户友好。

我们可以使用 Cyclops 来帮我们实现这一点!它可以通过提供一个简单的用户界面来帮助您部署和可视化应用程序,只需点击几下即可完成图表的部署。让我们将 Cyclops 安装到集群中,并部署新创建的图表!

您可以使用单个命令安装 Cyclops:

kubectl apply -f https://raw.githubusercontent.com/cyclops-ui/cyclops/v0.2.0/install/cyclops-install.yaml
Enter fullscreen mode Exit fullscreen mode

它将创建一个名为的新命名空间cyclops并在其中启动 Cyclops 部署。

检查 pod 是否已启动并正在运行:

kubectl get pods -n cyclops

NAME                           READY   STATUS    RESTARTS   AGE
cyclops-ctrl-d6fd877d8-tpdqd   1/1     Running   0          62s
cyclops-ui-5c858b44d4-dhn2c    1/1     Running   0          62s
Enter fullscreen mode Exit fullscreen mode

一旦这些都启动了,你就需要将两个部署都进行端口转发:

kubectl port-forward svc/cyclops-ui 3000:3000 -n cyclops
Enter fullscreen mode Exit fullscreen mode

并在单独的窗口中运行:

kubectl port-forward svc/cyclops-ctrl 8080:8080 -n cyclops
Enter fullscreen mode Exit fullscreen mode

您现在可以通过http://localhost:3000访问 Cyclops

当你打开你当地的独眼巨人时,你可以点击Add module右上角。

现在我们开始使用 OCI 图表了!系统会提示您输入模板的repositorypathversion。您可以使用之前创建的 OCI 图表来填写这些内容,就像我下面做的那样。

Repository: oci://registry-1.docker.io/{username}
Path:       oci-demo
Version:    0.0.0
Enter fullscreen mode Exit fullscreen mode

从这里,您只需点击加载并让 Cyclops 根据您的图表呈现表单。

独眼巨人形态

你还记得我们之前添加到图表中的模式文件吗?这就是 Cyclops 用来为你渲染此表单的文件。你在values.schema.json文件中设置的所有字段和验证都会被考虑在内,因此你可以为你的应用程序获得完全自定义的 UI。

现在,您可以填写这些字段并点击“保存”,Cyclops 将为您完成剩下的工作。首先,它会将这些表单值注入模板,然后将每个资源部署到集群中。

独眼巨人模块

还有什么话要说吗?

我们从零开始,只用了几分钟就部署了一个应用程序,其中包含我们自己的 Helm chart 和专门为我们量身定制的 UI。最重要的是,我们使用了基于 OCI 的注册表,无需设置 Helm 仓库来服务我们的 chart。

希望您阅读本文愉快,并发现我们提供的信息和步骤对您有所帮助。感谢您阅读我们的文章!

链接链接 https://dev.to/cyclops-ui/coexistence-of-containers-and-helm-charts-oci-based-registries-b6b
PREV
揭穿常见的 Kubernetes 神话
NEXT
Kubernetes 设置快速运行