จะ GitOps ตัว Terraform ได้อย่างไร — Blog post และ Webinar บน CNCF

Chanwit Kaewkasi
2 min readSep 30, 2022

ขอเขียนถึงซักหน่อยเพราะนาน ๆ ทีโปรเจ็คที่สร้างจะได้ไปโลดแล่นบน Blog ของ CNCF กับเขาบ้าง

CNCF คืออะไร?

CNCF ย่อมาจาก Cloud Native Computing Foundation เป็นหน่วยงานย่อยใต้ Linux Foundation โดย CNCF มีหน้าที่กำกับดูแลโครงการ Open Source กลุ่ม Cloud Native ที่ใช้กันทั่วไปก็ เช่น Kubernetes และแม้แต่โครงการที่ยิ่งใหญ่อย่าง Istio ก็กำลังย้ายตัวเองมาอยู่ใต้ CNCF เช่นกัน

ก็ CNCF + Linux Foundation นี่แหละครับที่ออกใบเซอร์พวก CKA, CKS มาให้สอบกัน

“How to GitOps your Terraform” หรือ เป็นบทความที่เขียนด้วยทีม Flux (และมีผมช่วยเกลา) โดยจะแนะนำและเล่าถึงการใช้ TF-controller ในฐานะที่เป็น Flux Controller ที่ทำให้การทำ Infrastructure as Code (IaC) ด้วย Terraform นั้นสามารถใช้งานใน GitOps Pipeline ได้ และก็เริ่มกันตั้งแต่แบบเบื้องต้นเลย

โดยปกติเรามักจะมองภาพแยกจากกันว่า IaC คือเรื่องนึง และ GitOps ก็อีกเรื่องนึง หลาย ๆ ครั้งก็จะรู้สึกว่ามันขัด ๆ กัน แต่ด้วย Weave GitOps Terraform Controller (ชื่อเต็มของ TF-controller) ที่ถูกออกแบบมาจากฝั่ง GitOps เพื่อให้ครอบคลุมการใช้งาน จาก Kubernetes ขยายออกไปในระดับ Infrastructure ทำให้เราสามารถจัดการทั้ง App และ Infra ได้ด้วยเครื่องมือชุดเดียว

เกริ่นมาซะเยอะ จริง ๆ แล้วเนื้อหาทั้งหมดสามารถย้อนอ่านเป็นภาษาไทยได้ในโพสต์ก่อน ๆ ของผมบน Medium ครับ

ในบทความไม่ได้พูดถึง Crossplane หรือ Pulumi แต่ก็จะขอเพิ่มเนื้อหาลำเอียง ๆไม่ได้จะเปรียบเทียบอะไรกันนิดหน่อย

Crossplane

Crossplane เป็นเครื่องมือทำ IaC บน Kubernetes โดยสร้าง Custom Resource สำหรับแต่ละ Terraform Resource และมีความเจ๋งคือสามารถนำ Custom Resource มาประกอบเป็น Resource ใหม่ได้

Resource ทั้งหมดของ Crossplane แน่นอนว่าใช้ใน GitOps Pipeline ได้ทันทีเพราะเป็น K8s Custom Resource

ในทาง Engineering นั้น Crossplane ออกแบบมาได้ Kubernetes-ish แบบสุดทาง

แต่ทีม Crossplane คงจะลืมไปว่า Terraform Resource นั้นมีจำนวนมหาศาล สิ่งที่เกิดขึ้นก็คือ ถ้าจะใช้ Crossplane เพื่อทำงานบน AWS ก็จะต้องติดตั้ง AWS Package ก่อน นั่นหมายถึงต้องลง CRD จำนวนประมาณ 730 CRD เข้าไปในระบบของ Kubernetes เพื่อที่จะเริ่มใช้ AWS Resource ตัวแรก

(ถ้านึกไม่ออกลองเทียบเป็นการต้องสร้าง Table ใน DBMS จำนวน 730 ตาราง เพื่อที่จะเริ่ม Insert ข้อมูล 1 Record)

ผลลัพธ์ก็คือ Control Plane ของ Kubernetes ต้องทำงานหนักโดยไม่จำเป็น

ก็เป็นเรื่องของ Design Principle ที่เมื่อเราอยากได้ interface ในลักษณะ YAML-based สำหรับ Terraform

(จริง ๆ ผมก็อยากได้ feature แบบนี้สำหรับ TF-controller เราโชคดีที่สร้างทีหลังเลยได้เรียนรู้ข้อผิดพลาดจากพวกเขา — แอบ Spoil ว่าตอนนี้เราก็ทำได้แล้วแบบฟลุ๊ก ๆ และแก้ข้อจำกัดเรื่อง CRD ได้แบบ 100%)

Pulumi

Pulumi มา way แบบ Developer-first จะเทียบกับ TF-controller ก็คงเทียบตรง ๆ ไม่ได้เพราะคนละ Target

Dev ส่วนใหญ่จะชอบ Pulumi เพราะเขียน infra ได้จากทั้ง TypeScript เอย ทั้ง Python เอย บริษัทที่มองว่าการใช้ภาษาเดียวกันทั้งองค์กรเพื่อลดความเสี่ยงด้านคนทำงานก็จะชอบไป way นี้

Pulumi ยังไม่เริ่ม จริง ๆ ต้องบอกว่าเพิ่งเริ่มที่จะทำตัวเชื่อมมาทางฝั่งของ GitOps และคิดว่าน่าจะไปได้สวย

ถ้าอยากได้วิธีประมาณ Pulumi แต่ทำ GitOps ได้เลยวันนี้จะทำยังไง

คำตอบคือใช้ CDKTF กับ TF-controller ได้เลยครับ ลองแล้ว work เฉยเลย

ทิศทางของ IaC และ GitOps

ตอนนี้ผมเริ่มเห็นการ adopt ตัว TF-controller ในระดับที่กว้างขึ้นแล้ว และ TF-controller กำลังจะเป็นกลายเป็น 1 ในโครงการที่เริ่มเป็นตัวกำหนดทิศทางของ IaC และ GitOps ในอนาคต เราเริ่มถูกเอาไปเปรียบเทียบกับ Crossplane มากขึ้น เราเริ่มมีฟีเจอร์ใหม่ ๆ ที่คนนึกไม่ถึง เรากำลังจะมีระบบ package ที่สร้างง่าย แก้ไขง่าย และ Secure

อีก 3 เดือนก่อนจะหมดปี คงจะได้เห็นฟีเจอร์ที่น่าสนใจอีกหลาย ๆ อย่างจากตัวโครงการ

สำหรับคนที่สนใจเพิ่มเติม ดู CNCF Webinar ได้จากที่นี่ครับ

มีอะไรบ้าง Webinar ตัวนี้

อันนี้ที่ผมนึกไม่ถึงเลยก็คือ Pinky (คน Present) เอา Vault มาติดตั้งด้วย Terraform แล้วก็แกล้งสวมบทคนร้ายเข้าไปลบ Secret ใน Vault

TF-controller ก็ทำการเตือนผ่าน Slack แล้วก็กู้ Secret ใน Vault ที่โดนลบออกไปกลับมาให้ เป็น Use Case ที่ Cool มาก ขนาดคนสร้างเองดูจบแล้วยังอยากหาเวลาลองเล่นบ้างเลย

--

--

Chanwit Kaewkasi

Creator Weave TF-controller, Kubernetes & GitOps for Terraform, SNR SE @weaveworks, Go nut since r57 (pre v1)