Введение
Команда KCL рада сообщить, что KCL v0.5.0 теперь доступен! В этом выпуске всем доступны три ключевых обновления: язык, инструменты и интеграции.
- Используйте язык KCL и интегрированную среду разработки с более полным набором функций и меньшим количеством ошибок, чтобы повысить удобство и эффективность написания кода.
- Используйте KPM, KCL OpenAPI, OCI Registry и другие инструменты, чтобы напрямую использовать собственные облачные модели доменов и делиться ими, сокращая затраты на обучение и практические занятия.
- Использование инструментов сообщества, таких как плагины Github Action, ArgoCD и Kubectl KCL, для интеграции и расширения поддержки для повышения эффективности автоматизации.
Вы можете посетить страницу выпуска KCL или веб-сайт KCL, чтобы получить ссылку для загрузки двоичного файла KCL и более подробную информацию о выпуске.
KCL — это открытый, основанный на ограничениях язык записи и функциональный язык. KCL улучшает написание многочисленных сложных конфигураций, таких как облачные сценарии, благодаря своей зрелой технологии языка программирования и практике. Он предназначен для создания лучшей модульности, масштабируемости и стабильности конфигураций, более простого написания логики, более быстрой автоматизации и отличных встроенных интеграций или интеграций на основе API.
Этот блог будет знакомить читателей с содержанием KCL v0.5.0 и последними разработками в сообществе KCL.
Язык
Вывод переменной верхнего уровня
В предыдущих версиях KCL выполнение следующего кода KCL не приводило к выводу YAML. В KCL v0.5.0 мы улучшили это и поддержали экспорт переменных верхнего уровня в конфигурацию YAML, чтобы уменьшить дополнительный код KCL и параметры командной строки, например для следующего кода KCL (main.k).
schema Nginx: http: Http schema Http: server: Server schema Server: listen: int | str location?: Location schema Location: root: str index: str Nginx { # Nginx will be output http.server = { listen = 80 location = { root = "/var/www/html" index = "index.html" } } }
В новой версии запуск кода KCL может напрямую получить следующий вывод:
$ kcl main.k http: server: listen: 80 location: root: /var/www/html index: index.html
Подробнее см. здесь.
Индекс Подпись
В предыдущих версиях KCL при однократном запуске инструмента командной строки KCL отображалось только одно сообщение об ошибке и предупреждение. В KCL v0.5.0 поддерживается возможность отображения нескольких ошибок и предупреждений в одной компиляции, а также улучшена информация об ошибках для повышения эффективности устранения ошибок кода KCL, например, для следующего кода KCL (main.k).
schema TeamSpec: fullName: str name = id shortName: str = name schema TeamMap: [n: str]: TeamSpec = TeamSpec { name = n # n is the schema index signature key alias, we can use it directly } teamMap = TeamMap { a.fullName = "alpha" b.fullName = "bravo" }
В новой версии запуск кода KCL может напрямую получить следующий результат.
$ kcl main.k teamMap: b: fullName: bravo name: b shortName: b a: fullName: alpha name: a shortName: a
Подробнее см. здесь.
Вывод обратной трассировки во время выполнения
В предыдущих версиях KCL при написании следующего кода KCL две конфигурации схемы с одинаковыми именами объединялись и выводились. В KCL v0.5.0 требовалось явно использовать оператор слияния атрибутов вместо оператора наложения атрибутов.
schema Fib: n1 = n - 1 n2 = n1 - 1 n: int value: int if n <= 1: value = [][n] # There is a index overflow runtime error. elif n == 2: value = 1 else: value = Fib {n = n1}.value + Fib {n = n2}.value fib8 = Fib {n = 4}.value
После выполнения мы получим следующее сообщение об ошибке
$ kcl main.k -d error[E3M38]: EvaluationError EvaluationError --> main.k:8 | 8 | value = [][n] # There is a index overflow runtime error. | list index out of range: 1 | note: backtrace: 1: __main__.Fib at main.k:8 2: __main__.Fib at main.k:12 3: __main__.Fib at main.k:12 4: main at main.k:14
Подробнее см. здесь.
Исправление
Ошибка типа в выражениях фильтра
До KCL v0.5.0 выражения фильтра возвращали неправильные типы (должны были возвращать тип итератора вместо типа итерируемого объекта). В KCL v0.5.0 мы исправили аналогичные проблемы.
schema Student: name: str grade: int students: [Student] = [ {name = "Alice", grade = 85} {name = "Bob", grade = 70} ] studentsGrade70: [Student] = filter s in students { s.grade == 70 } # Previously, we received a type mismatch error here. In KCL v0.5.0, we fixed similar issues.
Подробнее см. здесь.
Ошибка закрытия лямбда
В предыдущих версиях KCL для следующего кода KCL возникала ошибка, из-за которой атрибут versions
не назначался должным образом. В KCL v0.5.0 мы исправили аналогичные проблемы.
z = 1 add = lambda x { lambda y { x + y + z} } # `x` is the closure of the inner lambda. res = add(1)(1) # 3
Подробнее см. здесь.
Ошибка типа String Literal Union, содержащая символы UTF-8
В предыдущих версиях KCL использование типа объединения строкового литерала, содержащего символы UTF-8, приводило к непредвиденной ошибке типа. В версии KCL v0.5.0 мы исправили подобные проблемы.
msg: "无需容灾" | "标准型" | "流水型" = "流水型"
Подробнее см. здесь.
Инструменты и IDE
Инструмент KCL OpenAPI
Инструмент командной строки kcl-openapi поддерживает преобразование из спецификации OpenAPI в код KCL. Установку можно получить через go install
или curl
:
# go install go install kcl-lang.io/kcl-openapi@latest # curl install (MacOS & Linux) curl -fsSL https://kcl-lang.io/script/install-kcl-openapi.sh | /bin/bash
Оптимизация конвертации пакетов Kubernetes KCL
Версия v0.5.0 оптимизирует использование пакетов Kubernetes KCL:
- Встроенный пакет Kubernetes: KCL предоставляет готовые пакеты KCL для версий Kubernetes 1.14–1.27, которые можно получить с помощью инструмента управления пакетами
kpm pull k8s:<version>
. - Если вам нужно преобразовать другие версии модели KCL для Kubernetes самостоятельно, вы можете использовать следующий скрипт предварительной обработки, чтобы преобразовать файл
swagger.json
, загруженный из репозитория Kubernetes, в пакет KCL. Измените 1.27 следующей команды на нужную версию Kubernetes.
version=1.27 spec_path=swagger.json script_path=main.py wget https://raw.githubusercontent.com/kubernetes/kubernetes/release-${version}/api/openapi-spec/swagger.json -O swagger.json wget https://raw.githubusercontent.com/kcl-lang/kcl-openapi/main/scripts/preprocess/main.py -O main.py python3 ${script_path} ${spec_path} --omit-status --rename=io.k8s=k8s kcl-openapi generate model -f processed-${spec_path}
Ожидаемый результат выполнения скрипта — это соответствующая версия модели KCL Kubernetes, а сгенерированный путь — <workspace path>/models/k8s
.
$ tree models/k8s models/k8s ├── api │ ├── admissionregistration │ │ ├── v1 │ │ │ ├── match_condition.k │ │ │ ├── mutating_webhook.k │ │ │ ├── mutating_webhook_configuration.k │ │ │ ├── mutating_webhook_configuration_list.k │ │ │ ├── rule_with_operations.k │ │ │ ├── service_reference.k │ │ │ ├── validating_webhook.k ...
Исправление
- Экранируйте имена атрибутов с символом
-
как_
для соответствия синтаксису KCL v0.5.0, см. подробности - Автоматически распознавать и устанавливать импорт как ссылочные псевдонимы, чтобы избежать ссылочных конфликтов, см. подробности
- Устранена проблема с отступом описания атрибута в строке документации и автоматический отступ для внутренних разрывов строк в описаниях атрибутов. "Смотрите подробности"
- Исправьте сгенерированный ссылочный путь, чтобы он был полным ссылочным путем на основе корневого каталога пакета, см. подробности
Инструмент управления пакетами
В новой версии KCL v0.5.0 мы предоставили новый инструмент управления пакетами KCL, который позволяет пользователям получать доступ к модулям KCL в сообществе с помощью нескольких команд.
Управление программами KCL с помощью инструмента kpm
Перед использованием kpm необходимо убедиться, что вы сейчас работаете в пакете KCL. Вы можете использовать команду kpm init для создания стандартного пакета KCL.
kpm init kubernetes_demo && cd kubernetes_demo && kpm add k8s
Напишите код KCL для импорта моделей Kubernetes (main.k).
import k8s.api.apps.v1 as apps apps.Deployment { metadata.name = "nginx-deployment" spec = { replicas = 3 selector.matchLabels.app = "nginx" template.metadata.labels = selector.matchLabels template.spec.containers = [ { name = selector.matchLabels.app image = "nginx:1.14.2" ports = [ {containerPort = 80} ] } ] } }
Комбинируя командные строки kpm run
и kubectl
, мы можем напрямую распределять конфигурации ресурсов по кластеру.
$ kpm run | kubectl apply -f - deployment.apps/nginx-deployment configured
Реестр ОКИ
Инструмент kpm поддерживает передачу пакетов KCL через реестр OCI. Реестр OCI по умолчанию, который в настоящее время предоставляется kpm, — https://github.com/orgs/kcl-lang/packages.
Вы можете просмотреть нужный пакет KCL здесь. В настоящее время мы предоставляем пакет KCL для k8s, который поддерживает все версии k8s от 1.14 до 1.27. Добро пожаловать в открытые Вопросы для совместного создания моделей KCL.
См. Здесь для получения дополнительной информации об инструменте kpm.
Интеграции
Интеграция с КИ
В новой версии KCL мы предоставили пример схемы Github Actions в качестве интеграции CI. Мы надеемся реализовать сквозной процесс разработки приложений, используя контейнеры, непрерывную интеграцию (CI) для создания конфигурации и GitOps для непрерывного развертывания (CD). Общий рабочий процесс выглядит следующим образом:
- Разработайте код приложения и отправьте его в репозиторий GitHub для запуска CI (на примере веб-приложения Python Flask).
- Действия GitHub создают образы контейнеров из кода приложения и помещают их в реестр контейнеров
docker.io
.
- GitHub Actions автоматически синхронизирует и обновляет файл развертывания манифеста KCL на основе версии образа контейнера в реестре контейнеров docker.io.
Мы можем получить исходный код манифеста развертывания для компиляции и проверки, и будет получен следующий вывод YAML
apiVersion: apps/v1 kind: Deployment metadata: name: flask_demo labels: app: flask_demo spec: replicas: 1 selector: matchLabels: app: flask_demo template: metadata: labels: app: flask_demo spec: containers: - name: flask_demo image: "kcllang/flask_demo:6428cff4309afc8c1c40ad180bb9cfd82546be3e" ports: - protocol: TCP containerPort: 5000 --- apiVersion: v1 kind: Service metadata: name: flask_demo labels: app: flask_demo spec: type: NodePort selector: app: flask_demo ports: - port: 5000 protocol: TCP targetPort: 5000
Из приведенной выше конфигурации видно, что изображение ресурса действительно автоматически обновляется до вновь созданного содержимого изображения. Кроме того, мы также можем использовать плагин Argo CD KCL для автоматической синхронизации данных из репозитория Git и развертывания приложения в кластере Kubernetes.
Подробности смотрите здесь
Интеграция с компакт-дисками
Кроме того, мы также предоставляем ArgoCD в качестве примера решения для интеграции CD. Благодаря интеграции Github Action CI и плагину ArgoCD KCL мы можем завершить сквозной рабочий процесс GitOps, улучшить автоматическое изменение конфигурации приложения и эффективность развертывания. Ниже представлен обзор и синхронизация конфигурации Kubernetes с помощью приложения ArgoCD. Используя возможности ArgoCD, при изменении кода приложения он автоматически обновляется и развертывается синхронно.
- Обзор приложения
- Синхронизация конфигурации
Подробности смотрите здесь
Плагин инструмента управления конфигурацией Kubernetes
В KCL версии 0.5.0 мы предоставляем поддержку плагинов KCL для инструментов управления конфигурацией, таких как Kubectl, Helm, Kustomize и KPT, в сообществе Kubernetes через единый программный интерфейс. Написав несколько строк кода конфигурации, мы можем неинвазивно редактировать и проверять существующие Kustomize YAML и диаграммы Helm, например изменять метки/аннотации ресурсов, внедрять контейнеры sidecar и проверять ресурсы с использованием схемы KCL, определять собственные абстрактные модели и делиться ими и т. д.
Ниже приведено подробное объяснение интеграции инструмента Kubectl с KCL в качестве примера. Вы можете нажать здесь, чтобы установить плагин Kubectl KCL.
Сначала выполните следующую команду, чтобы получить пример конфигурации
git clone https://github.com/kcl-lang/kubectl-kcl.git && cd ./kubectl-kcl/examples/
Затем выполните следующую команду, чтобы показать конфигурацию
$ cat krm-kcl-abstration.yaml apiVersion: krm.kcl.dev/v1alpha1 kind: KCLRun metadata: name: web-service-abtraction spec: params: name: app containers: ngnix: image: ngnix ports: - containerPort: 80 service: ports: - port: 80 labels: name: app source: oci://ghcr.io/kcl-lang/web-service
В приведенной выше конфигурации мы использовали абстрактную модель приложения веб-службы Kubernetes, которая была предварительно определена в OCI oci://ghcr.io/kcl-lang/web-service
, и настроили необходимые поля конфигурации для модели через поле params
. Исходный вывод Kubernetes YAML можно получить и применить, выполнив следующую команду:
$ kubectl kcl apply -f krm-kcl-abstration.yaml deployment.apps/app created service/app created
Более подробное введение и примеры использования инструментов управления конфигурацией Kubernetes можно найти здесь
В настоящее время интеграция инструментов управления конфигурацией Kubernetes, поддерживаемых KCL, все еще находится на ранней стадии. Если у вас есть дополнительные идеи и требования, добро пожаловать в открытые вопросы для обсуждения.
Другие обновления и исправления ошибок
Смотрите здесь для получения дополнительных обновлений и исправлений ошибок.
Документы
На сайт KCL добавлена семантическая опция управления версиями. В настоящее время поддерживаются версии v0.4.3, v0.4.4, v0.4.5, v0.4.6 и v0.5.0.
Сообщество
- Спасибо @harri2012 за его первый вклад в плагин KCL IDE 🙌
- Спасибо @niconical за его вклад в базовый код командной строки KCL и скрипты CI/CD 🙌
- Спасибо @Ekko за его вклад в интеграцию облачных инструментов KCL 🙌
- Поздравляем Цзюньсина Чжу с успешным отбором в летний лагерь GitLink Programming Summer Camp (GLCC) «Terraform/JsonSchema to KCL Schema» 🎉
- Поздравляем Yiming Ren с успешным выбором темы «Улучшение подключаемых модулей IDE и интеграция с языковым сервером» на летнем мероприятии с открытым исходным кодом 🎉
- Мы переместили 30+ репозиториев KCL целиком в новую организацию Github kcl-lang, помня адрес проекта https://github.com/kcl-lang ❤️
- Присоединение KCL к CNCF Landscape — это небольшое поощрение и признание сообщества разработчиков облачных технологий. Следующим шагом будет стремление присоединиться к CNCF Sadbox и внести больший вклад в сообщество облачных разработчиков 💪
Далее
Ожидается, что в сентябре 2023 года мы выпустим KCL v0.6.0. Ожидаемая ключевая эволюция включает в себя:
- Язык KCL дополнительно совершенствуется для удобства, пользовательский интерфейс постоянно оптимизируется и улучшается опыт, поддержка пользователей и решены болевые точки.
- Дополнительные расширения IDE, инструменты управления пакетами, интеграция сценариев Kubernetes, поддержка функций и улучшение взаимодействия с пользователем.
- Обеспечьте больше готовой поддержки модели KCL для облачных сценариев, в основном включая контейнеры, службы, вычисления, хранилище и сети.
- Дополнительные интеграции CI/CD, такие как Jenkins, Gitlab CI, FluxCD и т. д.
- Поддерживайте
helmfile
подключаемых модулей KCL, напрямую генерируя, изменяя и проверяя ресурсы Kubernetes с помощью кода KCL. - Поддержка изменения и проверки YAML путем запуска кода KCL через контроллер допуска во время выполнения Kubernetes.
Для получения более подробной информации см. Дорожную карту KCL 2023 и Вехи KCL v0.6.0.
Если у вас есть еще идеи и потребности, добро пожаловать в Вопросы и присоединяйтесь к нашему сообществу для общения 🙌 🙌 🙌
Часто задаваемые вопросы
Для получения дополнительной информации см. Часто задаваемые вопросы о KCL.
Дополнительные ресурсы
Спасибо всем пользователям KCL за их ценные отзывы и предложения во время выпуска этой версии. Для получения дополнительных ресурсов см.:
Смотрите сообщество для способов присоединиться к нам. 👏👏👏