Что такое ККЛ

Kusion Configuration Language (KCL) — это открытый исходный код, основанный на ограничениях и функциональный язык. KCL упрощает написание многочисленных сложных конфигураций, таких как облачные сценарии, благодаря своей зрелой технологии языка программирования и практике. Он предназначен для создания лучшей модульности, масштабируемости и стабильности конфигураций, более простого написания логики, более быстрой автоматизации и отличной экологической расширяемости.

Рис. 1: Введение в KCL.

Рис. 2: Детская площадка KCL.

Обзор производительности

KCL работает лучше, чем CUE/Jsonnet/HCL и другие языки, в сценариях с большим размером кода или высокой вычислительной нагрузкой (CUE и другие языки ограничены накладными расходами на проверку ограничений во время выполнения, в то время как KCL является статически компилируемым языком).

  • CUE (тест.cue)
import "list"

temp: {
        for i, _ in list.Range(0, 10000, 1) {
                "a\(i)": list.Max([1, 2])
        }
}
  • KCL (тест.k)
a = lambda x: int, y: int -> int {
    max([x, y])
}
temp = {"a${i}": a(1, 2) for i in range(10000)}
  • Jsonnet (test.jsonnet)
local a(x, y) = std.max(x, y);
{
    temp: {["a%d" % i]: a(1, 2) for i in std.range(0, 10000)},
}
  • Terraform HCL (test.tf. Поскольку функция terraform range поддерживает только до 1024 итераторов, range(10000) делится на 10 поддиапазонов)
output "r1" {
  value = {for s in range(0, 1000) : format("a%d", s) => max(1, 2)}
}
output "r2" {
  value = {for s in range(1000, 2000) : format("a%d", s) => max(1, 2)}
}
output "r3" {
  value = {for s in range(1000, 2000) : format("a%d", s) => max(1, 2)}
}
output "r4" {
  value = {for s in range(2000, 3000) : format("a%d", s) => max(1, 2)}
}
output "r5" {
  value = {for s in range(3000, 4000) : format("a%d", s) => max(1, 2)}
}
output "r6" {
  value = {for s in range(5000, 6000) : format("a%d", s) => max(1, 2)}
}
output "r7" {
  value = {for s in range(6000, 7000) : format("a%d", s) => max(1, 2)}
}
output "r8" {
  value = {for s in range(7000, 8000) : format("a%d", s) => max(1, 2)}
}
output "r9" {
  value = {for s in range(8000, 9000) : format("a%d", s) => max(1, 2)}
}
output "r10" {
  value = {for s in range(9000, 10000) : format("a%d", s) => max(1, 2)}
}
  • Время выполнения (учитывая фактическую стоимость ресурсов производственной среды, этот тест относится к одному ядру).

Рис. 3: Производительность в простом случае.

Окружающая среда: ОС: macOS 10.15.7; ЦП: Intel(R) Core(TM) i7–8850H с тактовой частотой 2,60 ГГц; Память: 32 ГБ DDR4 2400 МГц; нет НУМА

Еще одно сложное дело

Использование KCL и CUE для записи конфигурации Kubernetes.

  • CUE (тест.cue)
package templates

import (
 apps "k8s.io/api/apps/v1"
)
deployment: apps.#Deployment
deployment: {
 apiVersion: "apps/v1"
 kind:       "Deployment"
 metadata: {
  name:   "me"
  labels: me: "me"
 }
}
  • KCL (тест.к)
import kubernetes.api.apps.v1

deployment = v1.Deployment {
    metadata.name = "me"
    metadata.labels.name = "me"
}

Рис. 4: Производительность в сложном случае.

Основные функции и варианты использования KCL

