คำถามเกี่ยวกับการใช้เทมเพลต YAML
- ตั้งคำถามว่าการใช้เทมเพลต YAML เริ่มถูกยอมรับว่าเป็นเรื่องปกติตั้งแต่เมื่อไร และมันถูกยอมรับได้อย่างไร
- นำเสนอเกี่ยวกับความจำเป็นของการจัดการคอนฟิก Kubernetes และโซลูชัน kr8 ที่ cfgmgmtcamp 2019
- ระหว่างการบรรยายได้ตั้งข้อสงสัยเกี่ยวกับเทมเพลต YAML จนเกิดการถกเถียงอย่างคึกคักทั้งออนไลน์และในงานประชุม
ปัญหาด้านคอนฟิก
- เมื่อแอปพลิเคชันและโครงสร้างพื้นฐานเติบโตเกินระดับหนึ่ง ก็จะต้องเผชิญกับปัญหาความซับซ้อนของคอนฟิก
- คอนฟิกของแอปพลิเคชันที่นำไปใช้งานในสภาพแวดล้อมต่าง ๆ (development, staging, production) หรือภูมิภาคต่าง ๆ (ยุโรป, อเมริกาเหนือ) อาจแตกต่างกัน
- ผู้ดูแลระบบหรือวิศวกร DevOps เข้าใจดีถึงความซับซ้อนของการจัดการคอนฟิก และแต่ละเครื่องมือต่างก็ใช้ YAML เพื่อแก้ปัญหานี้
เรากำลังถอยหลังหรือไม่?
- เมื่อความต้องการของอุตสาหกรรมเปลี่ยนไปพร้อมกับ cloud computing เครื่องมือใหม่ ๆ ก็เกิดขึ้น
- เครื่องมืออย่าง CloudFormation และ Helm เป็นเครื่องมือด้านคอนฟิกที่ยอดเยี่ยม แต่ผู้เขียนเชื่อว่าอุตสาหกรรมโดยรวมได้ทำพลาดไปตอนออกแบบเทมเพลต YAML
- อธิบายโดยยกตัวอย่าง Helm chart ที่รับพารามิเตอร์แบบกำหนดเองจากผู้ใช้
Helm chart
- Helm chart รับพารามิเตอร์ภายนอกผ่านไฟล์
values.yaml แล้วเรนเดอร์ chart
- อธิบายความซับซ้อนที่เริ่มจากพารามิเตอร์สตริงแบบง่าย ไปจนถึงการจัดการฟิลด์ทางเลือก อาร์เรย์ และแมป
- ชี้ให้เห็นถึงข้อกำหนดเรื่องช่องว่างที่เข้มงวดของ YAML และข้อจำกัดของระบบเทมเพลต
JSON, Jsonnet & YAML
- YAML เป็น superset ของ JSON และการแปลงระหว่างสองรูปแบบนี้ทำได้ง่าย
- Jsonnet เป็นภาษาสำหรับทำเทมเพลตข้อมูลที่มีจุดประสงค์เพื่อสร้างคอนฟิก JSON
แนวคิดแบบสาวกของ Jsonnet
- Jsonnet เป็นภาษาใหม่ที่ยังไม่ค่อยเป็นที่รู้จักนอกชุมชน Kubernetes
- สามารถใช้ Jsonnet เพื่อสร้างคอนฟิก JSON ที่ใช้ตัวแปรภายนอกได้อย่างง่ายดาย
- อธิบายวิธีจัดการฟิลด์ทางเลือก แมป พารามิเตอร์ และความสามารถเพิ่มเติมของ Jsonnet
Kr8
- Kr8 ใช้วิธีการทั้งหมดที่จำเป็นเพื่อทำให้การสร้างและจัดการคอนฟิกของหลาย Kubernetes cluster เป็นเรื่องง่ายและตรงไปตรงมา
- หากเห็นด้วยกับแนวคิดที่อธิบายในที่นี้ ผู้เขียนแนะนำให้ลองดู Kr8
ความเห็นของ GN⁺
- ความซับซ้อนของเทมเพลต YAML: บทความนี้ชี้ให้เห็นถึงความซับซ้อนและข้อจำกัดของเทมเพลต YAML และสะท้อนปัญหาที่อุตสาหกรรมกำลังเผชิญในการจัดการคอนฟิกได้อย่างชัดเจน
- ข้อดีของ Jsonnet: Jsonnet ถูกนำเสนอเป็นทางเลือกแทนเทมเพลต YAML และเน้นย้ำถึงความง่ายในการใช้งานและความยืดหยุ่น ซึ่งช่วยกระตุ้นความสนใจต่อเครื่องมือใหม่ ๆ
- อนาคตของการจัดการคอนฟิก: บทความนี้มอบมุมมองต่ออนาคตของการจัดการคอนฟิก และเปิดโอกาสให้วิศวกร DevOps และผู้ดูแลระบบได้สำรวจแนวทางใหม่ ๆ
1 ความคิดเห็น
ความคิดเห็นใน Hacker News
มีคนบ่นเรื่องไฟล์คอนฟิก YAML กันมาก และแม้แต่ใน GitHub Actions ก็ถูกมองว่าเป็นส่วนที่แย่ที่สุด อีกทั้งยังให้ความรู้สึกคล้ายกันกับภาษาเขียนคอนฟิกแบบปิดอื่น ๆ (HCL, ASL เป็นต้น) แม้ declarative API จะดี แต่ก็มีความต้องการให้สามารถสร้าง declaration แบบเป็นโปรแกรมได้
การประกาศและสร้างคอนฟิกด้วยโค้ดให้ประสบการณ์ที่ดีกว่า AWS CDK เข้าใจจุดนี้อย่างแม่นยำ และทำให้สามารถเขียนนิยามเชิงประกาศของคอนฟิกและโครงสร้างพื้นฐานคลาวด์ได้ด้วยภาษาที่ type-safe พร้อมการรองรับจาก IDE
เห็นด้วยว่าการทำ YAML templating เป็นเรื่องไม่สมเหตุสมผล และเมื่อจำเป็นต้องมีลอจิกที่ซับซ้อน ก็ควรใช้ภาษาโปรแกรมจริงเพื่อสร้าง YAML/JSON เป็นต้น ซึ่งช่วยแก้ปัญหาได้หลายอย่าง
มีการพูดถึง Kubernetes ว่าแม้ Kubernetes API จะค่อนข้างเข้าใจง่ายและมี JSON schema ที่นิยามไว้อย่างดี แต่ผู้คนกลับต้องเสียเวลาอย่างมากไปกับการเรียนรู้วิธีใช้ Helm chart ขณะที่ Jsonnet, Ksonnet, Nu, CUE ไม่ได้รับความนิยมมากนัก และดูเหมือนว่าคนส่วนใหญ่จะใช้ Kustomize ที่มีมาใน kubectl
มีข้อสังเกตว่านักพัฒนาไม่ได้คิดมากพอว่าควรจัดการคอนฟิกให้ถูกต้องอย่างไร การเขียนโปรแกรมทั้งหมดอาจพูดได้ว่าเป็นปัญหาเรื่องคอนฟิกโดยพื้นฐาน และคอนฟิกทั้งหมดสุดท้ายก็ถูกส่งเข้าไปเป็นพารามิเตอร์ของฟังก์ชันบางตัว การเก็บคอนฟิกไว้ในฐานข้อมูลส่วนกลางอาจจะดีกว่า
ใน CI/CD มีกรณีที่ YAML ถูกใช้แทบจะเหมือนภาษาโปรแกรม ซึ่งทั้งยืดยาวมาก ไม่เป็นธรรมชาติ และถูกมองว่าเป็นภาษาเฉพาะของเวนเดอร์ที่นิยามไว้ไม่ชัดเจน
มีคนเสียดายที่ Helm เป็นฝ่ายชนะ การทำงานกับ Helm chart นั้นลำบากมาก ตัวแก้ไขก็ช่วยอะไรไม่ได้ และต้องจัดข้อมูลทุกอย่างให้เยื้องถูกต้องด้วย 'indent 4' มีการคาดการณ์ว่า Helm จะนำไปสู่จุดจบของ Kubernetes
มีปรัชญาส่วนตัวว่าไม่ควรใช้ string interpolation เพื่อสร้างโค้ดที่เครื่องต้องอ่าน เพราะปัญหาอย่าง SQL injection และ cross-site scripting จะยังคงเกิดขึ้นต่อไป และยังยืนยันว่าไม่ควรใช้ไฟล์เทมเพลตเพื่อสร้าง HTML
มีความเห็นว่าคนที่เลือก YAML ดูเหมือนจะไม่ตระหนักถึงปัญหา มีความขัดแย้งโดยตรงระหว่างรูปแบบการแสดงข้อมูลที่ยึดมนุษย์เป็นศูนย์กลางกับรูปแบบที่ยึดคอมพิวเตอร์เป็นศูนย์กลาง และ YAML กับ JSON ก็เป็นรูปแบบข้อมูลคนละแบบกันจริง ๆ
มีคนบอกว่าชอบ YAML แต่ก็สบถกับมันทุกวันเวลาทำงานกับ Helm chart แม้จะไม่ชอบ Helm แต่เพราะทุกคนใช้ จึงยังต้องใช้ต่อไป
กำลังพิจารณาย้ายไปใช้ cuelang และคิดว่ามันออกแบบมาได้ดีกว่า Jsonnet Kubernetes มีความสามารถในการปรับสถานะอยู่แล้ว ดังนั้นถ้าเพิ่มความสามารถในการลบเข้าไปก็เพียงพอ