AWS Summit Bangkok 2024: จัดการ Kubernetes แบบเบ็ดเสร็จด้วย cdk8s(+)

บทความนี้ผมจะอธิบายเกี่ยวกับ cdk, cdk8s, และ cdk8s+ ซึ่งเป็นเครื่องมือที่จะช่วยให้เราสามารถใช้งาน Kubernetes ได้ง่ายและสะดวกกว่าที่เคยทำมา ไม่ว่าจะใช้ Kubernetes บน AWS หรือบน platform อื่น ๆ ก็ตาม

เนื้อหาในบทความนี้สรุปมาจาก Session [New era of IaC: Effective Kubernetes management with cdk8s] ในงาน AWS Summit Bangkok 2024

เกริ่นนำ

ในยุดแห่งการทำ Containerization นี้ Kubernetes เป็นหนึ่งในเครื่องที่มือได้รับความนิยมและใช้งานกันอย่างแพร่หลายมากในหมู่นักพัฒนา Kubernetes สามารถทำหน้าที่ของมันได้อย่างแทบจะไร้ที่ติ กำแพงเพียงอย่างเดียวที่ขัดขวางมันจากคำว่า "สมบูรณ์แบบ" คือความยากในการสร้างและจัดการ cluster ครับ

การสร้าง cluster กับการจัดการ cluster ฟังดูเหมือนเป็นสองสิ่งที่อยู่แยกกัน แต่ความเป็นจริงแล้วสองอย่างนี้เกี่ยวข้องกันอย่างมากครับ เมื่อเราสร้าง cluster ขึ้นมา เราจะต้องจัดการกับ cluster ที่เราสร้างขึ้นมานั้นในภายหลัง cluster ที่มีโครงสร้างซับซ้อนแต่ต้องการการจัดการที่ง่าย ก็จะส่งผลให้ขั้นตอนในการออกแบบและสร้าง cluster ยุ่งยากขึ้น เพื่อทลายกำแพงนี้ลงจึงได้มีแพลตฟอร์มต่าง ๆ ที่ให้บริการ Kubernetes เกิดขึ้นมามากมาย ซึ่ง AWS ก็มีบริการสำหรับ Kubernetes โดยเฉพาะที่เรียกว่า Elastic Kubernetes Service หรือ EKS เช่นกันครับ

cluster ที่สร้างขึ้นบน EKS นั้น ทาง AWS จะรับหน้าที่ในการดูแล control plane ให้ สิ่งที่ผู้ใช้งานต้องทำก็มีแค่สร้างและใช้งาน worker node และติดต่อกับ master node ผ่าน cluster endpoint ที่ AWS เตรียมไว้ให้ก็พอครับ ทำให้สิ่งที่ผู้ใช้งานต้องคิดเวลาสร้าง cluster ขึ้นจะน้อยลงเหลือเพียงไม่กี่อย่างเท่านั้น

แต่ถึงอย่างนั้นมันก็ยังง่ายไม่พอครับ เพราะหาก cluster ที่ต้องสร้างมีจำนวนมาก การสร้าง cluster ทีละอัน ๆ ผ่านหน้า AWS console คงไม่ใช่เรื่องที่น่าสนุกนัก AWS จึงได้สร้างเครื่องมือที่เรียกว่า cdk ขึ้นมาเพื่อแก้ปัญหานี้ครับ

cdk

cdk เป็น IaC ของ AWS ที่ใช้สำหรับสร้าง resource ต่าง ๆ บน AWS ครับ จุดเด่นของ cdk คือเราสามารถเขียน resource หรือ infrastructure ต่าง ๆ เก็บไว้ในรูปแบบของ IaC โดยใช้ programming language ที่เราถนัดได้ แล้วนำมา deploy ในเวลาที่เราต้องการ ถ้านำมาเปรียบเทียบกับเครื่องมือ IaC อื่น ๆ ของ AWS เช่น CloudFormation จะเห็นได้ว่าจุดเด่นของ cdk คือการที่เราสามารถเขียน IaC ได้โดยไม่โดยไม่จำเป็นต้องใช้ YAML และสามารถใช้ฟังก์ชันของ programming language นั้น ๆ ในการสร้าง IaC ที่มีโครงสร้างหรือองค์ประกอบที่ซับซ้อนได้

cdk8s

cdk8s เป็น IaC ที่ใช้สำหรับสร้าง Kubernetes resource ครับ จุดประสงค์ของ cdk8s จริง ๆ แล้ว คือเพื่อหลีกเลี่ยงการเขียนไฟล์ manifest ในรูปของ YAML แต่ให้ไปเขียนไฟล์ manifest ในภาษาที่ผู้ใช้งานนั้น ๆ ถนัดแทน จากนั้น cdk8s จะแปลง code ที่เราเขียนออกมาเป็นไฟล์ manifest ที่อยู่ในรูปของ YAML ให้เรานำไปใช้งานต่ออีกทีครับ

cdk8s ทำให้เราสามารถสร้าง Kubernetes resource ทุกอย่างได้โดยไม่จำเป็นต้องเขียนไฟล์ YAML ไม่ว่าจะเป็น deployment, service, etc. resource ต่าง ๆ เหล่านี้สามารถเขียนเป็น IaC ด้วยภาษาที่ต้องการ รวมไว้ในไฟล์เดียวกันได้ครับ

