CRD 在 Helm3 中的使用和限制
Kubernetes 提供了一种机制来声明新类型的 Kubernetes 对象。使用 CustomResourceDefinitions
(CRD),Kubernetes 开发人员可以声明自定义资源类型。
在 Helm3 中,CRD 被视为一种特殊的对象。它们在 Chart 的其余部分之前安装,并且受到一些限制。
CRD YAML 文件应放在 Chart 内的 crds/
目录中。多个 CRD(由 YAML 开始和结束标记分隔)可以放在同一个文件中。 Helm 将尝试将 CRD 目录中的所有文件加载到 Kubernetes 中。
CRD 文件不能被模板化。它们必须是纯 YAML 文档。
当 Helm 安装一个新的 Chart 时,它会上传 CRD,暂停直到 API Server 使 CRD 可用,然后启动模板引擎,渲染 Chart 的其余部分,并将其上传到 Kubernetes。
由于这种排序,CRD 信息在 Helm 模板中的 .Capabilities
对象中可用,并且 Helm 模板可以创建在 CRD 中声明的对象的新实例。
限制
与 Kubernetes 中的大多数对象不同,CRD 是全局安装的。出于这个原因,Helm 在管理 CRD 时采取了非常谨慎的方法。 CRD 受到以下限制:
-
永远不会重新安装 CRD。如果 Helm 确定
crds/
目录中的 CRD 已经存在(无论版本如何),Helm 将不会尝试安装或升级。 -
CRD 永远不会在升级或回滚时安装。 Helm 只会在安装操作时创建 CRD。
-
CRD 永远不会被删除。删除 CRD 会自动删除集群中所有命名空间中的所有 CRD 内容。因此,Helm 不会删除 CRD。
鼓励想要升级或删除 CRD 的操作员手动执行此操作并非常小心。
示例
例如,如果您的 Chart 在 crds/
目录中有 CronTab 的 CRD,您可以在 templates/
目录中创建 CronTab 类型的实例:
crontabs/
Chart.yaml
crds/
crontab.yaml
templates/
mycrontab.yaml
crontab.yaml
文件必须包含没有模板指令的 CRD:
kind: CustomResourceDefinition
metadata:
name: crontabs.stable.example.com
spec:
group: stable.example.com
versions:
- name: v1
served: true
storage: true
scope: Namespaced
names:
plural: crontabs
singular: crontab
kind: CronTab
然后模板 mycrontab.yaml
可能会创建一个新的 CronTab(像往常一样使用模板):
apiVersion: stable.example.com
kind: CronTab
metadata:
name: {{ .Values.name }}
spec:
# ...
Helm 将确保 CronTab 类型已安装并且在 Kubernetes API Server 中可用,然后再继续安装在 templates/
中的东西。