自定义策略

本节将介绍通过 CUE 实现自定义策略,在开始之前,你要学习 模块定义 的基本概念和 如何管理模块定义

通过策略生成资源

通过 Policy 生成资源类似于 Trait ,策略可用于跨 component 定义事物。

让我们使用 vela def init 创建一个基本的策略脚手架:

  1. vela def init my-plc -t policy --desc "My ingress route policy." > myroute.cue

我们希望创建一个这样的脚手架:

  1. $ cat myroute.cue
  2. "my-plc": {
  3. annotations: {}
  4. attributes: {}
  5. description: "My ingress route policy."
  6. labels: {}
  7. type: "policy"
  8. }
  9. template: {
  10. }

规则要和 component 定义保持一致,必须制定 outputoutputs 可用于多个对象,格式如下:

  1. output: {
  2. <full template data>
  3. }
  4. outputs: <unique-name>:
  5. <full template data>

如下是一个通过策略创建流量拆分服务网格对象的示例。

  1. "my-plc": {
  2. description: "My service mesh policy."
  3. type: "policy"
  4. }
  5. template: {
  6. #ServerWeight: {
  7. service: string
  8. weight: int
  9. }
  10. parameter: {
  11. weights: [...#ServerWeight]
  12. }
  13. output: {
  14. apiVersion: "split.smi-spec.io/v1alpha3"
  15. kind: "TrafficSplit"
  16. metadata: name: context.name
  17. spec: {
  18. service: context.name
  19. backends: parameter.weights
  20. }
  21. }
  22. }

把这个 Trait 应用到控制平面来使其生效:

  1. vela def apply myroute.cue

随后我们的终端用户可以立即发现并在 Application 中使用这个 Trait。

执行 vela up 命令后:

  1. cat <<EOF | vela up -f -
  2. apiVersion: core.oam.dev/v1beta1
  3. kind: Application
  4. metadata:
  5. name: my-test-2
  6. spec:
  7. components:
  8. - name: server-v1
  9. type: webservice
  10. properties:
  11. image: oamdev/hello-world:v1
  12. - name: server-v2
  13. type: webservice
  14. properties:
  15. image: oamdev/hello-world:v2
  16. policies:
  17. - type: my-plc
  18. name: unified
  19. properties:
  20. weights:
  21. - service: server-v1
  22. weight: 80
  23. - service: server-v2
  24. weight: 20
  25. EOF

该策略由 KubeVela 生成如下所示的 Kubernetes 资源:

  1. apiVersion: split.smi-spec.io/v1alpha3
  2. kind: TrafficSplit
  3. metadata:
  4. name: unified
  5. namespace: default
  6. spec:
  7. backends:
  8. - service: server-v1
  9. weight: 80
  10. - service: server-v2
  11. weight: 20
  12. service: unified

如果需要,你可以在策略中定义任何 Kubernetes API 对象。

特殊策略

并不是所有的策略都可以生成资源, 有几个 内置策略 用于控制整个交付过程和工作流程。这些特殊策略通常编写在 application controller 中。

下一步