Основными функциями KCL являются его возможности моделирования и ограничения, а основные функции KCL вращаются вокруг двух основных функций. Кроме того, KCL следует концепции конфигурации, ориентированной на пользователя, для разработки своих основных функций, которые можно понять с двух точек зрения:

  • Представление конфигурации, ориентированное на модель предметной области: благодаря богатым функциям языка KCL и инструментам KCL OpenAPI мы можем напрямую интегрировать широкий спектр хорошо разработанных моделей в сообществе в KCL (например, модель ресурсов K8s). Мы также можем разрабатывать и внедрять собственные модели или библиотеки KCL в соответствии с различными сценариями, формируя полный набор моделей предметной области для использования другими конечными пользователями конфигурации.
  • Представление конфигурации, ориентированное на конечного пользователя: благодаря возможностям инкапсуляции, абстракции и повторного использования кода KCL архитектура модели может быть дополнительно абстрагирована и упрощена (например, модель ресурсов K8s абстрагируется в модель сервера, ориентированную на приложения), чтобы свести к минимуму участие конечного пользователя. ввод конфигурации, упростить пользовательский интерфейс конфигурации и облегчить ручную или автоматическую модификацию API.

Независимо от того, на каком представлении конфигурации сосредоточено, для кода конфигурации существуют требования к ограничениям данных конфигурации, таким как ограничения типов, обязательные/необязательные ограничения атрибутов конфигурации, ограничения диапазона и ограничения неизменности. Это также одна из основных проблем, которую KCL стремится решить. KCL в основном содержит основные функции, показанные на рис. 5.

Рис. 5: Основные характеристики KCL.

  • Простота в использовании: создана на основе языков высокого уровня, таких как Python и Golang, включает в себя функции функционального языка с минимальными побочными эффектами.
  • Хорошо спроектированный: независимый синтаксис, семантика, среда выполнения и системные модули, основанные на спецификации.
  • Быстрое моделирование: ориентированные на схему типы конфигурации и модульная абстракция.
  • Широкие возможности: Конфигурация с типом, логикой и политикой на основе Конфигурации, Схемы, Лямбда и Правила.
  • Стабильность: стабильность конфигурации на основе статической системы типов, ограничений и правил.
  • Масштабируемость: высокая масштабируемость благодаря механизму автоматического слияния изолированных блоков конфигурации.
  • Быстрая автоматизация: Градиентная схема автоматизации CRUD API, многоязычные SDK, языковой плагин
  • Высокая производительность: высокое время компиляции и производительность во время выполнения с использованием Rust & C и LLVM, а также поддержка компиляции в собственный код и WASM.
  • Соответствие API: встроенная поддержка экологических спецификаций API, таких как OpenAPI, Kubernetes CRD, спецификация Kubernetes YAML.
  • Удобство разработки: Удобный опыт разработки с богатыми языковыми инструментами (Format, Lint, Test, Vet, Doc и т. д.) и плагинами IDE.
  • Безопасность и удобство обслуживания. Ориентированность на предметную область, отсутствие системных функций, таких как встроенные потоки и ввод-вывод, низкий уровень шума и угроз безопасности, простота обслуживания и управления.
  • Богатый многоязычный API: Богатый многоязычный API: Go, Python и REST API соответствуют различным сценариям и прелюдии к использованию приложений.

Рис. 6: Конструкция сердечника KCL.

Дополнительные сведения о языковом дизайне и возможностях см. в разделе Документы KCL. Хотя KCL не является языком общего назначения, у него есть соответствующие сценарии применения. Как показано на рис. 6, разработчики могут писать конфигурацию, схему, функцию и правило с помощью KCL, где конфигурация используется для определения данных, схема используется для описания определения модели данных, правило используется для проверки данных и схема и правило также могут быть объединены для использования моделей и ограничений, которые полностью описывают данные. Кроме того, мы также можем использовать чистую лямбда-функцию в KCL для организации кода данных, инкапсуляции общего кода и прямого вызова его при необходимости.

Для вариантов использования KCL может выполнять определение и абстракцию модели сложной конфигурации проверки структурированных данных K-V, проверку жестких ограничений во избежание ошибок конфигурации, интеграцию автоматизации и инженерное расширение. Эти функции и варианты использования описаны ниже.

Вы можете использовать KCL для

Проверка структурированных данных

