เคซีแอลคืออะไร
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 โดยทั่วไป
อ้างอิง
- บล็อกแนวทางปฏิบัติในการกำหนดค่า KusionStack Cloud Native: https://kusionstack.io/blog/2021-kusion-intro
- ภาษา Terraform: https://www.terraform.io/ language
- Kubernetes ผู้ให้บริการ Terraform: https://github.com/hashicorp/terraform-provider-kubernetes
- ผู้ให้บริการ Terraform AWS: https://github.com/hashicorp/terraform-provider-aws
- ปูลูมี: https://www.pulumi.com/docs/
- ปูลูมิ กับ เทอร์ราฟอร์ม: https://www.pulumi.com/docs/intro/vs/terraform/
- การออกแบบการกำหนดค่าสมุดงาน Google SRE: https://sre.google/workbook/configuration-design/
- เอกสารของ Google Borg: https://storage.googleapis.com/pub-tools-public-publication-data/pdf/43438.pdf
- การจัดการการกำหนดค่าแบบองค์รวมที่ Facebook: https://sigops.org/s/conferences/sosp/2015/current/2015-Monterey/printable/008-tang.pdf
- ข้อมูลจำเพาะ JSON: https://www.json.org/json-en.html
- ข้อมูลจำเพาะ YAML: https://yaml.org/spec/
- GCL: https://github.com/rix0rrr/gcl
- HCL: https://github.com/hashicorp/hcl
- คิว: https://github.com/cue-lang/cue
- Jsonnet: https://github.com/google/jsonnet
- ดฮอลล์: https://github.com/dhall-lang/dhall-lang
- ความประหยัด: https://github.com/Thriftpy/thriftpy2
- ปรับแต่ง: https://kustomize.io/
- Kube-linter: https://github.com/stackrox/kube-linter
- เช็คอฟ: https://github.com/bridgecrewio/checkov
- เอกสาร KCL: https://kcl-lang.io/docs/reference/lang/tour
- วิธีการทำงานของ Terraform: การแสดงภาพเบื้องต้น: https://betterprogramming.pub/how-terraform-works-a-visual-intro-6328cddbe067
- วิธีการทำงานของ Terraform: โมดูลที่มีภาพประกอบ: https://awstip.com/terraform-modules-illustrate-26cbc48be83a
- หมวก: https://helm.sh/
- Helm กับ Kustomize: https://harness.io/blog/helm-vs-kustomize
- KubeVela: https://kubevela.io/docs/