自定义运维特征

    本节介绍如何自定义运维特征,为用户的组件增添任何需要的运维特征能力。

    请先阅读和理解 运维特征定义

    如何使用

    我们首先为你展示一个简单的示例,比如直接引用已有的 Kubernetes API 资源 Ingress。来编写一个下面这样的 YAML 文件:

    为了和我们已经内置的 ingress 有所区分,我们将其命名为 。然后我们部署到运行时集群:

    1. $ kubectl apply -f customize-ingress.yaml
    2. traitdefinition.core.oam.dev/customize-ingress created

    最后用户只需要把这个自定义的运维特征,放入一个与之匹配的组件中进行使用即可:

    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: customize-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

    参照上面的开发过程,你可以继续自定义其它需要的 Kubernetes 资源来提供给你的用户。

    请注意:这种自定义运维特征的方式中,是无法设置诸如 annotations 这样的元信息(metadata),来作为运维特征属性的。也就是说,当你只想简单引入自己的 CRD 资源或者控制器作为运维特征时,可以遵循这种做法。

    使用 CUE 来自定义运维特征

    我们更推荐你使用 CUE 模版来自定义运维特征。这种方法给你可以模版化任何资源和资源的灵活性。比如,我们可以组合自定义 Serviceingeress 成为一个运维特征来使用。

    我们下面同样使用一个 ingressService 的示例进行讲解:

    1. apiVersion: core.oam.dev/v1beta1
    2. kind: TraitDefinition
    3. metadata:
    4. spec:
    5. schematic:
    6. cue:
    7. template: |
    8. parameter: {
    9. domain: string
    10. http: [string]: int
    11. }
    12. // 我们可以在一个运维特征 CUE 模版定义多个 outputs
    13. outputs: service: {
    14. apiVersion: "v1"
    15. kind: "Service"
    16. metadata: {
    17. annotations: {
    18. address-type: "intranet"
    19. }
    20. }
    21. spec: {
    22. selector:
    23. app: context.name
    24. ports: [
    25. for k, v in parameter.http {
    26. port: v
    27. targetPort: v
    28. },
    29. ]
    30. type: "LoadBalancer"
    31. }
    32. }
    33. outputs: ingress: {
    34. apiVersion: "networking.k8s.io/v1beta1"
    35. kind: "Ingress"
    36. spec: {
    37. rules: [{
    38. host: parameter.domain
    39. http: {
    40. paths: [
    41. for k, v in parameter.http {
    42. path: k
    43. backend: {
    44. serviceName: context.name
    45. servicePort: v
    46. }
    47. },
    48. ]
    49. }
    50. }]
    51. }
    52. }

    可以看到,parameter 字段让我们可以自由自定义和传递业务参数。同时在 metadataannotations 里可以标记任何你们需要的信息,我们上文的例子里标记了 Service 是一个给内网使用的负载均衡。

    接下来我们把这个 cue-ingress YMAL 部署到运行时集群,成功之后用户同样可以通过 vela traits 命令,查看到这个新生成的运维特征:

    最后用户将这个运维特征放入对应组件,通过应用部署计划完成交付:

    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: cue-ingress
    17. properties:
    18. domain: test.my.domain