Apa itu KCL

Bahasa Konfigurasi Kusion (KCL) adalah bahasa fungsional dan rekaman berbasis batasan sumber terbuka. KCL meningkatkan kompleksitas penulisan berbagai konfigurasi kompleks, seperti skenario cloud-native, melalui teknologi dan praktik bahasa pemrograman yang matang. Ini didedikasikan untuk membangun modularitas, skalabilitas, dan stabilitas yang lebih baik di sekitar konfigurasi, penulisan logika yang lebih sederhana, otomatisasi yang lebih cepat, dan perluasan ekologis yang hebat.

Gambar 1: Pengenalan KCL.

Gambar 2: Taman Bermain KCL.

Ikhtisar Kinerja

KCL berkinerja lebih baik daripada CUE/Jsonnet/HCL dan bahasa lain dalam skenario dengan ukuran kode yang besar atau beban komputasi yang tinggi (CUE dan bahasa lain dibatasi oleh overhead pemeriksaan batasan runtime, sedangkan KCL adalah bahasa yang dikompilasi secara statis).

  • ISYARAT (tes.isyarat)
import "list"

temp: {
        for i, _ in list.Range(0, 10000, 1) {
                "a\(i)": list.Max([1, 2])
        }
}
  • KCL (tes.k)
a = lambda x: int, y: int -> int {
    max([x, y])
}
temp = {"a${i}": a(1, 2) for i in range(10000)}
  • Jsonnet (tes.jsonnet)
local a(x, y) = std.max(x, y);
{
    temp: {["a%d" % i]: a(1, 2) for i in std.range(0, 10000)},
}
  • Terraform HCL (test.tf. Karena fungsi terraform range hanya mendukung hingga 1024 iterator, range(10000) dibagi menjadi 10 subrentang)
output "r1" {
  value = {for s in range(0, 1000) : format("a%d", s) => max(1, 2)}
}
output "r2" {
  value = {for s in range(1000, 2000) : format("a%d", s) => max(1, 2)}
}
output "r3" {
  value = {for s in range(1000, 2000) : format("a%d", s) => max(1, 2)}
}
output "r4" {
  value = {for s in range(2000, 3000) : format("a%d", s) => max(1, 2)}
}
output "r5" {
  value = {for s in range(3000, 4000) : format("a%d", s) => max(1, 2)}
}
output "r6" {
  value = {for s in range(5000, 6000) : format("a%d", s) => max(1, 2)}
}
output "r7" {
  value = {for s in range(6000, 7000) : format("a%d", s) => max(1, 2)}
}
output "r8" {
  value = {for s in range(7000, 8000) : format("a%d", s) => max(1, 2)}
}
output "r9" {
  value = {for s in range(8000, 9000) : format("a%d", s) => max(1, 2)}
}
output "r10" {
  value = {for s in range(9000, 10000) : format("a%d", s) => max(1, 2)}
}
  • Waktu berjalan (dengan mempertimbangkan biaya sumber daya aktual dari lingkungan produksi, pengujian ini tunduk pada inti tunggal).

Gambar 3: Kinerja pada Kasus Sederhana.

Lingkungan:OS: macOS 10.15.7; CPU: CPU Intel(R) Core(TM) i7–8850H @ 2,60GHz; Memori: 32GB 2400MHz DDR4; tidak ada NUMA

Kasus Kompleks Lainnya

Menggunakan KCL dan CUE untuk menulis konfigurasi Kubernetes.

  • ISYARAT (tes.isyarat)
package templates

import (
 apps "k8s.io/api/apps/v1"
)
deployment: apps.#Deployment
deployment: {
 apiVersion: "apps/v1"
 kind:       "Deployment"
 metadata: {
  name:   "me"
  labels: me: "me"
 }
}
  • KCL (tes.k)
import kubernetes.api.apps.v1

deployment = v1.Deployment {
    metadata.name = "me"
    metadata.labels.name = "me"
}

Gambar 4: Kinerja pada Kasus Kompleks.

Fitur Inti KCL dan Kasus Penggunaan

Fitur inti KCL adalah kemampuan pemodelan dan batasannya, dan fungsi dasar KCL berkisar pada dua fitur inti tersebut. Selain itu, KCL mengikuti konsep konfigurasi yang berpusat pada pengguna untuk merancang fungsi dasarnya, yang dapat dipahami dari dua aspek:

  • Tampilan konfigurasi yang berpusat pada model domain: Dengan kayanya fitur bahasa KCL dan alat KCL OpenAPI, kami dapat langsung mengintegrasikan berbagai model yang dirancang dengan baik di komunitas ke dalam KCL (seperti model sumber daya K8). Kami juga dapat merancang dan mengimplementasikan model atau pustaka KCL kami sendiri sesuai dengan skenario yang berbeda, membentuk satu set model domain lengkap untuk digunakan oleh pengguna akhir konfigurasi lainnya.
  • Tampilan konfigurasi yang berpusat pada pengguna akhir: Dengan kemampuan enkapsulasi, abstraksi, dan penggunaan kembali kode KCL, arsitektur model dapat diabstraksi dan disederhanakan lebih lanjut (misalnya, model sumber daya K8 diabstraksi menjadi model server yang berpusat pada aplikasi) untuk meminimalkan pengguna akhir input konfigurasi, menyederhanakan antarmuka konfigurasi pengguna, dan memfasilitasi modifikasi API manual atau otomatis.

