Введение

Команда 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 за их ценные отзывы и предложения во время выпуска этой версии. Для получения дополнительных ресурсов см.:

Смотрите сообщество для способов присоединиться к нам. 👏👏👏