เคซีแอลคืออะไร

Kusion Configuration Language (KCL) เป็นโอเพ่นซอร์ส บันทึกตามข้อจำกัดและภาษาการทำงาน KCL ปรับปรุงความซับซ้อนในการเขียนการกำหนดค่าที่ซับซ้อนจำนวนมาก เช่น สถานการณ์แบบคลาวด์เนทีฟ ผ่านเทคโนโลยีและแนวทางปฏิบัติด้านภาษาการเขียนโปรแกรมที่ครบถ้วน มีความมุ่งมั่นในการสร้างโมดูลาร์ที่ดีขึ้น ความสามารถในการปรับขนาด และความเสถียรในการกำหนดค่า การเขียนลอจิกที่ง่ายขึ้น ระบบอัตโนมัติที่เร็วขึ้น และความสามารถในการขยายระบบนิเวศที่ยอดเยี่ยม

รูปที่ 1: บทนำของ KCL

รูปที่ 2: สนามเด็กเล่น KCL

ภาพรวมประสิทธิภาพ

KCL ทำงานได้ดีกว่า CUE/Jsonnet/HCL และภาษาอื่นๆ ในสถานการณ์ที่มีขนาดโค้ดใหญ่หรือมีภาระการประมวลผลสูง (CUE และภาษาอื่นๆ ถูกจำกัดโดยการตรวจสอบโอเวอร์เฮดในการตรวจสอบข้อจำกัดรันไทม์ ในขณะที่ KCL เป็นภาษาที่คอมไพล์แบบคงที่)

  • คิว (test.cue)
import "list"

temp: {
        for i, _ in list.Range(0, 10000, 1) {
                "a\(i)": list.Max([1, 2])
        }
}
  • KCL (test.k)
a = lambda x: int, y: int -> int {
    max([x, y])
}
temp = {"a${i}": a(1, 2) for i in range(10000)}
  • เจสันเน็ต (test.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 เนื่องจากฟังก์ชัน terraform range รองรับตัววนซ้ำได้สูงสุด 1,024 ตัวเท่านั้น range(10000) จึงถูกแบ่งออกเป็น 10 ช่วงย่อย)
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)}
}
  • เวลาทำงาน (เมื่อพิจารณาถึงต้นทุนทรัพยากรจริงของสภาพแวดล้อมการใช้งานจริง การทดสอบนี้ขึ้นอยู่กับคอร์เดียว)

รูปที่ 3: ประสิทธิภาพในกรณีธรรมดา

สภาพแวดล้อม:ระบบปฏิบัติการ: macOS 10.15.7; ซีพียู: Intel(R) Core(TM) i7–8850H CPU @ 2.60GHz; หน่วยความจำ: 32 GB 2400 MHz DDR4; ไม่ NUMA

คดีที่ซับซ้อนอีกคดีหนึ่ง

การใช้ KCL และ CUE เพื่อเขียนการกำหนดค่า Kubernetes

  • คิว (test.cue)
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 (test.k)
import kubernetes.api.apps.v1

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

รูปที่ 4: ประสิทธิภาพการทำงานของเคสที่ซับซ้อน

คุณสมบัติหลักของ KCL และกรณีการใช้งาน

