EKZ — สร้าง Kubernetes Distro ใช้เอง

โครงการที่ผมทำส่วนใหญ่มักจะเกี่ยวข้องกับ Amazon AWS และบางตัวก็ใช้ EKS (บริการ Kubernetes ของ AWS) เป็นคลัสเตอร์ — ไม่ใช่ว่า Kubernetes ของคลาวด์อื่น ๆ ไม่ดีนะครับ แค่เพราะผมต้องใช้คลาวด์ของ Amazon เป็นส่วนใหญ่

ปัญหาก็มีอยู่ว่า อยากจะทดสอบแอพพลิเคชั่น หรือช่วยทีมทดสอบ Flux รุ่นใหม่ ๆ ทีไรก็ต้องลองสร้างคลัสเตอร์จริงบน EKS ซึ่งการสร้างแต่ละครั้งมันก็จะกินเวลานาน ไอ้จะสร้างทิ้งไว้ตลอดก็เปลือง ติดขัดเรื่องนี้มาก็นานแล้ว

ช่วงต้นปีที่ผ่านมาพอดีมีจังหวะที่ AWS ทำการเปิดตัวโครงการ EKS-D ซึ่งเป็นการทำ distro ของ Kubernetes โดยใช้ patch ชุดที่ใช้กับ EKS จริงมาเปิดเป็นโครงการ Open Source ผมก็ไม่รอช้า ลองเอา binaries ของโครงการ EKS-D มาทดลอง ก็พบว่าเป็น Kubernetes binary ตัวดิบ ๆ เช่น kubelet, kubeadm และอื่น ๆ

บังเอิญก่อนหน้านั้นได้ทดลองเล่นโครงการ k0s ของ Mirantis (เจ้าของใหม่ของ Docker EE) ก็พบว่าสถาปัตยกรรมของ k0s เข้ากับได้กับ binary ตัวดิบ ๆ ที่ได้มาจาก EKS-D ก็เลยเอามาเล่นแร่แปรธาตุกัน ออกมาเป็นตัวต้นแบบที่พอจะใช้ได้ ในรูปแบบของ container

คือผมต้องการ Kubernetes Distro สำหรับใช้ลองทำงานบน desktop ไม่ได้จะเอามาทำ server หรืออะไร ก็เลยเตรียมไว้ในลักษณะของ container (ก็คือ รัน Kubernetes คลัสเตอร์ทั้งตัวใน container นะแหละครับ)

จากน้นก็ใช้เทคนิคทาง Software Engineering เพิ่มเติมนิดหน่อยเพื่อให้สามารถ maintain กลุ่มของ patch ได้โดยไม่ต้อง fork หรือ maintain branch (คือการ fork โดยที่ไม่ fork)

พอหลังจากนั้นก็ไปเจอว่า user หลาย ๆ คนไม่ชอบที่จะใช้ k0s แต่ชินกับ KinD มากกว่า (KinD คือโครงการ Kubernetes in Docker ภายใต้ CNCF) ผมเลยลองผสม EKS-D เข้ากับ KinD ดู ปรากฎว่าก็ใช้งานได้ เลยทำให้ Kubernetes Distro ที่ทำขึ้นมามี 2 implementation ก็คือ EKS-D ในเปลือกของ k0s และ EKS-D ในเปลือกของ KinD

บางคนอาจจะถามว่า แล้วทำไมไม่ใช้ KinD คำตอบคือ KinD ใช้ Kubernetes binary จาก upstream ที่ไม่มีบาง patch ของ EKS และเป้าหมายของผมก็คือการลอง compatibility ของ app เพื่อจะเอาไปรันบน EKS

ข้อดีของการลองสร้างให้มีทั้ง 2 implementation คือได้เรียนรู้ฟีเจอร์ของทั้ง k0s และ KinD และรู้ว่ามีส่วนไหนเกิน ส่วนไหนขาด จะทำให้ฟีเจอร์ของทั้ง 2 implementation พอๆ กันได้ยังไง

ผลลัพธ์ที่ได้ก็คือโครงการ EKZ ซึ่งเป็น Kubernetes บน Desktop ที่มีขนาดไม่ใหญ่มากและตัว binary มีความ compatible กับ EKS ของ AWS โดยผมใช้ Calico เป็น network driver และมี network policy enabled ไว้แบบ default (ได้ใช้ตอนทดสอบ Flux v2 ให้กับทีมพอดี) โดยเท่าที่ทดสอบคลัสเตอร์ที่สร้างด้วย EKZ จะค่อนข้างเบากว่า Kubernetes ที่มากับ Docker for Desktop

ใครที่ต้องการทดสอบโปรแกรมเพื่อดู compatibility กับ EKS หรือจะใช้เพื่อลองหัด Kubernetes หรือหัด GitOps ก็สามารถโหลดไปทดลองกันได้ครับ มีให้ใช้ทั้งบน Linux, Windows (WSL2, Docker Desktop) และ mac OSX (Docker Desktop) สิ่งที่ต้องการก่อนลงก็คือ Docker แล้วก็ kubectl ของแต่ละ platform (ถ้าใช้ Docker Desktop ก็จะมี kubectl ติดมาให้อยู่แล้ว)

วิธีใช้ก็ง่าย ๆ อาจจะลงด้วย brew, curl, wget หรือ choco ก็ได้ แล้วก็สั่ง

ekz create cluster

รอประมาณ 1–2 นาทีแล้วแต่ความเร็ว net ก็จะได้ Kubernetes ที่ใช้ binary จากโครงการ EKS-D ไว้ใช้งานกันละครับ

DX @weaveworks, Asst Prof at SUT, GitOps, Go nut since r57

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store