Введение

В предыдущем блоге Изучение шаблона проектирования коляски в K8s — часть 1 мы представили шаблон проектирования коляски, используя термины непрофессионала. В этом блоге мы будем использовать KCL, современный, типобезопасный язык конфигурации, чтобы продемонстрировать описание ресурсов пода. В последующих блогах мы будем использовать KCL для изучения практического применения шаблона Sidecar.

1. Определение OpenAPI для модулей

Вернемся к простейшему примеру Nginx, где файл YAML следует аналогичному шаблону:

apiVersion: v1
kind: Pod
metadata:
  name: web-app
spec:
  containers:
  - image: nginx
    name: main-container
    ports:
      - containerPort: 80

Здесь данные Pod соответствуют определению модели io.k8s.api.core.v1.Pod в спецификации Kubernetes. Полное определение OpenAPI можно найти здесь. Внимательно проанализировав его, мы можем увидеть, что apiVersion и информация о виде являются часто используемыми конфигурациями по умолчанию. Нам нужен более современный язык конфигурации, чтобы упростить его.

2. Определение ресурсов пода с помощью KCL

KCL — это язык политики конфигурации для облачного домена. Для получения дополнительной информации, пожалуйста, обратитесь к официальному сайту. Базовые программы конфигурации KCL по-прежнему используют формат K=V, похожий на YAML. Например, мы можем переписать конфигурацию контейнера Nginx, используя следующий код KCL:

import k8s.api.core.v1 as k8core

k8core.Pod {
    metadata.name = "web-app"
    spec.containers = [{
        name = "main-container"
        image = "nginx"
        ports = [{containerPort: 80}]
    }]
}

Здесь оператор import импортирует пакет k8s/api/core/v1 из пакета k8s, а определение структуры Pod соответствует модели Pod. Значения по умолчанию для apiVersion и kind уже включены, поэтому нам нужно добавить только свойства metadata.name и spec.containers (KCL также предоставляет синтаксический сахар для некоторых многоуровневых вложенных свойств). Мы можем использовать инструмент управления пакетами kpm, чтобы создать программу KCL для определения ресурса Pod и выполнить программу, чтобы получить соответствующий YAML:

# 1. Initialize a kcl program package called hello.
kpm init hello
# 2. Edit the main.k file inside the hello package and add the KCL configuration code mentioned earlier.
cat <<EOF > hello/main.k
import k8s.api.core.v1 as k8core
k8core.Pod {
    metadata.name = "web-app"
    spec.containers = [{
        name = "main-container"
        image = "nginx"
        ports = [{containerPort: 80}]
    }]
}
EOF
# 3. Navigate to the hello package, add the k8s dependency, and run the hello package.
cd hello && kpm add k8s && kpm run

Можно получить следующий вывод YAML:

apiVersion: v1
kind: Pod
metadata:
  name: web-app
spec:
  containers:
    - image: nginx
      name: main-container
      ports:
        - containerPort: 80

3. Заключение

В этом блоге мы кратко рассказали, как использовать KCL для создания более гибких и надежных конфигураций Pod. В последующих блогах мы будем использовать KCL для извлечения и абстрагирования лучших практик шаблонов Sidecar, включая использование KCL для абстрагирования модели Sidecar и использование KCL для внедрения Sidecars в существующие исходные конфигурации YAML.