Version: v1.2

状态回写

本文档将为你讲解,如何通过 CUE 模版在定义对象时实现状态回写。

健康检查

不管是组件定义中,还是运维特征定义中,健康检查对应的配置项都是 spec.status.healthPolicy。如果没有定义,它的值默认是 true

在 CUE 里的关键词是 isHealth,CUE 表达式结果必须是 bool 类型。 KubeVela 运行时会一直检查 CUE 表达式,直至其状态显示为健康。每次控制器都会获取所有的 Kubernetes 资源,并将他们填充到 context 字段中。

所以 context 字段会包含如下信息:

  1. context:{
  2. name: <component name>
  3. appName: <app name>
  4. output: <Kubernetes workload resource>
  5. outputs: {
  6. <resource1>: <Kubernetes trait resource1>
  7. <resource2>: <Kubernetes trait resource2>
  8. }
  9. }

Trait 对象,没有 context.output 这个字段,其它字段相同。

我们看看健康检查的例子:

  1. apiVersion: core.oam.dev/v1beta1
  2. kind: ComponentDefinition
  3. spec:
  4. status:
  5. healthPolicy: |
  6. isHealth: (context.output.status.readyReplicas > 0) && (context.output.status.readyReplicas == context.output.status.replicas)
  7. ...
  1. apiVersion: core.oam.dev/v1beta1
  2. kind: TraitDefinition
  3. spec:
  4. status:
  5. healthPolicy: |
  6. isHealth: len(context.outputs.service.spec.clusterIP) > 0
  7. ...

健康检查的结果将会记录到 Application 对象中。

  1. apiVersion: core.oam.dev/v1beta1
  2. kind: Application
  3. spec:
  4. components:
  5. - name: myweb
  6. type: worker
  7. properties:
  8. cmd:
  9. - sleep
  10. - "1000"
  11. enemies: alien
  12. image: busybox
  13. lives: "3"
  14. traits:
  15. - type: ingress
  16. properties:
  17. domain: www.example.com
  18. http:
  19. /: 80
  20. status:
  21. ...
  22. services:
  23. - healthy: true
  24. message: "type: busybox,\t enemies:alien"
  25. name: myweb
  26. traits:
  27. - healthy: true
  28. message: 'Visiting URL: www.example.com, IP: 47.111.233.220'
  29. type: ingress
  30. status: running

自定义状态

不管是组件定义中,还是运维特征定义中,自定义状态对应的配置项都是 spec.status.customStatus

在 CUE 中的关键词是 message。同时,CUE 表达式的结果必须是 string 类型。

自定义状态和健康检查的原理一致。Application 对象的 CRD 控制器都会检查 CUE 表达式,直至显示健康通过。

context 字段包含如下信息:

  1. context:{
  2. name: <component name>
  3. appName: <app name>
  4. output: <Kubernetes workload resource>
  5. outputs: {
  6. <resource1>: <Kubernetes trait resource1>
  7. <resource2>: <Kubernetes trait resource2>
  8. }
  9. }

Trait 对象不会有 context.output 这个字段, 其它字段一致.

查看示例:

  1. apiVersion: core.oam.dev/v1beta1
  2. kind: ComponentDefinition
  3. spec:
  4. status:
  5. customStatus: |-
  6. message: "type: " + context.output.spec.template.spec.containers[0].image + ",\t enemies:" + context.outputs.gameconfig.data.enemies
  7. ...
  1. apiVersion: core.oam.dev/v1beta1
  2. kind: TraitDefinition
  3. spec:
  4. status:
  5. customStatus: |-
  6. message: "type: "+ context.outputs.service.spec.type +",\t clusterIP:"+ context.outputs.service.spec.clusterIP+",\t ports:"+ "\(context.outputs.service.spec.ports[0].port)"+",\t domain"+context.outputs.ingress.spec.rules[0].host
  7. ...