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 的模型定义,这样可以实现资源定义的多版本兼容能力。

相关推荐
颜淡慕潇6 小时前
【K8S问题系列 | 9】如何监控集群CPU使用率并设置告警?
后端·云原生·容器·kubernetes·问题解决
运维&陈同学6 小时前
【模块一】kubernetes容器编排进阶实战之k8s基础概念
运维·docker·云原生·容器·kubernetes·云计算
研究司马懿11 小时前
【Golang】Go语言环境安装
开发语言·后端·云原生·golang·二开
free_girl_fang12 小时前
SpringClud一站式学习之Eureka服务治理(二)
学习·云原生·eureka
Hello.Reader12 小时前
解析Eureka的架构
云原生·eureka·架构
容器魔方13 小时前
KubeEdge 1.19.0版本发布!更完备的节点设备能力,全新的Dashboard体验
云原生·容器·云计算
颜淡慕潇18 小时前
【K8S系列 】在K8S集群怎么查看各个pod占用的资源大小与详细解决方案【已解决】
后端·云原生·容器·kubernetes·问题解决
颜淡慕潇18 小时前
【K8S问题系列 | 10】在K8S集群怎么查看各个pod占用的资源大小?【已解决】
后端·云原生·容器·kubernetes·问题解决
运维小文19 小时前
K8S资源介绍之configmap
docker·云原生·容器·kubernetes
小安运维日记19 小时前
CKA认证 | Day1 k8s核心概念与集群搭建
运维·云原生·容器·kubernetes·云计算·k8s