编辑管理模块定义

    vela def init 是一个用来帮助用户初始化新的 Definition 的脚手架命令。用户可以通过 vela def init my-trait -t trait --desc "My trait description." 来创建一个新的空白 TraitDefinition ,如下

    或者是采用 vela def init my-comp --interactive 来交互式地创建新的 Definition 。

    1. $ vela def init my-comp --interactive
    2. Please choose one definition type from the following values: component, trait, policy, workload, scope, workflow-step
    3. > Definition type: component
    4. > Definition description: My component definition.
    5. Please enter the location the template YAML file to build definition. Leave it empty to generate default template.
    6. > Definition template filename:
    7. Please enter the output location of the generated definition. Leave it empty to print definition to stdout.
    8. > Definition output filename: my-component.cue
    9. Definition written to my-component.cue

    除此之外,如果用户创建 ComponentDefinition 的目的是一个 Deployment(或者是其他的 Kubernetes Object ),而这个 Deployment 已经有了 YAML 格式的模版,用户还可以通过 --template-yaml 参数来完成从 YAML 到 CUE 的自动转换。例如如下的 my-deployment.yaml

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. name: hello-world
    5. spec:
    6. replicas: 1
    7. selector:
    8. matchLabels:
    9. app.kubernetes.io/name: hello-world
    10. template:
    11. metadata:
    12. labels:
    13. app.kubernetes.io/name: hello-world
    14. spec:
    15. containers:
    16. - name: hello-world
    17. image: somefive/hello-world
    18. ports:
    19. - name: http
    20. containerPort: 80
    21. protocol: TCP
    22. ---
    23. apiVersion: v1
    24. metadata:
    25. name: hello-world-service
    26. selector:
    27. app: hello-world
    28. ports:
    29. - name: http
    30. protocol: TCP
    31. port: 80
    32. targetPort: 8080
    33. type: LoadBalancer

    接下来,用户就可以在该文件的基础上进一步做进一步的修改了。比如将属性中对于 workload.definition 中的 \<change me> 去掉。

    在初始化 Definition 文件之后,可以运行 vela def vet my-comp.cue 来校验 Definition 是否在语法上有错误。比如如果少写了一个括号,该命令能够帮助用户识别出来。

    1. $ vela def vet my-comp.cue
    2. Validation succeed.

    确认 Definition 撰写无误后,开发者可以运行 vela def apply my-comp.cue --namespace my-namespace 来将该 Definition 应用在 Kubernetes 的 my-namespace 命名空间中。如果想了解一下 CUE 格式的 Definition 文件会被渲染成什么样的 Kubernetes YAML 文件,可以使用 vela def apply my-comp.cue --dry-run 或者 vela def render my-comp.cue -o my-comp.yaml 来预先渲染一下 YAML 文件进行确认。

    1. apiVersion: core.oam.dev/v1beta1
    2. kind: ComponentDefinition
    3. metadata:
    4. annotations:
    5. definition.oam.dev/description: My component.
    6. labels: {}
    7. name: my-comp
    8. namespace: vela-system
    9. spec:
    10. schematic:
    11. cue:
    12. template: |
    13. output: {
    14. metadata: name: "hello-world"
    15. spec: {
    16. replicas: 1
    17. selector: matchLabels: "app.kubernetes.io/name": "hello-world"
    18. template: {
    19. metadata: labels: "app.kubernetes.io/name": "hello-world"
    20. spec: containers: [{
    21. name: "hello-world"
    22. image: "somefive/hello-world"
    23. ports: [{
    24. name: "http"
    25. }]
    26. }]
    27. }
    28. }
    29. apiVersion: "apps/v11"
    30. kind: "Deployment"
    31. }
    32. outputs: "hello-world-service": {
    33. metadata: name: "hello-world-service"
    34. spec: {
    35. ports: [{
    36. name: "http"
    37. protocol: "TCP"
    38. port: 80
    39. targetPort: 8080
    40. }]
    41. selector: app: "hello-world"
    42. type: "LoadBalancer"
    43. }
    44. apiVersion: "v1"
    45. kind: "Service"
    46. }
    47. parameter: {}
    48. workload:
    49. definition:
    50. apiVersion: apps/v1
    51. kind: Deployment
    1. $ vela def get my-comp -t component

    或者用户可以通过 vela def list 命令来查看当前系统中安装的所有 Definition(可以指定命名空间及类型)。

    1. $ vela def list -n my-namespace -t component
    2. NAME TYPE NAMESPACE DESCRIPTION
    3. my-comp ComponentDefinition my-namespace My component.

    同样的,在使用 vela def edit 命令来编辑 Definition 时,用户也只需要对转换过的 CUE 格式 Definition 进行修改,该命令会自动完成格式转换。用户也可以通过设定环境变量 EDITOR 来使用自己想要使用的编辑器。

    类似的,用户可以运行 vela def del 来删除相应的 Definition。

    1. $ vela def del my-comp -n my-namespace
    2. Are you sure to delete the following definition in namespace my-namespace?
    3. ComponentDefinition my-comp: My component.
    4. [yes|no] > yes
    • 了解如何使用 CUE 。