Apa pun tampilan konfigurasi yang dipusatkan, untuk kode konfigurasi, terdapat persyaratan untuk batasan data konfigurasi, seperti batasan tipe, batasan wajib/opsional pada atribut konfigurasi, batasan jangkauan, dan batasan kekekalan. Ini juga merupakan salah satu masalah inti yang menjadi komitmen KCL untuk diselesaikan. KCL terutama berisi fitur inti yang ditunjukkan pada Gambar 5.

Gambar 5: Fitur inti KCL.

  • Mudah digunakan: Berasal dari bahasa tingkat tinggi seperti Python dan Golang, menggabungkan fitur bahasa fungsional dengan efek samping yang rendah.
  • Dirancang dengan baik: Sintaks, semantik, runtime, dan desain modul sistem yang digerakkan oleh Spesifikasi Independen.
  • Pemodelan cepat: tipe konfigurasi "Skema" dan abstraksi modular.
  • Kemampuan yang kaya: Konfigurasi dengan tipe, logika, dan kebijakan berdasarkan “Config”, “Schema”, “Lambda”, dan “Rule”.
  • Stabilitas: Stabilitas konfigurasi berdasarkan pada sistem tipe statis, kendala, dan aturan.
  • Skalabilitas: Skalabilitas tinggi melalui mekanisme penggabungan otomatis dari blok konfigurasi yang terisolasi.
  • Otomatisasi cepat: Skema otomatisasi gradien dari CRUD APIs, SDK multibahasa, plugin bahasa
  • Performa tinggi: Performa waktu kompilasi dan runtime tinggi menggunakan Rust & C dan LLVM, serta mendukung kompilasi ke kode asli dan WASM.
  • Afinitas API: Spesifikasi ekologi API dukungan asli seperti OpenAPI, Kubernetes CRD, spesifikasi Kubernetes YAML.
  • Ramah pengembangan: Pengalaman pengembangan yang ramah dengan alat bahasa yang kaya (Format, Lint, Test, Vet, Doc, dll.) dan plugin IDE.
  • Keamanan & pemeliharaan: Berorientasi domain, tidak ada fungsi tingkat sistem seperti thread asli dan IO, kebisingan rendah dan risiko keamanan, pemeliharaan dan tata kelola yang mudah.
  • API multibahasa yang kaya: API multibahasa yang kaya: Go, Python, dan REST APIs memenuhi berbagai skenario dan pendahuluan penggunaan aplikasi.

Gambar 6: Desain inti KCL.

Untuk desain dan kemampuan bahasa lebih lanjut, lihat Dokumen KCL. Meskipun KCL bukan bahasa umum, namun memiliki skenario aplikasi yang sesuai. Seperti yang ditunjukkan pada Gambar 6, pengembang dapat menulis config, skema, fungsi, dan aturan melalui KCL, di mana config digunakan untuk mendefinisikan data, skema digunakan untuk menggambarkan definisi model data, aturan digunakan untuk memvalidasi data, dan skema dan aturan juga dapat digabungkan untuk menggunakan model dan batasan yang mendeskripsikan data secara lengkap, Selain itu, kita juga dapat menggunakan fungsi murni lambda di KCL untuk mengatur kode data, merangkum kode umum, dan memanggilnya secara langsung saat diperlukan.

Untuk kasus penggunaan, KCL dapat melakukan validasi dan abstraksi model konfigurasi kompleks validasi data KV terstruktur, verifikasi batasan yang kuat untuk menghindari kesalahan konfigurasi, integrasi otomatisasi, dan perluasan teknik. Fitur dan kasus penggunaan ini dijelaskan di bawah.

Anda dapat menggunakan KCL untuk

Validasi Data Terstruktur

Seperti yang ditunjukkan pada Gambar 7, KCL mendukung validasi format data JSON/YAML. Sebagai bahasa konfigurasi, KCL mencakup hampir semua fitur OpenAPI dalam hal validasi. Di KCL, data konfigurasi dapat dibatasi oleh definisi struktur. Pada saat yang sama, ia mendukung aturan batasan yang ditentukan pengguna melalui blok pemeriksaan dan menulis ekspresi validasi dalam skema untuk memverifikasi dan membatasi atribut yang ditentukan dalam skema. Ekspresi check dapat digunakan untuk memverifikasi dengan jelas dan sederhana apakah input JSON/YAML memenuhi definisi struktur skema yang sesuai dan batasan pemeriksaan.

