Что такое ККЛ
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 для
- Генерировать низкоуровневые статические данные конфигурации, такие как JSON, YAML и т. д., или интегрировать с существующими данными.
- Сокращение шаблонов в данных конфигурации с помощью моделирования схемы.
- Определяйте схемы с ограничениями правил для данных конфигурации и проверяйте их автоматически.
- Организовывайте, упрощайте, унифицируйте и управляйте большими конфигурациями без побочных эффектов с помощью градиентных схем автоматизации.
- Масштабируемое управление большими конфигурациями с помощью изолированных блоков конфигурации.
- Используется в качестве языка инженерного программирования платформы для доставки современных приложений с помощью Kusion Stack.
Проверка структурированных данных
Как показано на рис. 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.
Ссылка
- Блог KusionStack Cloud Native Configuration: https://kusionstack.io/blog/2021-kusion-intro
- Язык Terraform: https://www.terraform.io/language
- Поставщик Terraform Kubernetes: https://github.com/hashicorp/terraform-provider-kubernetes
- Поставщик Terraform AWS: https://github.com/hashicorp/terraform-provider-aws
- Пулуми: https://www.pulumi.com/docs/
- Пулуми против Терраформ: https://www.pulumi.com/docs/intro/vs/terraform/
- Дизайн конфигурации рабочей книги Google SRE: https://sre.google/workbook/configuration-design/
- Бумага Google Borg: https://storage.googleapis.com/pub-tools-public-publication-data/pdf/43438.pdf
- Целостное управление конфигурацией в Facebook: https://sigops.org/s/conferences/sosp/2015/current/2015-Monterey/printable/008-tang.pdf
- Спецификация JSON: https://www.json.org/json-en.html
- Спецификация YAML: https://yaml.org/spec/
- GCL: https://github.com/rix0rrr/gcl
- HCL: https://github.com/hashicorp/hcl
- CUE: https://github.com/cue-lang/cue
- Jsonnet: https://github.com/google/jsonnet
- Дахолл: https://github.com/dhall-lang/dhall-lang
- Бережливость: https://github.com/Thriftpy/thriftpy2
- Настройка: https://kustomize.io/
- Кубе-линтер: https://github.com/stackrox/kube-linter
- Чеков: https://github.com/bridgecrewio/checkov
- Документы KCL: https://kcl-lang.io/docs/reference/lang/tour
- Как работает Terraform: визуальное введение: https://betterprogramming.pub/how-terraform-works-a-visual-intro-6328cddbe067
- Как работает Terraform: проиллюстрировано модули: https://awstip.com/terraform-modules-illustrate-26cbc48be83a
- Шлем: https://helm.sh/
- Шлем против Кастомизе: https://harness.io/blog/helm-vs-kustomize
- КубеВела: https://kubevela.io/docs/