Как показано на рис. 7, KCL поддерживает проверку формата данных JSON/YAML. Как язык конфигурации, KCL охватывает почти все функции OpenAPI с точки зрения проверки. В KCL данные конфигурации могут быть ограничены определением структуры. В то же время он поддерживает определяемые пользователем правила ограничения с помощью блоков проверки и написания выражений проверки в схеме для проверки и ограничения атрибутов, определенных в схеме. Выражение проверки можно использовать для четкой и простой проверки того, соответствует ли входной JSON/YAML соответствующему определению структуры схемы и ограничениям проверки.

Рис. 7: Проверка структурированных данных в KCL.

Исходя из этого, KCL предоставляет соответствующий Инструмент проверки для непосредственной проверки данных JSON/YAML. Кроме того, на основе этой возможности мы можем создать продукт визуализации проверки K-V, как показано на рис. 8.

Рис. 8: Продукт визуализации проверки K-V на основе KCL.

Определение и абстракция модели сложной конфигурации

Как показано на рис. 9, с помощью инструмента KCL OpenAPI мы можем напрямую интегрировать широкий спектр хорошо спроектированных моделей.

Рис. 9: Общий способ моделирования сложной конфигурации KCL.

Как показано на рисунке 10, Konfig используется для управления всеми кодами конфигурации KCL, код бизнес-конфигурации и код базовой конфигурации хранятся в монорепозитории, что облегчает управление зависимостями версий между кодами, а автоматическая обработка системы относительно проста. . Достаточно найти директорию и файлы уникальной кодовой базы. Коды взаимосвязаны, управляются единообразно, их легко найти, изменить и поддерживать. Кроме того, единый процесс CI/CD можно использовать для управления конфигурацией.

Рис. 10. Использование языковых возможностей KCL для интеграции моделей предметной области и пользовательских моделей.

Сильное ограничение для избежания ошибок

Как показано на рис. 11, ошибок конфигурации можно избежать с помощью надежных методов проверки ограничений в KCL.

Рис. 11: Методы проверки сильных ограничений в KCL.

  • Система типов языка KCL спроектирована так, чтобы быть статической. Определения типа и значения разделены. Поддерживается вывод типов и проверка типов во время компиляции. Статические типы могут не только заранее анализировать большинство ошибок типов во время компиляции, но и снижать потери производительности при проверке динамических типов во время выполнения. Кроме того, атрибуты схемы KCL принудительно должны быть не нулевыми, что позволяет эффективно избежать пропусков конфигурации.
  • При объявлении экспортируемых конфигураций KCL их типы и значения не могут изменяться. Эта статическая функция гарантирует, что конфигурация не будет изменена по желанию.
  • KCL поддерживает дальнейшее обеспечение стабильности за счет встроенных в структуру правил проверки. Например, на рис. 12 показано, что код KCL определяет ограничения для containerPort, services и volumes в App.

Рис. 12: Проверка кода KCL с правилами ограничения.

Объединение блоков изолированной конфигурации

KCL предоставляет возможность писать изолированные блоки конфигурации и автоматически объединять их, а также поддерживает идемпотентное слияние, слияние исправлений и другие стратегии. Множественные конфигурации при идемпотентном слиянии должны соответствовать закону обмена, а разработчикам необходимо вручную обрабатывать конфликты конфигураций между базой и различными средами. Слияние патчей включает в себя наложение, удаление и добавление. KCL упрощает совместную разработку на стороне пользователя и уменьшает связь между конфигурациями за счет нескольких стратегий слияния.

Рис. 13: Написание блока конфигурации сценария с несколькими средами.

Автоматизация

KCL предоставляет множество возможностей, связанных с автоматизацией, в основном включая инструменты и многоязычные API. В режиме package_identifier : key_identifier KCL поддерживает индексирование любого настроенного значения ключа, таким образом завершая добавление, удаление, изменение и запрос любого значения ключа. Например, на рис. 14 показано, что мы можем напрямую выполнить следующую команду для изменения изображения. Разница в коде до и после модификации также показана на рис. 14.

Рис. 14: Автоматическое изменение образа конфигурации приложения через KCL CLI/API.

Кроме того, возможности автоматизации KCL могут быть реализованы и интегрированы в CI/CD, как показано на рис. 15.

Рис. 15: Типичная интеграция автоматизации KCL.

Ссылка