CUE-云原生配置语言

CUE 是一种服务于云化配置的强类型配置语言,由 Go team 成员 Marcel van Lohiuzen 结合 BCL 及多种其他语言研发并开源,可以说是 BCL 思路的开源版实现CUE 是一种服务于云化配置的强类型配置语言,由 Go team 成员 Marcel van Lohiuzen 结合 BCL 及多种其他语言研发并开源,可以说是 BCL 思路的开源版实现

https://cuelang.org/docs/concept/popular-guides/#common-use-cases

Cue的语法类似于JSON,但提供了更多的类型检查和验证功能。Cue不是基于Go语言,但是它的实现是用Go编写的,而且它可以与Go语言集成。

Cue语言的一个主要特点是它支持声明式的数据验证和约束。这意味着你可以用Cue来定义你的数据结构和数据的约束条件,然后Cue会根据这些约束条件进行类型检查和数据验证,以确保你的数据符合预期的规范。这些功能使得Cue非常适合用于数据处理和数据验证场景,例如配置文件、API参数验证、数据转换等。

在Cue中,你可以定义结构体、列表、枚举等数据类型,并且可以在这些数据类型中添加约束条件,例如正则表达式、最大长度、最小值等等。Cue还支持函数和表达式,这使得你可以编写复杂的验证逻辑和转换逻辑。

如果你想在Go程序中使用Cue,你可以使用Cue的Go SDK。Go SDK提供了一组API,用于加载和解析Cue定义的数据结构,进行类型检查和数据验证,并将验证结果返回给你的Go程序。你还可以使用Cue来生成Go代码,以便在Go程序中使用Cue定义的数据结构和验证规则。

在kubevela使用:

properties 复制代码
template: |
  parameter: {
      domain: string
      http: [string]: int
  }


  // trait template can have multiple outputs in one trait
  outputs: service: {
      apiVersion: "v1"
      kind:       "Service"
      spec: {
          selector:
              app: context.name
          ports: [
              for k, v in parameter.http {
                  port:       v
                  targetPort: v
              },
          ]
      }
  }


  outputs: ingress: {
      apiVersion: "networking.k8s.io/v1beta1"
      kind:       "Ingress"
      metadata:
          name: context.name
      spec: {
          rules: [{
              host: parameter.domain
              http: {
                  paths: [
                      for k, v in parameter.http {
                          path: k
                          backend: {
                              serviceName: context.name
                              servicePort: v
                          }
                      },
                  ]
              }
          }]
      }
  }

可以看到,只需要传入 parameter,就可以得到包含 Service和 Ingress的 output

在k8s中的使用:

CUE 的另一大杀器,可以针对原生 Kubernetes 源码生成描述 cue 文件,所有 k8s 资源相关的配置文件,都可以天然地拥有 schema 校验。具体教程可以查看 Kubernetes tutorial。

properties 复制代码
package templates


import (
 apps "k8s.io/api/apps/v1"
)


deployment: apps.#Deployment


deployment: {
 apiVersion: "apps/v1"
 kind:       "Deployment"
 metadata: {
  name:   deployment_name
  labels: _labels
 }
...

类似这个例子中,我们定义的 deployment 将会通过 apps.#Deployment 校验,轻松检测出不合法的字段。理论上,你可以针对多个不同版本的 k8s 资源都生成 cue 文件,并且都作为 deployment 的模型定义,这样可以实现资源定义的多版本兼容能力。

相关推荐
液态不合群2 小时前
低代码革命:加速云原生时代的端到端产品创新
低代码·云原生
沛沛老爹10 小时前
服务监控插件全览:提升微服务可观测性的利器
微服务·云原生·架构·datadog·influx·graphite
huaqianzkh11 小时前
了解华为云容器引擎(Cloud Container Engine)
云原生·架构·华为云
Alone804611 小时前
K8s中HPA自动扩缩容及hml
云原生·容器·kubernetes
HoweWWW13 小时前
k8s-API 访问控制
云原生·容器·kubernetes
星辰@Sea13 小时前
服务注册中心对比及使用场景分析
java·云原生
专家大圣17 小时前
云原生信息安全:筑牢数字化时代的安全防线
安全·云原生
数据智能老司机20 小时前
Kubernetes从入门到精通系列——外部 DNS 和全局负载均衡
云原生·容器·kubernetes
华为云开源1 天前
openGemini 社区人才培养计划:助力成长,培养新一代云原生数据库人才
数据库·云原生·开源
ZHOU西口1 天前
微服务实战系列之玩转Docker(十五)
nginx·docker·微服务·云原生·swarm·docker swarm·dockerui