คุณสมบัติหลักของ KCL คือความสามารถในการสร้างโมเดลและข้อจำกัด และฟังก์ชันพื้นฐานของ KCL เกี่ยวข้องกับคุณสมบัติหลักทั้งสอง นอกจากนี้ KCL ยังปฏิบัติตามแนวคิดการกำหนดค่าที่เน้นผู้ใช้เป็นศูนย์กลางเพื่อออกแบบฟังก์ชันพื้นฐาน ซึ่งสามารถเข้าใจได้จากสองแง่มุม:

  • มุมมองการกำหนดค่าที่เน้นโมเดลโดเมนเป็นศูนย์กลาง: ด้วยคุณสมบัติที่หลากหลายของภาษา KCL และเครื่องมือ KCL OpenAPI เราสามารถรวมโมเดลที่ได้รับการออกแบบอย่างดีที่หลากหลายในชุมชนเข้ากับ KCL ได้โดยตรง (เช่น โมเดลทรัพยากร K8s) นอกจากนี้เรายังสามารถออกแบบและใช้โมเดลหรือไลบรารี KCL ของเราเองตามสถานการณ์ที่แตกต่างกัน โดยสร้างชุดรูปแบบโดเมนที่สมบูรณ์เพื่อให้ผู้ใช้ปลายทางการกำหนดค่าอื่นๆ นำไปใช้
  • มุมมองการกำหนดค่าที่เน้นผู้ใช้เป็นศูนย์กลาง: ด้วยความสามารถในการห่อหุ้มโค้ด การสร้างนามธรรม และการนำกลับมาใช้ใหม่ของ KCL สถาปัตยกรรมโมเดลสามารถสรุปและทำให้ง่ายขึ้นเพิ่มเติมได้ (เช่น โมเดลทรัพยากร K8s ถูกสรุปให้เป็นโมเดลเซิร์ฟเวอร์ที่เน้นแอปพลิเคชันเป็นศูนย์กลาง) เพื่อลดจำนวนผู้ใช้ปลายทาง อินพุตการกำหนดค่า ลดความซับซ้อนของอินเทอร์เฟซการกำหนดค่าของผู้ใช้ และอำนวยความสะดวกในการแก้ไข API ด้วยตนเองหรืออัตโนมัติ

ไม่ว่ามุมมองการกำหนดค่าจะเน้นไปที่จุดใด สำหรับรหัสการกำหนดค่า มีข้อกำหนดสำหรับข้อจำกัดของข้อมูลการกำหนดค่า เช่น ข้อจำกัดประเภท ข้อจำกัดที่จำเป็น/เป็นทางเลือกในแอตทริบิวต์การกำหนดค่า ข้อจำกัดของช่วง และข้อจำกัดที่ไม่สามารถเปลี่ยนรูปได้ นี่เป็นหนึ่งในประเด็นหลักที่ KCL มุ่งมั่นที่จะแก้ไข KCL ส่วนใหญ่ประกอบด้วยคุณสมบัติหลักที่แสดงในรูปที่ 5

รูปที่ 5: คุณสมบัติหลักของ KCL

  • ใช้งานง่าย: มีต้นกำเนิดมาจากภาษาระดับสูงเช่น Python และ Golang ที่ผสมผสานฟีเจอร์ภาษาที่ใช้งานได้และมีผลข้างเคียงต่ำ
  • ออกแบบมาอย่างดี: การออกแบบไวยากรณ์ ความหมาย รันไทม์ และโมดูลระบบที่ขับเคลื่อนด้วย Spec อิสระ
  • การสร้างแบบจำลองอย่างรวดเร็ว: ประเภทการกำหนดค่าแบบเน้น "สคีมา" และนามธรรมแบบโมดูลาร์
  • ความสามารถที่หลากหลาย: การกำหนดค่าด้วยประเภท ตรรกะ และนโยบายตาม "การกำหนดค่า" "สคีมา" "แลมบ์ดา" และ "กฎ"
  • ความเสถียร: ความเสถียรของการกำหนดค่าตาม "ระบบประเภทคงที่", "ข้อจำกัด" และ "กฎ"
  • ความสามารถในการปรับขนาด: ความสามารถในการปรับขนาดสูงผ่าน "กลไกการผสานอัตโนมัติ" ของบล็อกการตั้งค่าแบบแยก
  • ระบบอัตโนมัติที่รวดเร็ว: รูปแบบการไล่ระดับสีอัตโนมัติของ CRUD APIs, SDK หลายภาษา, ปลั๊กอินภาษา
  • ประสิทธิภาพสูง: เวลาคอมไพล์และประสิทธิภาพรันไทม์สูงโดยใช้ Rust & C และ LLVM และรองรับการคอมไพล์เป็นเนทีฟโค้ดและ WASM
  • API affinity: รองรับข้อกำหนดทางนิเวศวิทยาของ API แบบเนทีฟ เช่น OpenAPI, Kubernetes CRD, Kubernetes YAML spec
  • เป็นมิตรต่อการพัฒนา: ประสบการณ์การพัฒนาที่เป็นมิตรพร้อมด้วย เครื่องมือภาษา ที่หลากหลาย (รูปแบบ, Lint, Test, Vet, Doc ฯลฯ) และ ปลั๊กอิน IDE
  • ความปลอดภัยและการบำรุงรักษา: เน้นโดเมน ไม่มีฟังก์ชันระดับระบบ เช่น เธรดดั้งเดิมและ IO เสียงรบกวนต่ำและความเสี่ยงด้านความปลอดภัย บำรุงรักษาง่ายและกำกับดูแล
  • API หลายภาษาที่หลากหลาย: API หลายภาษาที่หลากหลาย: Go, Python และ REST APIs ตอบสนองสถานการณ์ที่แตกต่างกันและการใช้งานแอปพลิเคชันเบื้องต้น

