Фон
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, чтобы узнать больше о вариантах использования. .
Ссылка
- KCLVM: https://github.com/KusionStack/KCLVM
- KCLVM-Go: https://github.com/KusionStack/kclvm-go
- KCLVM-Py: https://github.com/KusionStack/kclvm-py
- КПТ: https://github.com/GoogleContainerTools/kpt
- KPT KCL SDK Проблема: https://github.com/GoogleContainerTools/kpt/issues/3671
- Функция KRM: https://github.com/kubernetes-sigs/kustomize/blob/master/cmd/config/docs/api-conventions/functions-spec.md#krm-functions-specification
- kpt-functions-catalog: https://github.com/GoogleContainerTools/kpt-functions-catalog
- Каталог функций KPT go: https://github.com/GoogleContainerTools/kpt-functions-catalog/tree/master/functions/go/set-namespace
- Настройка: https://github.com/kubernetes-sigs/kustomize
- Шлем: https://github.com/helm/helm
- Плагин генерации схемы Helm: https://github.com/holgerjh/helm-schema
- Плагин Helm Diff: https://github.com/databus23/helm-diff
- Плагин Helm S3: https://github.com/hypnoglow/helm-s3
- Проверка значений диаграммы Helm с помощью схем JSON: https://www.arthurkoziel.com/validate-helm-chart-values-with-json-schemas/
- Диаграмма Score Helm: https://github.com/score-spec/score-helm-charts
- Helmfile: https://github.com/helmfile/helmfile
- Кроссплан: https://github.com/crossplane/crossplane
- keepn: https://github.com/keptn/keptn
- Модель ресурсов Kubernetes (KRM): https://github.com/kubernetes/design-proposals-archive/blob/main/architecture/resource-management.md
- ArgoCD: https://github.com/argoproj/argo-cd
- Террагрант: https://terragrunt.gruntwork.io/
- Графики Grafana Helm: https://github.com/grafana/helm-charts
- Библиотеки Grafana Jsonnet: https://github.com/grafana/jsonnet-libs
- Grafana Tanka на основе Jsonnet: https://github.com/grafana/tanka
- Интеграция с Grafana Tanka Helm: https://tanka.dev/helm#helm-support
- Манифесты Prometheus Kubernetes на основе Jsonnet: https://github.com/prometheus-operator/kube-prometheus
- https://www.reddit.com/r/kubernetes/comments/118bmwu/helm_or_kustomize_for_my_situation/
- https://www.reddit.com/r/kubernetes/comments/119jolm/separate_repository_for_helm_charts_vs_integrated/
- https://www.reddit.com/r/kubernetes/comments/xx0e6h/why_we_use_cue_and_not_helm/
- Почему мы используем cue, а не helm: https://cloudplane.org/blog/why-cue
- Внешний секрет: https://external-secrets.io/v0.7.2/
- Кубескейп: https://github.com/kubescape/kubescape