Gambar 7: Validasi data terstruktur di KCL.

Berdasarkan hal ini, KCL menyediakan Alat Validasi yang sesuai untuk memvalidasi data JSON/YAML secara langsung. Selain itu, berdasarkan kemampuan tersebut, kita dapat membangun produk visualisasi validasi K-V seperti ditunjukkan pada Gambar 8.

Gambar 8: Produk visualisasi validasi K-V berdasarkan KCL.

Definisi dan Abstraksi Model Konfigurasi Kompleks

Seperti yang ditunjukkan pada Gambar 9, dengan bantuan alat KCL OpenAPI, kita dapat langsung mengintegrasikan berbagai model yang dirancang dengan baik.

Gambar 9: Cara umum pemodelan konfigurasi kompleks KCL.

Seperti yang ditunjukkan pada Gambar 10, "Konfig" digunakan untuk mengelola semua kode konfigurasi KCL, kode konfigurasi bisnis dan kode konfigurasi dasar disimpan dalam repo mono, yang memfasilitasi manajemen ketergantungan versi antar kode, dan pemrosesan sistem otomatis relatif sederhana . Cukup mencari direktori dan file basis kode unik. Kode-kode tersebut saling berhubungan, dikelola secara seragam, dan mudah ditemukan, dimodifikasi, dan dipelihara. Selain itu, proses CI/CD terpadu dapat digunakan untuk manajemen konfigurasi.

Gambar 10: Menggunakan kemampuan bahasa KCL untuk mengintegrasikan model domain dan model pengguna.

Batasan Kuat untuk Menghindari Kesalahan

Seperti yang ditunjukkan pada Gambar 11, kesalahan konfigurasi dapat dihindari melalui metode pemeriksaan batasan yang kuat di KCL.

Gambar 11: Metode pemeriksaan batasan kuat di KCL.

  • Sistem tipe bahasa KCL dirancang untuk bersifat statis. Definisi jenis dan nilai dipisahkan. Derivasi tipe dan pemeriksaan tipe pada waktu kompilasi didukung. Tipe statis tidak hanya dapat menganalisis sebagian besar kesalahan tipe pada waktu kompilasi terlebih dahulu tetapi juga mengurangi hilangnya kinerja pemeriksaan tipe dinamis pada waktu proses. Selain itu, atribut skema KCL dipaksa untuk tidak nol, yang secara efektif dapat menghindari kelalaian konfigurasi.
  • Ketika konfigurasi KCL yang akan diekspor dideklarasikan, tipe dan nilainya tidak dapat diubah. Fitur statis ini memastikan bahwa konfigurasi tidak akan diubah sesuka hati.
  • KCL mendukung jaminan stabilitas lebih lanjut melalui aturan validasi bawaan struktur. Misalnya, Gambar 12 menunjukkan bahwa kode KCL mendefinisikan batasan untuk containerPort, services, dan volumes di App.

Gambar 12: Validasi kode KCL dengan aturan batasan.

Penggabungan Blok Konfigurasi Terisolasi

KCL menyediakan kemampuan untuk menulis blok konfigurasi terisolasi dan menggabungkannya secara otomatis, serta mendukung penggabungan idempoten, penggabungan patch, dan strategi lainnya. Beberapa konfigurasi dalam penggabungan idempoten harus memenuhi undang-undang pertukaran, dan pengembang harus menangani konflik konfigurasi secara manual antara basis dan lingkungan yang berbeda. Penggabungan patch meliputi overlay, penghapusan, dan penambahan. KCL menyederhanakan pengembangan kolaboratif di sisi pengguna dan mengurangi keterhubungan antar konfigurasi melalui beberapa strategi penggabungan.

Gambar 13: Penulisan blok konfigurasi skenario multi-lingkungan.

Otomatisasi

KCL menyediakan banyak kemampuan terkait otomatisasi, terutama mencakup alat dan API multibahasa. Melalui mode package_identifier : key_identifier, KCL mendukung pengindeksan nilai kunci apa pun yang dikonfigurasi, sehingga menyelesaikan penambahan, penghapusan, modifikasi, dan kueri nilai kunci apa pun. Misalnya, Gambar 14 menunjukkan bahwa kita dapat langsung menjalankan perintah berikut untuk memodifikasi gambar. Perbedaan kode sebelum dan sesudah modifikasi juga ditunjukkan pada Gambar 14.

Gambar 14: Modifikasi otomatis gambar konfigurasi aplikasi melalui KCL CLI/API.

Selain itu, kemampuan otomatisasi KCL dapat direalisasikan dan diintegrasikan ke dalam CI/CD seperti ditunjukkan pada Gambar 15.

Gambar 15: Integrasi otomatisasi KCL pada umumnya.

Referensi