Built-in Policy Type

    Allow configuration drift for applied resources, delivery the resource without continuously reconciliation.

    It’s generally used in one time delivery only without continuous management scenario.

    NameDescriptionTypeRequiredDefault
    selectorSpecify how to select the targets of the rule.false
    strategySpecify the strategy for configuring the resource level configuration drift behaviour.strategytrue
    NameDescriptionTypeRequiredDefault
    componentNamesSelect resources by component names.[]stringfalse
    componentTypesSelect resources by component types.[]stringfalse
    oamTypesSelect resources by oamTypes (COMPONENT or TRAIT).[]stringfalse
    traitTypesSelect resources by trait types.[]stringfalse
    resourceTypesSelect resources by resource types (like Deployment).[]stringfalse
    resourceNamesSelect resources by their names.[]stringfalse
    NameDescriptionTypeRequiredDefault
    affectWhen the strategy takes effect,e.g. onUpdate、onStateKeep.stringfalse
    pathSpecify the path of the resource that allow configuration drift.[]stringtrue

    Configure the garbage collect behaviour for the application.

    It’s used in scenario. It can be used to configure the collection policy, e.g. don’t delete the legacy resources when updating.

    1. kind: Application
    2. metadata:
    3. name: first-vela-app
    4. spec:
    5. components:
    6. - name: express-server
    7. type: webservice
    8. properties:
    9. image: oamdev/hello-world
    10. port: 8000
    11. traits:
    12. - type: ingress-1-20
    13. properties:
    14. domain: testsvc.example.com
    15. http:
    16. "/": 8000
    17. policies:
    18. - name: keep-legacy-resource
    19. type: garbage-collect
    20. properties:
    21. keepLegacyResource: true
    1. apiVersion: core.oam.dev/v1beta1
    2. kind: Application
    3. metadata:
    4. name: garbage-collect-app
    5. spec:
    6. components:
    7. - name: hello-world-new
    8. type: webservice
    9. properties:
    10. image: oamdev/hello-world
    11. traits:
    12. - type: expose
    13. properties:
    14. port: [8000]
    15. policies:
    16. - name: garbage-collect
    17. type: garbage-collect
    18. properties:
    19. rules:
    20. - selector:
    21. traitTypes:
    22. - expose
    23. strategy: onAppDelete
    NameDescriptionTypeRequiredDefault
    keepLegacyResourceIf is set, outdated versioned resourcetracker will not be recycled automatically, outdated resources will be kept until resourcetracker be deleted manually.boolfalsefalse
    rulesSpecify the list of rules to control gc strategy at resource level, if one resource is controlled by multiple rules, first rule will be used.[]rulesfalse
    NameDescriptionTypeRequiredDefault
    selectorSpecify how to select the targets of the rule.true
    strategySpecify the strategy for target resource to recycle.“onAppUpdate” or “onAppDelete” or “never”falseonAppUpdate
    NameDescriptionTypeRequiredDefault
    componentNamesSelect resources by component names.[]stringfalse
    componentTypesSelect resources by component types.[]stringfalse
    oamTypesSelect resources by oamTypes (COMPONENT or TRAIT).[]stringfalse
    traitTypesSelect resources by trait types.[]stringfalse
    resourceTypesSelect resources by resource types (like Deployment).[]stringfalse
    resourceNamesSelect resources by their names.[]stringfalse

    Apply periodical health checking to the application.

    1. apiVersion: core.oam.dev/v1beta1
    2. kind: Application
    3. metadata:
    4. name: example-app-rollout
    5. namespace: default
    6. spec:
    7. components:
    8. - name: hello-world-server
    9. type: webservice
    10. properties:
    11. image: crccheck/hello-world
    12. ports:
    13. - port: 8000
    14. expose: true
    15. type: webservice
    16. policies:
    17. - name: health-policy-demo
    18. type: health
    19. properties:
    20. probeInterval: 5
    21. probeTimeout: 10
    1. apiVersion: core.oam.dev/v1beta1
    2. kind: Application
    3. metadata:
    4. name: deploy-with-override
    5. namespace: examples
    6. spec:
    7. components:
    8. - name: nginx-with-override
    9. type: webservice
    10. properties:
    11. image: nginx
    12. policies:
    13. - name: topology-hangzhou-clusters
    14. type: topology
    15. properties:
    16. clusterLabelSelector:
    17. region: hangzhou
    18. - name: topology-local
    19. type: topology
    20. properties:
    21. clusters: ["local"]
    22. namespace: examples-alternative
    23. - name: override-nginx-legacy-image
    24. type: override
    25. properties:
    26. components:
    27. - name: nginx-with-override
    28. properties:
    29. image: nginx:1.20
    30. - name: override-high-availability
    31. type: override
    32. properties:
    33. components:
    34. - type: webservice
    35. traits:
    36. - type: scaler
    37. properties:
    38. replicas: 3
    39. workflow:
    40. steps:
    41. - type: deploy
    42. name: deploy-local
    43. properties:
    44. policies: ["topology-local"]
    45. - type: deploy
    46. name: deploy-hangzhou
    47. properties:
    48. policies: ["topology-hangzhou-clusters", "override-nginx-legacy-image", "override-high-availability"]
    NameDescriptionTypeRequiredDefault
    componentsSpecify the overridden component configuration.[]componentstrue
    selectorSpecify a list of component names to use, if empty, all components will be selected.[]stringfalse
    NameDescriptionTypeRequiredDefault
    nameSpecify the name of the patch component, if empty, all components will be merged.stringfalse
    typeSpecify the type of the patch component.stringfalse
    propertiesSpecify the properties to override.map[string]_false
    traitsSpecify the traits to override.false
    NameDescriptionTypeRequiredDefault
    typeSpecify the type of the trait to be patched.stringtrue
    propertiesSpecify the properties to override.map[string]_false
    disableSpecify if the trait should be remove, default false.boolfalsefalse

    Configure the resources to be read-only in the application (no update / state-keep).

    1. kind: Application
    2. metadata:
    3. spec:
    4. components:
    5. - name: busybox
    6. type: worker
    7. properties:
    8. image: busybox
    9. cmd:
    10. - sleep
    11. - '1000000'
    12. policies:
    13. - type: read-only
    14. name: read-only
    15. properties:
    16. rules:
    17. - selector:
    18. resourceTypes: ["Deployment"]
    NameDescriptionTypeRequiredDefault
    rulesSpecify the list of rules to control read only strategy at resource level.[]rulesfalse
    NameDescriptionTypeRequiredDefault
    selectorSpecify how to select the targets of the rule.true
    NameDescriptionTypeRequiredDefault
    componentNamesSelect resources by component names.[]stringfalse
    componentTypesSelect resources by component types.[]stringfalse
    oamTypesSelect resources by oamTypes (COMPONENT or TRAIT).[]stringfalse
    traitTypesSelect resources by trait types.[]stringfalse
    resourceTypesSelect resources by resource types (like Deployment).[]stringfalse
    resourceNamesSelect resources by their names.[]stringfalse

    Describe the configuration to replicate components when deploying resources, it only works with specified deploy step in workflow.

    In KubeVela, we can dispatch resources across the clusters. But projects like OpenYurt have finer-grained division like node pool. This requires to dispatch some similar resources to the same cluster. These resources are called replication. Back to the example of OpenYurt, it can integrate KubeVela and replicate the resources then dispatch them to the different node pool.

    Replication is an internal policy. It can be only used with deploy workflow step. When using replication policy. A new field replicaKey will be added to context. User can use definitions that make use of context.replicaKey. For example, apply a replica-webservice ComponentDefinition.

    In this ComponentDefinition, we can use context.replicaKey to distinguish the name of Deployment and Service.

    1. apiVersion: core.oam.dev/v1beta1
    2. kind: ComponentDefinition
    3. metadata:
    4. annotations:
    5. definition.oam.dev/description: Webservice, but can be replicated
    6. name: replica-webservice
    7. namespace: vela-system
    8. spec:
    9. schematic:
    10. cue:
    11. template: |
    12. output: {
    13. apiVersion: "apps/v1"
    14. kind: "Deployment"
    15. metadata: {
    16. if context.replicaKey != _|_ {
    17. name: context.name + "-" + context.replicaKey
    18. }
    19. if context.replicaKey == _|_ {
    20. name: context.name
    21. }
    22. }
    23. spec: {
    24. selector: matchLabels: {
    25. "app.oam.dev/component": context.name
    26. if context.replicaKey != _|_ {
    27. "app.oam.dev/replicaKey": context.replicaKey
    28. }
    29. }
    30. template: {
    31. metadata: {
    32. labels: {
    33. if parameter.labels != _|_ {
    34. parameter.labels
    35. }
    36. if parameter.addRevisionLabel {
    37. "app.oam.dev/revision": context.revision
    38. }
    39. "app.oam.dev/name": context.appName
    40. "app.oam.dev/component": context.name
    41. if context.replicaKey != _|_ {
    42. "app.oam.dev/replicaKey": context.replicaKey
    43. }
    44. }
    45. if parameter.annotations != _|_ {
    46. annotations: parameter.annotations
    47. }
    48. }
    49. }
    50. }
    51. }
    52. outputs: {
    53. if len(exposePorts) != 0 {
    54. webserviceExpose: {
    55. apiVersion: "v1"
    56. kind: "Service"
    57. metadata: {
    58. if context.replicaKey != _|_ {
    59. name: context.name + "-" + context.replicaKey
    60. }
    61. if context.replicaKey == _|_ {
    62. name: context.name
    63. }
    64. }
    65. spec: {
    66. selector: {
    67. "app.oam.dev/component": context.name
    68. if context.replicaKey != _|_ {
    69. "app.oam.dev/replicaKey": context.replicaKey
    70. }
    71. }
    72. ports: exposePorts
    73. type: parameter.exposeType
    74. }
    75. }
    76. }
    77. }
    • override: select hello-rep component to deploy.
    • topology: select cluster local to deploy.
    • replication: select hello-rep component to replicate.

    As a result, there will be two Deployments and two Services:

    1. apiVersion: core.oam.dev/v1beta1
    2. kind: Application
    3. metadata:
    4. name: app-replication-policy
    5. spec:
    6. components:
    7. - name: hello-rep
    8. type: replica-webservice
    9. properties:
    10. image: crccheck/hello-world
    11. ports:
    12. expose: true
    13. - name: comp-to-replicate
    14. type: override
    15. properties:
    16. selector: [ "hello-rep" ]
    17. - name: target-default
    18. type: topology
    19. properties:
    20. clusters: [ "local" ]
    21. - name: replication-default
    22. type: replication
    23. properties:
    24. keys: ["beijing","hangzhou"]
    25. selector: ["hello-rep"]
    26. workflow:
    27. steps:
    28. - name: deploy-with-rep
    29. type: deploy
    30. properties:
    31. policies: ["comp-to-replicate","target-default","replication-default"]
    1. kubectl get deploy -n default
    2. NAME READY UP-TO-DATE AVAILABLE AGE
    3. hello-rep-beijing 1/1 1 1 5s
    4. hello-rep-hangzhou 1/1 1 1 5s
    5. kubectl get service -n default
    6. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    7. hello-rep-hangzhou ClusterIP 10.43.23.200 <none> 80/TCP 41s
    8. hello-rep-beijing ClusterIP 10.43.24.116 <none> 80/TCP 12s

    Configure the resources to be sharable across applications.

    It’s used in scenario. It can be used to configure which resources can be shared between applications. The target resource will allow multiple application to read it but only the first one to be able to write it.

    1. apiVersion: core.oam.dev/v1beta1
    2. kind: Application
    3. metadata:
    4. name: app2
    5. spec:
    6. components:
    7. - name: ns2
    8. type: k8s-objects
    9. properties:
    10. objects:
    11. - apiVersion: v1
    12. kind: Namespace
    13. metadata:
    14. name: example
    15. - name: cm2
    16. type: k8s-objects
    17. properties:
    18. objects:
    19. - apiVersion: v1
    20. kind: ConfigMap
    21. metadata:
    22. name: cm2
    23. namespace: example
    24. data:
    25. key: value2
    26. policies:
    27. - name: shared-resource
    28. type: shared-resource
    29. properties:
    30. rules:
    31. - selector:
    32. resourceTypes: ["Namespace"]
    NameDescriptionTypeRequiredDefault
    rulesSpecify the list of rules to control shared-resource strategy at resource level.[]rulesfalse
    NameDescriptionTypeRequiredDefault
    selectorSpecify how to select the targets of the rule.true
    NameDescriptionTypeRequiredDefault
    componentNamesSelect resources by component names.[]stringfalse
    componentTypesSelect resources by component types.[]stringfalse
    oamTypesSelect resources by oamTypes (COMPONENT or TRAIT).[]stringfalse
    traitTypesSelect resources by trait types.[]stringfalse
    resourceTypesSelect resources by resource types (like Deployment).[]stringfalse
    resourceNamesSelect resources by their names.[]stringfalse

    Configure the resources to be able to take over when it belongs to no application.

    1. apiVersion: core.oam.dev/v1beta1
    2. kind: Application
    3. metadata:
    4. name: take-over
    5. spec:
    6. components:
    7. - name: busybox
    8. type: k8s-objects
    9. properties:
    10. objects:
    11. - apiVersion: apps/v1
    12. kind: Deployment
    13. metadata:
    14. name: busybox-ref
    15. policies:
    16. - type: take-over
    17. name: take-over
    18. properties:
    19. rules:
    20. - selector:
    21. resourceTypes: ["Deployment"]
    NameDescriptionTypeRequiredDefault
    rulesSpecify the list of rules to control take over strategy at resource level.[]rulesfalse
    NameDescriptionTypeRequiredDefault
    selectorSpecify how to select the targets of the rule.true
    NameDescriptionTypeRequiredDefault
    componentNamesSelect resources by component names.[]stringfalse
    componentTypesSelect resources by component types.[]stringfalse
    oamTypesSelect resources by oamTypes (COMPONENT or TRAIT).[]stringfalse
    traitTypesSelect resources by trait types.[]stringfalse
    resourceTypesSelect resources by resource types (like Deployment).[]stringfalse
    resourceNamesSelect resources by their names.[]stringfalse

    Describe the destination where components should be deployed to.

    1. apiVersion: core.oam.dev/v1beta1
    2. kind: Application
    3. metadata:
    4. name: basic-topology
    5. namespace: examples
    6. spec:
    7. components:
    8. - name: nginx-basic
    9. type: webservice
    10. properties:
    11. image: nginx
    12. policies:
    13. - name: topology-hangzhou-clusters
    14. type: topology
    15. properties:
    16. clusters: ["hangzhou-1", "hangzhou-2"]
    1. apiVersion: core.oam.dev/v1beta1
    2. kind: Application
    3. metadata:
    4. name: label-selector-topology
    5. namespace: examples
    6. spec:
    7. components:
    8. - name: nginx-label-selector
    9. type: webservice
    10. properties:
    11. image: nginx
    12. policies:
    13. - name: topology-hangzhou-clusters
    14. type: topology
    15. properties:
    16. clusterLabelSelector: