Практическое руководство по упрощению управления конфигурацией Kubernetes с помощью KCL и KPM.

Что такое ККЛ
KCL — это язык программирования с открытым исходным кодом, основанный на записи и функциональном программировании. Он использует зрелые технологии и методы языка программирования для облегчения написания многих сложных конфигураций. KCL предназначен для улучшения модульности, масштабируемости и стабильности конфигурации, упрощения написания логики, ускорения автоматизации и создания процветающей экосистемы расширений. Чтобы узнать больше о конкретных сценариях использования KCL, посетите веб-сайт KCL. Этот блог не будет вдаваться в подробности об этом.
Что такое КПМ
KPM — менеджер пакетов KCL. KPM загружает зависимости вашего пакета KCL, компилирует ваши пакеты KCL, создает пакеты и загружает их в реестр пакетов kcl.
Зачем использовать ККЛ
Когда мы управляем ресурсами Kubernetes, мы часто обслуживаем их вручную или используем инструменты Helm и Kustomize для поддержки наших конфигураций YAML или шаблонов конфигураций, а затем применяем ресурсы к кластеру с помощью инструментов kubectl. Однако для «инженера YAML» ежедневная поддержка конфигурации YAML, несомненно, тривиальна и утомительна и подвержена ошибкам. Например, следующим образом:
apiVersion: apps/v1
kind: Deployment
metadata: ... # Omit
spec:
selector:
matchlabels:
cell: RZ00A
replicas: 2
template:
metadata: ... # Omit
spec:
tolerations:
- effect: NoSchedules
key: is-over-quota
operator: Equal
value: 'true'
containers:
- name: test-app
image: images.example/app:v1 # Wrong ident
resources:
limits:
cpu: 2 # Wrong type. The type of cpu should be str
memory: 4Gi
# Field missing: ephemeral-storage
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: is-over-quota
operator: In
values:
- 'true'
- Структурированные данные в YAML нетипизированы и не имеют методов проверки, поэтому достоверность всех данных нельзя проверить сразу.
- YAML имеет плохие возможности программирования. Легко написать неправильные отступы и не имеет общих методов организации кода, таких как логическое суждение. Легко написать большое количество повторяющихся конфигураций и сложно поддерживать.
- Дизайн Kubernetes сложен, и пользователям сложно понять все детали, такие как поля
tolerationиaffinityв приведенной выше конфигурации. Если пользователи не понимают логику планирования, она может быть ошибочно опущена или добавлена лишняя.
Поэтому KCL рассчитывает решить следующие проблемы в управлении ресурсами Kubernetes YAML:
- Используйте высокопроизводительный язык программирования производственного уровня для написания кода, чтобы повысить гибкость конфигурации, например условные операторы, циклы, функции, управление пакетами и другие функции для улучшения возможность повторного использования конфигурации.
- Улучшите возможности семантической проверки конфигурации на уровне кода, такие как необязательные/обязательные поля, типы, диапазоны и другие проверки конфигурации.
- Обеспечьте возможность писать, комбинировать и абстрагировать блоки конфигурации, такие как определение структуры, наследование структуры, определение ограничения и т. д.
Как использовать KCL для создания ресурсов Kubernetes и управления ими
Сначала вы можете посетить Быстрый старт KCL, чтобы загрузить и установить KCL в соответствии с инструкциями, а затем подготовить среду Kubernetes.
Создание манифестов Kubernetes
Мы можем написать следующий код KCL и назвать его main.k. KCL вдохновлен Python. Его базовый синтаксис очень близок к Python, который легко освоить. Режим конфигурации простой, k [: T] = v, где k обозначает имя сконфигурированного атрибута, v обозначает сконфигурированное значение атрибута, а : T обозначает необязательную аннотацию типа.
apiVersion = "apps/v1"
kind = "Deployment"
metadata = {
name = "nginx"
labels.app = name
}
spec = {
replicas = 3
selector.matchLabels = metadata.labels
template.metadata.labels = metadata.labels
template.spec.containers = [
{
name = metadata.name
image = "${metadata.name}:1.14.2"
ports = [{ containerPort = 80 }]
}
]
}
В приведенном выше коде KCL мы объявляем apiVersion, kind, metadata, spec и другие переменные ресурса Kubernetes Deployment и соответственно назначаем соответствующее содержимое. В частности, мы назначим поля metadata.labels повторно используемыми в полях spec.selector.matchLabels и spec.template.metadata.labels. Видно, что по сравнению с YAML структура данных, определенная KCL, более компактна, а повторное использование конфигурации может быть реализовано путем определения локальных переменных.
Мы можем получить файл Kubernetes YAML, выполнив следующую командную строку
kcl main.k
Выход
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
Конечно, мы можем использовать KCL вместе с kubectl и другими инструментами. Давайте выполним следующие команды и посмотрим на результат:
$ kcl main.k | kubectl apply -f - deployment.apps/nginx-deployment configured
Из командной строки видно, что это полностью соответствует опыту развертывания с использованием конфигурации YAML и приложения kubectl напрямую.
Проверить статус развертывания через kubectl
$ kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE nginx-deployment 3/3 3 3 15s
Как использовать KPM для управления ресурсами Kubernetes
Вы можете получить kpm из выпуска kpm github и установить двоичный путь kpm в переменную окружения PATH.
# KPM_INSTALLATION_PATH is the path of the `kpm` binary. export PATH=$KPM_INSTALLATION_PATH:$PATH
Используйте следующую команду, чтобы убедиться, что вы успешно установили kpm.
kpm --help
Установить переменные среды
Вам нужно установить переменную среды KPM_HOME для хранения пакетов KCL, загруженных kpm.
Примечание. kpm не поддерживает загрузку внешних пакетов в текущий каталог пакетов kcl, поэтому убедитесь, что «$KPM_HOME» не находится в том же каталоге, что и текущий пакет KCL.
# The directory to save the packages downloaded by Kpm. export KPM_HOME="/user/xxx/xxx/path"
Чтобы убедиться, что KCLVM может найти пакеты, загруженные kpm, вам необходимо установить переменные среды $KCLVM_VENDOR_HOME и указать их на $KPM_HOME для KCLVM после загрузки KCLVM.
export KCLVM_VENDOR_HOME=$KPM_HOME
Запустите пустой пакет KCL
Сначала создайте пустую папку для пакета KCL и перейдите в эту папку.
mkdir my_package # create an empty folder 'my_package' cd my_package # go into the folder 'my_package'
Создайте новый пакет kcl с именем my_package.
kpm init my_package
kpm создаст два файла конфигурации пакета kcl: kcl.mod и kcl.mod.lock в каталоге, где вы выполнили команду.
- my_package
|- kcl.mod
|- kcl.mod.lock
|- # You can write your kcl program directly in this directory.
kcl.mod.lock — это файл, сгенерированный kpm для исправления версии зависимостей. Не изменяйте этот файл вручную.
kpm инициализирует kcl.mod для пустого проекта, как показано ниже:
[package] name = "my_package" edition = "0.0.1" version = "0.0.1"
Добавить зависимость от Git Registry
Если вам нужно использовать модель KCL в Конфиге, написать программу kcl.
kpm add -git https://github.com/awesome-kusion/konfig.git -tag v0.0.1
Вы можете видеть, что kpm добавляет зависимость, которую вы только что добавили в kcl.mod.
[package]
name = "my_package"
edition = "0.0.1"
version = "0.0.1"
[dependencies]
# 'konfig' is the package name
# If you want to use the contents of this package,
# you need to write the import statment with the package name 'konfig' as the prefix.
konfig = { git = "https://github.com/awesome-kusion/konfig.git", tag = "v0.0.1" }
Напишите программу KCL, которая использует содержимое в konfig
Создайте файл main.k в текущем пакете.
- my_package
|- kcl.mod
|- kcl.mod.lock
|- main.k # Your KCL program.
И напишите следующее в файл main.k.
import konfig.base.pkg.kusion_kubernetes.api.apps.v1 as apps
demo = apps.Deployment {
metadata.name = "nginx-deployment"
spec = {
replicas = 3
selector.matchLabels = {
app = "nginx"
}
template.metadata.labels = {
app = "nginx"
}
template.spec.containers = [
{
name = "nginx"
image = "nginx:1.14.2"
ports = [
{containerPort = 80}
]
}
]
}
}
Используйте kpm скомпилируйте пакет kcl
Вы можете использовать kpm для компиляции файла main.k, который вы только что написали.
kcl main.k -S demo
Если вы получите следующий вывод, поздравляем!, вы успешно скомпилировали свой пакет kcl с kpm.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: "nginx:1.14.2"
name: nginx
ports:
- containerPort: 80
Интеграция OAM в KCL
Kubevela и Open Application Model (OAM) предлагают модульную, расширяемую и переносимую конструкцию для моделирования развертывания приложений с более высоким уровнем, но согласованным API.
Точно так же вы можете использовать OAM в коде KCL напрямую, как показано ниже:
import konfig.base.pkg.kusion_kubevela.v1beta1
app: v1beta1.Application {
metadata.name = "webservice-app"
spec.components = [{
name = "front-end"
type = "webservice"
properties = {
image = "oamdev/testapp:v1"
cmd = ["node", "server.js"]
ports = [{port = 8080, expose = True}]
exposeType = "NodePort"
cpu = "0.5"
memory = str(512Mi)
}
traits = [
{
type = "scaler"
properties.replicas = 1
}
]
}]
}
Выполните следующие команды
$ kcl main.k -S app
apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:
name: webservice-app
spec:
components:
- name: front-end
properties:
image: "oamdev/testapp:v1"
cmd:
- node
- server.js
ports:
- port: 8080
expose: true
exposeType: NodePort
cpu: "0.5"
memory: 512Mi
traits:
- properties:
replicas: 1
type: scaler
type: webservice
Хочу больше?
Дополнительную информацию см. на веб-сайте KCL и примечаниях к выпуску KCL v0.4.6.
- Веб-сайт KCL: https://kcl-lang.github.io/
- Примечание к выпуску KCL v0.4.6: https://medium.com/dev-genius/kcl-v0-4-6-is-coming-rust-based-ide-extension-helm-kustomize-kpt-integrations-cc785ad0156c