รูปที่ 6: การออกแบบแกน KCL

สำหรับการออกแบบและความสามารถด้านภาษาเพิ่มเติม โปรดดูที่ "เอกสาร KCL" แม้ว่า KCL จะไม่ใช่ภาษาทั่วไป แต่ก็มีสถานการณ์การใช้งานที่สอดคล้องกัน ดังที่แสดงในรูปที่ 6 นักพัฒนาสามารถเขียนการกำหนดค่า สคีมา ฟังก์ชัน และกฎผ่าน KCL โดยที่การกำหนดค่าถูกใช้เพื่อกำหนดข้อมูล สคีมาใช้เพื่ออธิบายคำจำกัดความแบบจำลองของข้อมูล กฎใช้ในการตรวจสอบข้อมูล และ สคีมาและกฎยังสามารถรวมกันเพื่อใช้แบบจำลองและข้อจำกัดที่อธิบายข้อมูลได้อย่างสมบูรณ์ นอกจากนี้เรายังสามารถใช้ฟังก์ชัน lambda pure ใน KCL เพื่อจัดระเบียบโค้ดข้อมูล แค็ปซูลโค้ดทั่วไป และเรียกใช้โดยตรงเมื่อจำเป็น

สำหรับกรณีการใช้งาน KCL สามารถทำการตรวจสอบความถูกต้องของข้อมูล K-V ที่มีโครงสร้าง การกำหนดรูปแบบการกำหนดค่าที่ซับซ้อนและนามธรรม การตรวจสอบข้อจำกัดที่เข้มงวดเพื่อหลีกเลี่ยงข้อผิดพลาดในการกำหนดค่า การบูรณาการระบบอัตโนมัติ และการขยายทางวิศวกรรม คุณสมบัติและกรณีการใช้งานเหล่านี้อธิบายไว้ด้านล่าง

คุณสามารถใช้ KCL เพื่อ

  • สร้างข้อมูลการกำหนดค่าคงที่ระดับต่ำ เช่น JSON, YAML ฯลฯ หรือ "ผสานรวมกับข้อมูลที่มีอยู่"
  • ลดขนาดสำเร็จรูปในข้อมูลการกำหนดค่าด้วย การสร้างแบบจำลองสคีมา
  • กำหนดสคีมาด้วย "ข้อจำกัดกฎสำหรับข้อมูลการกำหนดค่าและตรวจสอบ" โดยอัตโนมัติ
  • จัดระเบียบ ลดความซับซ้อน รวมและจัดการการกำหนดค่าขนาดใหญ่โดยไม่มีผลข้างเคียงผ่าน "แผนการไล่ระดับอัตโนมัติ"
  • จัดการการกำหนดค่าขนาดใหญ่ด้วยวิธีที่ปรับขนาดได้ด้วย บล็อกการกำหนดค่าแบบแยกส่วน
  • ใช้เป็นภาษาการเขียนโปรแกรมวิศวกรรมแพลตฟอร์มเพื่อส่งมอบแอปพลิเคชันสมัยใหม่ด้วย Kusion Stack

การตรวจสอบความถูกต้องของข้อมูลที่มีโครงสร้าง

