การเขียน Kubernetes Controller, Part 2 — เริ่มใช้ Kubebuilder
จาก Part 1 ที่ได้ปูพื้นไว้ว่า ทักษะอะไรบ้างที่จำเป็นในการเขียน Kubernetes Controller และปกติเราใช้อะไรสร้าง Controller ซึ่งก็คือ SDK ตัวนึงที่ชื่อ Kubebuilder ที่เป็นโครงการของ Kubernetes SIG
ในโพสต์ชุดนี้ผมจะใช้โครงการ TF-Controller ที่ผมสร้างขึ้นเป็นตัวโครงสำหรับเล่าขั้นตอนการพัฒนา TF-Controller เป็น Kubernetes Controller ที่จัดการ Terraform Resource (.tf ทั้งหลาย) ให้เป็นรูปแบบ GitOps โดย Resource ใหม่ที่สร้างขึ้น (Terraform.infra.contrib.fluxcd.io/v1alpha1) นั้นจะต่อเข้ากับ Resource ของ Flux’s Source controller เพื่อดึงไฟล์ .tf มา Reconcile ในตัว Controller แล้วสร้าง Terraform Plan ไว้ในตัว Kubernetes ก่อนใช้มันสร้าง TFState และ Resource จริง
ตอนนี้เราใช้ Terraform กันใน CI pipeline แล้วเกิดปัญหาหลาย ๆ อย่างโดยเฉพาะทาง Security บ้าง, ระบบไม่เป็น Zero Trust บ้างเพราะข้อมูล sensitive หลายอย่างใน CI pipeline หลุดออกไปได้ง่าย
เป้าหมายของโครงการนี้คือการออกแบบกลไกที่สามารถเอา Terraform มาใช้ในโลกของ GitOps ให้ได้เหมาะสมมากขึ้น ใช้ Eco-System ที่แข็งแรงของ Kubernetes และใช้ฟีเจอร์ทาง Security ของ Flux ให้เป็นประโยชน์ เพื่อให้การใช้งาน Terraform สามารถผสานเข้ากับ GitOps pipeline ได้และมีความมั่นคงปลอดภัยมากขึ้น
ถ้าจะเรียกง่าย ๆ มันก็คือ GitOps Terraform Controller
ตัวโครงการตอนนี้กำลังพัฒนาอยู่ที่ GitHub repo ที่นี่ครับ
ใน Part 2 นี้ก็จะมาลองดูว่าเวลาสร้าง Controller เราจะเริ่มกันได้ยังไง
ก่อนอื่นก็ download ตัว Kubebuilder มาจากเว็บไซต์ของโครงการก่อน (โครงการอยู่บน GitHub) และเราต้องไม่ลืมว่าภาษาที่ใช้เขียน Controller คือ Golang ก็ต้องติดตั้ง Go ก่อน โดย Go 1.16 จะเป็น version ของ Go ที่ใช้กันมากที่สุดในช่วงปีนี้ (และเรามักจะ update Go ไปเรื่อย ๆ ในช่วงการดูแล Controller)
เวลาเราจะเริ่มสร้าง Kubernetes Controller เราจะสร้าง directory ว่างก่อน เช่น
จากนั้นก็ใช้คำสั่ง go mod init สร้าง Go project ขึ้นมา และเราก็จะใช้ Kubebuilder สร้าง project ของตัว Controller ขึ้นมา
และทำการสร้าง API ซึ่งจะเป็น struct ของ Resource ที่เราใช้ตอบโต้กับ Kubernetes โดยจะตั้งชื่อชนิดของ Resource (kind) ว่า Terraform อยู่ใน group “infra” และชื่อ apiVersion ก็จะเป็น infra.contrib.fluxcd.io/v1alpha1
เมื่อได้ source code ตั้งต้นของตัว Controller เราก็จะสามารถสั่ง make generate และ make manifests เพื่อสร้าง YAML ของ CustomResourceDefinition ขึ้นมาได้
ในเอกสารของ Kubebuilder ก็จะให้เราทดลองรันตัว Controller เลย แต่ในความเป็นจริงมันก็จะยังไม่ make sense ซักเท่าไหร่ เพราะจุดที่ต้องคิดหลังจากนี้ก็คือ Spec ที่ควรจะเป็นของตัว Resource เช่น
ซึ่งจริงๆ แล้วควรจะได้จากการเขียน Spec ในรูปแบบของ Test แล้วค่อย ๆ ว่า พฤติกรรมให้กับ Controller
โดยในครั้งถัดไป เราจะมาดูตัว TDD ที่ใช้วาง Spec แรกของ Controller ตัวนี้กันครับ