การเขียน Kubernetes Controller, Part 5 — TDD Culture, Observability และ Health Check

Chanwit Kaewkasi
1 min readJan 20, 2022

--

จาก Part ที่แล้วเริ่มลงส่วนของ Spec ไป กลายเป็นว่าช่วงที่ผ่านโปรเจ็คเริ่มใช้งานได้ เลยต้อง Release ตัว TF-controller for Flux ติด ๆ หลายเวอร์ชัน และเริ่มต้อง Demo ให้หลาย ๆ ทีมดู เลยรวบรวมสมาธิเพื่อเขียนโพสต์ใหม่ไม่ค่อยได้ แต่ก็ต้องอัพเดตกันหน่อยเพราะมีประเด็นน่าสนใจเกิดขึ้นในโครงการเยอะในช่วง 1 เดือนที่ผ่านมา

ตอนนี้มี Engineer จากทีมอื่นเข้ามาช่วยเขียนโค้ด 2 คน ก็เลยต้องทำทั้งหน้าที่ Maintainer / Code Review / เขียนโค้ด และเตรียม Use Case ใหม่ ๆ สำหรับ Demo ไปพร้อม ๆ กัน

แต่ก็โชคดีว่า Culture ของโครงการนี้เน้นไปที่ TDD ดังนั้นทุก ๆ PR ที่ Review ก็จะมี Spec หรือ Test Scenario มาด้วยเสมอ คือถ้าไม่มี Test ก็จะไม่ Review และถ้า Test ไม่พอ เช่น ทำมาแค่ Unit Test ก็จะมีการสร้าง Issue รอไว้สำหรับทำ Scenario บน EnvTest ต่อ

เพราะ Unit Test เขียนเพื่อหลอกตัวเองซะเกินครึ่ง

และก็ยังเจอว่าตอนนี้ใช้ EnvTest (จัดเป็น Integration Test) ก็เริ่มไม่พอแล้วสำหรับ Logic ที่จริงมากขึ้น (เพราะ EnvTest มีแต่ Kubernetes Controller แต่ไม่มี Kubelet เลยไม่มี Pod) โดยเฉพาะในแง่มุมของ Security และการใช้ Kubernetes Service Account โยงกับ IAM ของ Cloud Provider เป็นต้น (เช่น IRSA ที่เริ่มใช้ได้แล้ว แต่ตัว Controller ยังจัดการได้ไม่ดีพอ) ดังนั้นตอนนี้ก็ต้องเริ่มคิด เรื่อง E2E Testing แล้ว และสำคัญมากคือต้องใส่ Culture ทาง Security เข้าไปในโครงการให้ได้ ไม่งั้นจะเละเทะในอนาคต

ประเด็นถัดมาคือเรื่อง Observability โดยตอนนี้ ถ้าเกิด Error ขึ้นในระดับ Terraform ก็จะมอง Error ไม่ค่อยเห็น จริง ๆ เรื่องนี้คิดไว้แล้วว่าจะต้องโยงเข้ากับ Notification Controller ของ Flux แต่ก็ยังไม่สมบูรณ์

อีกเรื่องก็จะเป็นการทำ Health Check สำหรับ Resource ที่เป็น Managed Service เรื่องนี้คิดเอาไว้บ้าง และเมื่อได้รับ Comment มาจากตอน Demo ก็ออกแบบไว้บาง เช่น แบบนี้

ต้นสัปดาห์ก็ Release v0.7.0 ที่ใช้ Demo การเตรียม EKS ให้ปรับขนาด Cluster ขึ้นลงได้ด้วย GitOps โดยให้ตัวมันจัดการตัวมันเอง และได้ลง IRSA ไปด้วยในตัว

และก็ได้ลองเตรียม Demo ที่ใช้แก้ปัญหา Classic ของการเปิด S3 Bucket เป็น Public แล้วลืมปิด โดยให้ TF-controller ช่วย Reconcile ตัวสถานะของ S3 Bucket ให้กลับเป็น Private ด้วยฟีเจอร์ Drift Detection

ส่วน Release หน้าเราก็จะมี Helm Chart เป็นของตัวเองแล้ว และก็เจอ Breaking Change ไป 1 ตัวของ API v1alpha1 ที่ออกแบบไว้ ต้องมี Breaking Change เพราะออกแบบไว้ไม่ดีไป 1 จุดตรง attribute .spec.varsForm โดยจะเปลี่ยนจาก Object เป็น Array of Object

สำหรับ Part นี้คงสรุปไว้เท่านี้ก่อน และแน่นอนว่าจะยังต้องมีเรื่องทาง Kubernetes Controller แบบลึก ๆ ที่ยังต้องแกะออกมากันอีกเยอะแยะระหว่างการทำโปรเจ็คนี้

--

--

Chanwit Kaewkasi
Chanwit Kaewkasi

Written by Chanwit Kaewkasi

Technical Advisor at ConfigHub Inc. ex-weaveworks. Go nut since r57 (pre v1)

No responses yet