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
- Hasilkan data konfigurasi statis tingkat rendah seperti JSON, YAML, dll., atau integrasikan dengan data yang ada.
- Kurangi boilerplate dalam data konfigurasi dengan pemodelan skema.
- Tentukan skema dengan batasan aturan untuk data konfigurasi dan validasi secara otomatis.
- Atur, sederhanakan, satukan, dan kelola konfigurasi besar tanpa efek samping melalui skema otomatisasi gradien.
- Kelola konfigurasi besar dengan cara yang terukur dengan blok konfigurasi terisolasi.
- Digunakan sebagai bahasa pemrograman rekayasa platform untuk menghadirkan aplikasi modern dengan Kusion Stack.
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
, danvolumes
diApp
.
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
- Blog Praktik Konfigurasi Asli KusionStack Cloud: https://kusionstack.io/blog/2021-kusion-intro
- Bahasa Terraform: https://www.terraform.io/bahasa
- Penyedia Terraform Kubernetes: https://github.com/hashicorp/terraform-provider-kubernetes
- Penyedia Terraform AWS: https://github.com/hashicorp/terraform-provider-aws
- Pulumi: https://www.pulumi.com/docs/
- Pulumi vs. Terraform: https://www.pulumi.com/docs/intro/vs/terraform/
- Desain Konfigurasi Buku Kerja Google SRE: https://sre.google/workbook/configuration-design/
- Makalah Google Borg: https://storage.googleapis.com/pub-tools-public-publication-data/pdf/43438.pdf
- Manajemen Konfigurasi Holistik di Facebook: https://sigops.org/s/conferences/sosp/2015/current/2015-Monterey/printable/008-tang.pdf
- Spesifikasi JSON: https://www.json.org/json-en.html
- Spesifikasi YAML: https://yaml.org/spec/
- GCL: https://github.com/rix0rrr/gcl
- HCL: https://github.com/hashicorp/hcl
- ISYARAT: https://github.com/cue-lang/cue
- Jsonnet: https://github.com/google/jsonnet
- Dhall: https://github.com/dhall-lang/dhall-lang
- Penghematan: https://github.com/Thriftpy/thriftpy2
- Kustomisasi: https://kustomize.io/
- Kube-linter: https://github.com/stackrox/kube-linter
- Pemeriksaan: https://github.com/bridgecrewio/checkov
- Dokumen KCL: https://kcl-lang.io/docs/reference/lang/tour
- Cara Kerja Terraform: Intro Visual: https://betterprogramming.pub/how-terraform-works-a-visual-intro-6328cddbe067
- Cara Kerja Terraform: Ilustrasi Modul: https://awstip.com/terraform-modules-illustrate-26cbc48be83a
- Helm: https://helm.sh/
- Helm vs. Kustomize: https://harness.io/blog/helm-vs-kustomize
- KubeVela: https://kubevela.io/docs/