ดังแสดงในรูปที่ 7 KCL รองรับการตรวจสอบความถูกต้องของข้อมูล JSON/YAML ในฐานะภาษาการกำหนดค่า KCL ครอบคลุมคุณสมบัติเกือบทั้งหมดของ OpenAPI ในแง่ของการตรวจสอบ ใน KCL ข้อมูลการกำหนดค่าสามารถถูกจำกัดโดยคำจำกัดความของโครงสร้าง ในเวลาเดียวกัน สนับสนุนกฎข้อจำกัดที่ผู้ใช้กำหนดผ่านบล็อกตรวจสอบและการเขียนนิพจน์การตรวจสอบความถูกต้องในสคีมาเพื่อตรวจสอบและจำกัดคุณลักษณะที่กำหนดไว้ในสคีมา สามารถใช้นิพจน์การตรวจสอบเพื่อตรวจสอบอย่างชัดเจนและง่ายดายว่าอินพุต JSON/YAML ตรงตามข้อกำหนดโครงสร้างสคีมาที่เกี่ยวข้องและข้อจำกัดในการตรวจสอบหรือไม่

รูปที่ 7: การตรวจสอบความถูกต้องของข้อมูลที่มีโครงสร้างใน KCL

จากข้อมูลนี้ KCL จึงจัดเตรียม เครื่องมือตรวจสอบความถูกต้อง ที่เกี่ยวข้องเพื่อตรวจสอบความถูกต้องของข้อมูล JSON/YAML โดยตรง นอกจากนี้ จากความสามารถนี้ เราสามารถสร้างผลิตภัณฑ์การแสดงภาพการตรวจสอบ K-V ดังแสดงในรูปที่ 8

รูปที่ 8: ผลิตภัณฑ์การแสดงภาพการตรวจสอบความถูกต้องของ K-V ที่ใช้ KCL

ความหมายและนามธรรมของโมเดลการกำหนดค่าที่ซับซ้อน

ดังที่แสดงในรูปที่ 9 ด้วยความช่วยเหลือของเครื่องมือ KCL OpenAPI เราสามารถรวมโมเดลที่ได้รับการออกแบบอย่างดีที่หลากหลายได้โดยตรง

รูปที่ 9: วิธีทั่วไปของการสร้างแบบจำลองการกำหนดค่าที่ซับซ้อนของ KCL

ดังแสดงในรูปที่ 10 Konfig ใช้เพื่อจัดการรหัสการกำหนดค่า KCL ทั้งหมด รหัสการกำหนดค่าธุรกิจและรหัสการกำหนดค่าพื้นฐานจะถูกเก็บไว้ใน repo แบบโมโน ซึ่งอำนวยความสะดวกในการจัดการการพึ่งพาเวอร์ชันระหว่างรหัส และการประมวลผลระบบอัตโนมัตินั้นค่อนข้างง่าย . การค้นหาไดเร็กทอรีและไฟล์ของฐานโค้ดที่ไม่ซ้ำกันก็เพียงพอแล้ว รหัสมีการเชื่อมต่อถึงกัน มีการจัดการอย่างเท่าเทียมกัน และง่ายต่อการค้นหา แก้ไข และบำรุงรักษา นอกจากนี้ กระบวนการ CI/CD แบบครบวงจรยังสามารถใช้สำหรับการจัดการการกำหนดค่าได้อีกด้วย

รูปที่ 10: การใช้ความสามารถทางภาษาของ KCL เพื่อรวมโมเดลโดเมนและโมเดลผู้ใช้

ข้อจำกัดที่เข้มงวดเพื่อหลีกเลี่ยงข้อผิดพลาด

ดังที่แสดงในรูปที่ 11 คุณสามารถหลีกเลี่ยงข้อผิดพลาดในการกำหนดค่าได้ด้วยวิธีการตรวจสอบข้อจำกัดที่เข้มงวดใน KCL

