Version: v1.0

如何定义

在本节中,我们将介绍如何定义 Trait。

简单 Trait

可以通过简单地参考现有的 Kubernetes API 资源来定义 KubeVela 中的 Trait。

  1. apiVersion: core.oam.dev/v1beta1
  2. kind: TraitDefinition
  3. metadata:
  4. name: ingress
  5. spec:
  6. definitionRef:
  7. name: ingresses.networking.k8s.io

让我们将此 Trait 附加到 Application 中的 Component 实例:

  1. apiVersion: core.oam.dev/v1beta1
  2. kind: Application
  3. metadata:
  4. name: testapp
  5. spec:
  6. components:
  7. - name: express-server
  8. type: webservice
  9. properties:
  10. cmd:
  11. - node
  12. - server.js
  13. image: oamdev/testapp:v1
  14. port: 8080
  15. traits:
  16. - type: ingress
  17. properties:
  18. rules:
  19. - http:
  20. paths:
  21. - path: /testpath
  22. pathType: Prefix
  23. backend:
  24. service:
  25. name: test
  26. port:
  27. number: 80

注意在这个例子中,所引用资源的 spec 中的所有字段都将向最终用户公开,并且不允许将任何元数据(例如 annotations 等)设置为 Trait 的属性。 因此,当你希望将自己的 CRD 和控制器作为 Trait 时,通常使用此方法,并且它不依赖 annotations 等作为调整手段。

使用 CUE 来构建 Trait

也推荐使用 CUE 的方式来定义 Trait。在这个例子中,它带有抽象,你可以完全灵活地根据需要来模板化任何资源和字段。请注意,KubeVela 要求所有 Trait 必须在 CUE 模板的 outputs 部分(而非 output )中定义,格式如下:

  1. outputs: <unique-name>:
  2. <full template data>

以下是 ingress 的 Trait 示例。

  1. apiVersion: core.oam.dev/v1beta1
  2. kind: TraitDefinition
  3. metadata:
  4. name: ingress
  5. spec:
  6. podDisruptive: false
  7. schematic:
  8. cue:
  9. template: |
  10. parameter: {
  11. domain: string
  12. http: [string]: int
  13. }
  14. // trait template can have multiple outputs in one trait
  15. outputs: service: {
  16. apiVersion: "v1"
  17. kind: "Service"
  18. spec: {
  19. selector:
  20. app: context.name
  21. ports: [
  22. for k, v in parameter.http {
  23. port: v
  24. targetPort: v
  25. },
  26. ]
  27. }
  28. }
  29. outputs: ingress: {
  30. apiVersion: "networking.k8s.io/v1beta1"
  31. kind: "Ingress"
  32. metadata:
  33. name: context.name
  34. spec: {
  35. rules: [{
  36. host: parameter.domain
  37. http: {
  38. paths: [
  39. for k, v in parameter.http {
  40. path: k
  41. backend: {
  42. serviceName: context.name
  43. servicePort: v
  44. }
  45. },
  46. ]
  47. }
  48. }]
  49. }
  50. }

让我们将此 Trait 附加到Application中的 Component 实例中:

  1. apiVersion: core.oam.dev/v1beta1
  2. kind: Application
  3. metadata:
  4. name: testapp
  5. spec:
  6. components:
  7. - name: express-server
  8. type: webservice
  9. properties:
  10. cmd:
  11. - node
  12. - server.js
  13. image: oamdev/testapp:v1
  14. port: 8080
  15. traits:
  16. - type: ingress
  17. properties:
  18. domain: test.my.domain
  19. http:
  20. "/api": 8080

基于 CUE 的 Trait 定义还可以支持许多其他高级方案,例如修补和数据传递。 在接下来的文档中将对它们进行详细说明。