ภาพด้านล่างนี้คือไฟล์ manifest ที่เขียนด้วย cdk8s ในภาษา typescript และผลลัพธ์จากการแปลงไฟล์ดังกล่าวออกมาในรูปของไฟล์ YAML (คลิกเพื่อดูรูปใหญ่)

อย่างแรกที่เห็นได้ชัดที่สุดคือความยาวของ code และความยาวของผลลัพธ์ที่ได้ออกมาครับ จะสังเกตเห็นได้ว่า cdk8s นั้น ผลลัพธ์ที่เราได้คือไฟล์ YAML manifest ที่มีความยาวพอ ๆ กับ code ต้นฉบับ

อย่างที่สองคือรายละเอียดของไฟล์ YAML ที่ออกมา จะตรงกับที่เรากำหนดใน code ต้นฉบับทุกอย่าง และค่าไหนที่เราไม่ได้กำหนดก็จะไม่มีในไฟล์ YAML ซึ่งจะเห็นได้ว่าในไฟล์ YAML ที่ออกมานั้น มีเส้นสีเหลืองเป็น warning คอยเตือนอยู่ ซึ่งสาเหตุมาจากการที่ผมไม่ได้กำหนด resource limit สำหรับ container เอาไว้นั่นเองครับ

cdk8s+

cdk8s ก็มีแล้ว แล้วจะมี cdk8s+ ไปทำไมอีก จะสงสัยแบบนี้ก็ไม่แปลกครับ cdk8s+ เหมือนกับ cdk8s ทุกประการเลยครับ สิ่งที่แตกต่างกันก็คือ หากเราเขียน IaC ด้วย cdk8s+ เราไม่จำเป็นต้องระบุการตั้งค่าทุก ๆ อย่างก็ได้ สามารถละการตั้งค่าบางส่วนออกไป เพื่อทำให้ code สั้นลง และเราก็เขียน code น้อยลงด้วยครับ โดยการตั้งค่าที่เราละไป ไม่ได้ตั้งค่านั้น AWS จะแทนค่าด้วยค่า default ซึ่งเป็นไปตาม best practice ของ AWS ครับ

ภาพด้านล่างนี้คือไฟล์ manifest ที่เขียนด้วย cdk8s+ ในภาษา typescript และผลลัพธ์จากการแปลงไฟล์ดังกล่าวออกมาในรูปของไฟล์ YAML (คลิกเพื่อดูรูปใหญ่)

ลองย้อนกลับไปดูผลลัพธ์ที่ได้จาก cdk8s นะครับ จะเห็นได้ชัดเลยว่ารอบนี้ผมเขียน code สั้นกว่ารอบที่แล้วมาก คือกำหนดแค่ container image แต่ไฟล์ YAML ที่ออกมากลับมีรายละเอียดมากกว่าไฟล์ YAML ที่ได้จาก cdk8s มากครับ ซึ่งค่าเหล่านี้ cdk8s+ จะทำการตั้งให้โดยอิงจาก best practice โดยหากสังเกตให้ดี ๆ จะพบว่ารอบนี้ในไฟล์ YAML มีการกำหนด resource limit ให้กับ container เอาไว้ด้วยต่อให้ผมจะไม่ได้กำหนดค่านี้ในตอนเขียน code ต้นฉบับก็ตาม รวมถึงมีการกำหนดค่าอื่น ๆ ที่สำหรับบางค่านั้นผมก็ยังไม่รู้ด้วยซ้ำครับว่ามันเอาไว้ทำอะไร

และหากค่าที่ cdk8s+ กำหนดมาให้เกิดไม่ตรงกับความต้องการของเรา เช่น resource limit ของ container อาจจะต่ำเกินไป เราก็สามารถเข้ากำหนดค่านี้ด้วยตัวเองใน code ต้นฉบับได้ครับ

สุดท้ายนี้

cdk, cdk8s และ cdk8s+ นั้นเราสามารถใช้งานร่วมกันได้ครับ โดยใช้ cdk เพื่อสร้าง cluster แล้วใช้ cdk8s หรือ cdk8s+ เพื่อสร้างไฟล์ manifest ขึ้นมา โดยหากต้องการความเรียบง่ายก็อาจจะใช้ cdk8s+ ที่กำหนดค่าเพียงนิดเดียวแล้วปล่อยที่เหลือให้เป็นหน้าที่ของ cdk8s+ ไป หรือถ้าหากต้องการตั้งค่าทุกอย่างเอง ก็อาจจะใช้ cdk8s ที่สามารถมั่นใจได้ว่าจะไม่มีการตั้งค่าอื่น ๆ ที่อยู่นอกเหนือความคาดหมายเข้ามาอยู่ในไฟล์ manifest ของเราครับ แต่สุดท้ายแล้วสิ่งที่ผมกล่าวไปทั้งหมดก็เป็นแค่ภาพรวมคร่าว ๆ จะใช้เครื่องมือไหน อย่างไร ก็ขึ้นอยู่กับทุก ๆ ท่านที่จะต้องตัดสินใจด้วยตัวเองครับ

บทความที่เกี่ยวข้อง