自定义资源解释器
资源解释器框架
在将资源从 karmada-apiserver 分发到成员集群的过程中,Karmada 可能需要了解资源的定义结构。以 Propagating Deployment 为例,在构建 ResourceBinding 的阶段,karmada-controller-manager 组件需要解析 deployment 资源的 replicas 字段。
对于 Kubernetes 原生资源来说,Karmada 知道如何解析它们,但是对于由 CRD 定义的资源(或是由聚合层方式注册)来说,由于缺乏对该资源结构信息的了解,它们将仅被当作普通资源来对待,因此,高级调度算法将不能应用于这些资源。
Resource Interpreter Framework 专为解释资源结构而设计,它包括两类解释器:
内置解释器:用于解释常见的 Kubernetes 原生资源或一些知名的扩展资源;自定义解释器: 用于解释自定义资源或覆盖内置解释器。
注意:上述两类解释器之间的主要区别在于,
内置解释器由 Karmada 社区实现并维护,并将其内置到 Karmada 组件中,例如karmada-controller-manager。 相反,自定义解释器是由用户实现和维护的,它应该作为Interpreter Webhook或声明式配置注册到 Karmada(更多详细信息,请参考 Customized Interpreter)。
解释器操作
在解释资源时,我们经常会提取多条信息。Karmada 中定义了多种解释器操作,资源解释器框架为每个操作类型提供服务。
关于资源解释器框架定义的各种操作类型的具体含义,可以参考 Interpreter Operations 。
注意: 并非所有设计的操作类型均受支持(有关支持的操作,请参见下文):
注意:在使用特定的
解释器操作解释资源时,最多只会咨询一个解释器;对于同一个资源,自定义解释器比内置解释器具有更高的优先级。 例如,内置解释器为apps/v1version 的Deployment提供InterpretReplica服务,如果有一个自定义解释器注册到 Karmada 来解释该资源,则自定义解释器获胜,内置解释器将被忽略。
内置解释器
对于常见的 Kubernetes 原生资源或一些知名的扩展资源来说,解释器操作是内置的,这意味着用户通常不需要实现自定义解释器。 如果你希望内置更多资源,请随时提交问题 让我们了解您的用户案例。
内置解释器现在支持以下解释器操作:
InterpretReplica
支持资源:
- Deployment(apps/v1)
- StatefulSet(apps/v1)
- Job(batch/v1)
- Pod(v1)
ReviseReplica
支持资源:
- Deployment(apps/v1)
- StatefulSet(apps/v1)
- Job(batch/v1)
Retain
支持资源:
- Pod(v1)
- Service(v1)
- ServiceAccount(v1)
- PersistentVolumeClaim(v1)
- PersistentVolume(V1)
- Job(batch/v1)
AggregateStatus
支持资源:
- Deployment(apps/v1)
- Service(v1)
- Ingress(networking.k8s.io/v1)
- CronJob(batch/v1)
- Job(batch/v1)
- DaemonSet(apps/v1)
- StatefulSet(apps/v1)
- Pod(v1)
- PersistentVolume(V1)
- PersistentVolumeClaim(v1)
- PodDisruptionBudget(policy/v1)
InterpretStatus
支持资源:
- Deployment(apps/v1)
- Service(v1)
- Ingress(networking.k8s.io/v1)
- Job(batch/v1)
- DaemonSet(apps/v1)
- StatefulSet(apps/v1)
- PodDisruptionBudget(policy/v1)
InterpretDependency
支持资源:
- Deployment(apps/v1)
- Job(batch/v1)
- CronJob(batch/v1)
- Pod(v1)
- DaemonSet(apps/v1)
- StatefulSet(apps/v1)
- Ingress(networking.k8s.io/v1)
InterpretHealth
支持资源:
- Deployment(apps/v1)
- StatefulSet(apps/v1)
- ReplicaSet(apps/v1)
- DaemonSet(apps/v1)
- Service(v1)
- Ingress(networking.k8s.io/v1)
- PersistentVolumeClaim(v1)
- PodDisruptionBudget(policy/v1)
- Pod(v1)
自定义解释器
自定义解释器由用户实现和维护,它可以通过两种方式扩展,通过定义声明式配置文件或在运行时作为 webhook 运行。
注意:声明式配置比 webhook 有更高的优先级,即用户如果同时注册了这两种解释方式,将优先应用相应资源的声明式配置
内置资源声明性配置
Karmada捆绑了一些流行、开源的资源,以便用户可以直接使用。声明式配置的解释器现在支持以下解释器操作:
InterpretReplica
支持资源:
- BroadcastJob(apps.kruise.io/v1alpha1)
- CloneSet(apps.kruise.io/v1alpha1)
- AdvancedStatefulSet(apps.kruise.io/v1beta1)
- Workflow(argoproj.io/v1alpha1)
ReviseReplica
支持资源:
- BroadcastJob(apps.kruise.io/v1alpha1)
- CloneSet(apps.kruise.io/v1alpha1)
- AdvancedStatefulSet(apps.kruise.io/v1beta1)
- Workflow(argoproj.io/v1alpha1)
Retain
支持资源:
- BroadcastJob(apps.kruise.io/v1alpha1)
- Workflow(argoproj.io/v1alpha1)
- HelmRelease(helm.toolkit.fluxcd.io/v2beta1)
- Kustomization(kustomize.toolkit.fluxcd.io/v1)
- GitRepository(source.toolkit.fluxcd.io/v1)
- Bucket(source.toolkit.fluxcd.io/v1beta2)
- HelmChart(source.toolkit.fluxcd.io/v1beta2)
- HelmRepository(source.toolkit.fluxcd.io/v1beta2)
- OCIRepository(source.toolkit.fluxcd.io/v1beta2)