4.4 KiB
ComponentTrait Composing and Trait CR Naming
- Owner: Jianbo Sun (@wonderflow), Zhou Zheng Xi (@zzxwill)
- Reviewers: KubeVela/Crossplane Maintainers
- Status: Draft
- Notice: Manual scaler is deprecated. See this issue to get more information.
Background
Now definition name is no longer coupled with CRD name, it's align to capability name in KubeVela, and two TraitDefinition resources can both refer to the same CRD. So it's necessary to specify how to assemble trait CR in ApplicationConfiguration and to set the CR name in a friendly way.
Several ways to assemble trait CR in ApplicationConfiguration
- If the name of TraitDefinition is the same with the referenced CRD
The normal way to assemble a trait CR works as below.
apiVersion: core.oam.dev/v1alpha2
kind: ApplicationConfiguration
metadata:
name: example-appconfig
spec:
components:
- componentName: example-component
traits:
- trait:
apiVersion: core.oam.dev/v1alpha2
kind: ManualScalerTrait
spec:
replicaCount: 3
- If the name of TraitDefinition is different to that of Trait CRD
The definition name autoscale is different to the trait name autoscalers.standard.oam.dev, we have two ways to compose ComponentTrait.
apiVersion: core.oam.dev/v1alpha2
kind: TraitDefinition
metadata:
name: autoscale
spec:
definitionRef:
name: autoscalers.standard.oam.dev
- Use label
trait.oam.dev/type
apiVersion: core.oam.dev/v1alpha2
kind: ApplicationConfiguration
metadata:
name: example-appconfig
spec:
components:
- componentName: example-component
traits:
- trait:
apiVersion: standard.oam.dev/v1alpha2
kind: Autoscalers
metadata:
labels:
trait.oam.dev/type: autoscale
spec:
replicaCount: 3
When rendering trait, the TraitDefinition could be retrieved by the label.
- Use
namefield
apiVersion: core.oam.dev/v1alpha2
kind: ApplicationConfiguration
metadata:
name: example-appconfig
spec:
components:
- componentName: example-component
traits:
- trait:
apiVersion: standard.oam.dev/v1alpha2
kind: Autoscalers
name: autoscale
spec:
replicaCount: 3
The mutating handler will, at the very beginning, convert name:autoscale to the labels above.
In summary, among these two ways to compose ComponentTrait, using labeling is recommended.
While in KubeVela, you don't need to worry about either label or name, just use command vela TraitType or vela up to attach the trait to
a component.
Set the CR name in a friendly way
Currently, we named all trait name in the format of ${ComponentName}-trait-${HashTag}. This will lead to confusions
when listing CRs of all Traits of a component.
In this proposal, we propose to change the naming rule to ${ComponentName}-${TraitDefinitionName}-${HashTag}.
For example, if the name of TraitDefinition is autoscale, we name the trait CR to example-component-autoscale-xyzfa32r.
apiVersion: core.oam.dev/v1alpha2
kind: ApplicationConfiguration
metadata:
name: example-appconfig
spec:
components:
- componentName: example-component
traits:
- trait:
apiVersion: standard.oam.dev/v1alpha2
kind: Autoscalers
metadata:
labels:
trait.oam.dev/type: autoscale
spec:
replicaCount: 3
If the name is the same as the CRD name, like manualscalertraits.core.oam.dev, we name it to example-component-manualscalertraits-rq234rrw
by choosing the first part.
apiVersion: core.oam.dev/v1alpha2
kind: ApplicationConfiguration
metadata:
name: example-appconfig
spec:
components:
- componentName: example-component
traits:
- trait:
apiVersion: core.oam.dev/v1alpha2
kind: ManualScalerTrait
spec:
replicaCount: 3
---
apiVersion: core.oam.dev/v1alpha2
kind: TraitDefinition
metadata:
name: manualscalertraits.core.oam.dev
spec:
workloadRefPath: spec.workloadRef
definitionRef:
name: manualscalertraits.core.oam.dev
After OAM Kubernetes Runtime is upgraded, the old trait CR name example-component-trait-uewf77eu will stay unchanged for previous version compatibility.