从 Kubernetes 迁移或集成
简介
KCL 提供了许多对 Kubernetes 配置开箱即用的支持。通过 KCL 工具,我们首先可以将Kubernetes 配置清单和自定义类型集成到 KCL 中。本节将介绍如何从 Kubernetes 进行迁移和集成。
前置依赖
- 安装 kcl
快速开始
将 Kubernetes 配置清单转换为KCL
首先,让我们获取示例。
git clone https://github.com/kcl-lang/kcl-lang.io.git/
cd ./kcl-lang.io/examples/kubernetes/from-kubernetes
我们可以运行以下命令来显示配置。
cat deployment.yaml
输出结果为
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
将 Kubernetes YAML 代码转换为 KCL
kcl import -f deployment.yaml
上述命令将生成文件 deployment.k
"""
This file was generated by the KCL auto-gen tool. DO NOT EDIT.
Editing this file might prove futile when you re-run the KCL auto-gen generate command.
"""
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 代码并生成 YAML
kcl deployment.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
从 Kubernetes 自定义资源生成 KCL 类型
KCL 支持从 Kubernetes OpenAPI/自定义资源定义(CRD)中提取和生成 KCL Schema。KCL OpenAPI 规范定义了 OpenAPI 规范与 KCL 语言功能之间的映射关系。
如果您开发了 Kubernetes CRD,可以由 CRD 生成 KCL Schema,并基于此类型声明 CR。这里我们以 Kubernetes 文档中所示 CronTab CRD 为例。
- 从 CRD 生成 KCL Schema
# Convert the CRD YAML to KCL Schema
kcl import -m crd -s -f crd.yaml
# Init a new KCL project.
rm -rf kcl.mod && kcl mod init
# Add the crd models dependency
kcl mod add ./models --rename crd
- 使用生成的 KCL Schema 定义资源
import crd.v1
v1.CronTab {
    metadata.name = "my-new-cron-object",
    spec: {
        cronSpec = "* * * * */5",
        image = "my-awesome-cron-image",
        replicas = 3,
    }
}
我们可以运行以下命令来运行 KCL 代码并生成 CR YAML
kcl cr.k
输出结果为
apiVersion: stable.example.com/v1
kind: CronTab
metadata:
  name: my-new-cron-object
spec:
  cronSpec: "* * * * */5"
  image: my-awesome-cron-image
  replicas: 3
小结
本节内容解释了如何使用 kcl import 工具将 Kubernetes YAML、CRD 等迁移到 KCL。快速入门指南将帮助您进行从 Kubernetes 的迁移或集成。