รูปที่ 11: วิธีการตรวจสอบข้อจำกัดที่เข้มงวดใน KCL

  • ระบบประเภทของภาษา KCL ได้รับการออกแบบมาให้เป็นแบบคงที่ คำจำกัดความประเภทและค่าจะถูกแยกออกจากกัน รองรับการสืบทอดประเภทและการตรวจสอบประเภทในเวลาคอมไพล์ ประเภทคงที่ไม่เพียงแต่สามารถวิเคราะห์ข้อผิดพลาดประเภทส่วนใหญ่ในเวลาคอมไพล์ล่วงหน้า แต่ยังช่วยลดการสูญเสียประสิทธิภาพของการตรวจสอบประเภทไดนามิกที่รันไทม์อีกด้วย นอกจากนี้ คุณลักษณะของสคีมา KCL ยังถูกบังคับให้ไม่เป็นค่าว่าง ซึ่งสามารถหลีกเลี่ยงการละเว้นการกำหนดค่าได้อย่างมีประสิทธิภาพ
  • เมื่อมีการประกาศการกำหนดค่า KCL ที่จะส่งออก ประเภทและค่าจะไม่สามารถเปลี่ยนแปลงได้ คุณลักษณะคงที่นี้ช่วยให้แน่ใจว่าการกำหนดค่าจะไม่ถูกแก้ไขตามต้องการ
  • KCL สนับสนุนการรับประกันเสถียรภาพเพิ่มเติมผ่านกฎการตรวจสอบความถูกต้องในตัวของโครงสร้าง ตัวอย่างเช่น รูปที่ 12 แสดงให้เห็นว่ารหัส KCL กำหนดข้อจำกัดสำหรับ containerPort, services และ volumes ใน App

รูปที่ 12: การตรวจสอบรหัส KCL ด้วยกฎข้อจำกัด

การรวมบล็อกการกำหนดค่าแบบแยกส่วน

KCL มอบความสามารถในการเขียนบล็อกการกำหนดค่าแบบแยกเดี่ยวและรวมเข้าด้วยกันโดยอัตโนมัติ และรองรับการผสาน idempotent การผสานแพตช์ และกลยุทธ์อื่น ๆ การกำหนดค่าหลายรายการในการรวม idempotent จำเป็นต้องเป็นไปตามกฎหมายการแลกเปลี่ยน และนักพัฒนาจำเป็นต้องจัดการข้อขัดแย้งในการกำหนดค่าระหว่างฐานและสภาพแวดล้อมที่แตกต่างกันด้วยตนเอง การรวมแพตช์ประกอบด้วยการซ้อนทับ การลบ และการเพิ่ม KCL ช่วยลดความยุ่งยากในการพัฒนาการทำงานร่วมกันในฝั่งผู้ใช้ และลดการเชื่อมโยงระหว่างการกำหนดค่าผ่านกลยุทธ์การรวมหลายรายการ

รูปที่ 13: การเขียนบล็อกการกำหนดค่าสถานการณ์หลายสภาพแวดล้อม

ระบบอัตโนมัติ

KCL มีความสามารถที่เกี่ยวข้องกับระบบอัตโนมัติมากมาย รวมถึงเครื่องมือและ API หลายภาษาเป็นหลัก เมื่อใช้โหมด package_identifier : key_identifier KCL รองรับการสร้างดัชนีของค่าคีย์ที่กำหนดค่าไว้ ซึ่งจะทำให้การเพิ่ม การลบ การแก้ไข และการสืบค้นค่าคีย์ใดๆ เสร็จสมบูรณ์ ตัวอย่างเช่น รูปที่ 14 แสดงให้เห็นว่าเราสามารถดำเนินการคำสั่งต่อไปนี้ได้โดยตรงเพื่อแก้ไขรูปภาพ รหัสที่แตกต่างกันก่อนและหลังการแก้ไขจะแสดงในรูปที่ 14 ด้วย

รูปที่ 14: การแก้ไขอิมเมจการกำหนดค่าแอปพลิเคชันโดยอัตโนมัติผ่าน KCL CLI/API

นอกจากนี้ ความสามารถอัตโนมัติของ KCL สามารถรับรู้และรวมเข้ากับ CI/CD ดังแสดงในรูปที่ 15

รูปที่ 15: การบูรณาการระบบอัตโนมัติของ KCL โดยทั่วไป

อ้างอิง