Фон

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

kpt — это набор инструментов, ориентированный на пакеты, который обеспечивает создание, автоматизацию и доставку конфигурации WYSIWYG, что упрощает управление платформами Kubernetes и инфраструктурой на основе KRM (например, Config Connector, Crossplane) в масштабе за счет манипулирования декларативными Конфигурация как данные для автоматического редактирования конфигурации Kubernetes, включая преобразование и проверку.

Мы разрабатываем подключаемые модули KCL и SDK для kpt, чтобы писать функции kpt. Одной из основных задач, которую должен решить KCL, является усовершенствование инструментов настройки и предоставление возможностей декларативной проверки и редактирования конфигурации, которые в определенной степени служат связующим звеном для конфигурации как кода (CaC) и конфигурации как данных (CaD). Кроме того, KCL — это доменный язык, подобный Python, с моделями схем расширения и несколькими стратегиями переопределения для преобразования данных конфигурации без внешнего доступа к файловой системе хоста и сети.

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

Введение

Основными понятиями KCL являются Конфигурация, Схема, Лямбда и Правило, они почти полностью соответствуют друг другу. один к понятиям, связанным с KPT, таким как KRM, Пакет, Функция, Валидатор и т. д.

  • Конфигурация

  • Схема

  • лямбда

  • Правило

  • Концепции КПТ

В KCL лямбда разработана как «чистая» (например, она запрещает изменять такие функции, как переменные замыкания), что означает, что многократное выполнение одной и той же функции даст одинаковые результаты, что, естественно, соответствует некоторым спецификациям дизайна KPT. Функция.

Следует добавить, что сам KCL может быть скомпилирован в WASM и предоставляет kclvm-go SDK, хорошо интегрированный в KPT Function.

Мы разработали Плагин Helm KCL, Helm — отличный менеджер пакетов Kubernetes, но все еще есть много потребностей, которые не могут быть полностью удовлетворены (готовые пакеты редко развертываются без какой-либо настройки). Таким образом, у нас есть причина и возможность проверить интеграцию инструментов KCL и KPT, и KPT рассмотрел механизм расширения, который пользователи используют для объединения DSL и CaD, которые им нравятся, с самого начала проектирования.

KPT/KRM Функция KCL

Функция KPT/KRM KCL содержит следующее:

где:

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

Мы используем golang для упаковки KPT KCL SDK.

Рабочий процесс

Мы встраиваем KCL в KPT Go SDK через kclvm-go и вызываем функции, написанные KCL, через код Go. Функции KCL поддерживаются пользователями в файле KRM конфигурации KCLRun или в ConfigMap.

Конфигурация функции

# kcl-fn-config.yaml
apiVersion: fn.kpt.dev/v1alpha1
kind: KCLRun
metadata:
  name: set-annotation
# EDIT THE SOURCE! 
source: |
   # KCL transformer by one line.
   [item | {metadata.annotations: {"managed-by" = "kcl-kpt"}} for item in option("resource_list").items]

Кроме того, мы можем использовать ConfigMap для хранения исходного кода KCL.

Чтобы использовать ConfigMap в качестве functionConfig, источник сценария KCL должен быть указан в поле data.source. В поле данных можно указать дополнительные параметры.

Вот пример:

apiVersion: v1
kind: ConfigMap
metadata:
  name: set-replicas
data:
  replicas: "5"
  source: |
    resources = option("resource_list")
    setReplicas = lambda items, replicas {
       [item | {
          spec.replicas = replicas
       } if item.kind == "Deployment" and item.apiVersion == "apps/v1" else {} for item in items]
    }
    setReplicas(resources.items or [], resources.functionConfig.data.replicas)

В приведенном выше примере сценарий получает доступ к параметрам реплик с помощью option("resource_list").functionConfig.data.replicas.
Чтобы использовать KCLRun в качестве functionConfig, в поле источника необходимо указать источник KCL. Дополнительные параметры можно указать в поле params. Поле params поддерживает любую сложную структуру данных, если она может быть представлена ​​в YAML.

apiVersion: fn.kpt.dev/v1alpha1
kind: KCLRun
metadata:
  name: conditionally-add-annotations
params:
  toMatch:
    config.kubernetes.io/local-config: "true"
  toAdd:
    configmanagement.gke.io/managed: disabled
source: |
  resource = option("resource_list")
  items = resource.items
  params = resource.functionConfig.params
  toMatch = params.toMatch
  toAdd = params.toAdd
  [item | {
     # If all annotations are matched, patch more annotations
     if all key, value in toMatch {
        item.metadata.annotations[key] == value
     }:
         metadata.annotations: {**params.toAdd}
  } for item in items]

KCL KPT Быстрый старт

Вы можете посетить https://github.com/KusionStack/kpt-kcl-sdk и https://kcl-lang.io/docs/user_docs/guides/working-with-k8s/kpt_kcl_sdk, чтобы узнать больше о вариантах использования. .

Ссылка