IT General
น้องๆ เคยเจอปัญหาไหม เวลา Application เรามันซับซ้อนมากๆ มี Microservices เป็นร้อยๆ ตัว คุยกันวุ่นวายไปหมด การจัดการ, Monitoring, Security นี่ปวดหัวสุดๆ สมัยผมทำร้านเน็ต SiamCafe.net นะ แค่ Server ไม่กี่ตัวยังปวดหัวเลย นี่ Microservices เป็นร้อยตัวคิดดู
Service Mesh เนี่ยแหละคือทางออก! มันเหมือนเป็น Infrastructure Layer ที่คอยจัดการ Traffic ระหว่าง Services ต่างๆ ให้เราแบบ Transparent เลย ไม่ต้องไปแก้ Code ใน Application เอง
Istio กับ Linkerd เนี่ย เป็น Service Mesh ที่ดังมากๆ ตัวนึง เน้นเรื่อง Security, Observability และ Traffic Management ลองนึกภาพว่ามีคนคอยจัดการจราจรให้รถทุกคันวิ่งได้อย่างราบรื่น นั่นแหละ Service Mesh เลย
ก่อนจะไปลุย Service Mesh เราต้องมีพื้นฐานพวกนี้ก่อนนะ
อันนี้สำคัญเลย Service Mesh มันเกิดมาเพื่อ Microservices โดยเฉพาะ ถ้า Application ของเรายังเป็น Monolithic อยู่ อาจจะยังไม่จำเป็นเท่าไหร่ Microservices คือการแบ่ง Application ใหญ่ๆ ออกเป็น Service เล็กๆ ที่ทำงานเฉพาะอย่าง เช่น Service นึงจัดการ User, อีก Service นึงจัดการ Payment ข้อดีคือมัน Scale ง่าย แก้ไขง่าย แต่ก็ทำให้การจัดการซับซ้อนขึ้นด้วย
Microservices ส่วนใหญ่มักจะ Run อยู่ใน Container (Docker) และใช้ Kubernetes ในการ Orchestrate หรือจัดการ Container เหล่านี้ Kubernetes จะช่วยให้เรา Deploy, Scale และ Manage Application ได้ง่ายขึ้น Service Mesh ก็มักจะทำงานร่วมกับ Kubernetes นี่แหละ
พวก Networking พื้นฐานก็ต้องรู้บ้างนะ เช่น TCP/IP, HTTP, DNS, Load Balancing, Routing พวกนี้ Service Mesh มันจัดการเรื่องพวกนี้ให้เรา แต่ถ้าเราไม่เข้าใจพื้นฐานเลย ก็จะงงๆ ว่ามันทำงานยังไง
เอาล่ะ มาดูวิธีใช้งาน Service Mesh กัน เริ่มจาก Istio ก่อนเลย
Istio มันจะทำงานบน Kubernetes นะ ดังนั้นเราต้องมี Kubernetes Cluster ก่อน วิธีติดตั้ง Istio ก็ง่ายๆ ใช้ istioctl ได้เลย
istioctl install --set profile=demo -y
คำสั่งนี้จะติดตั้ง Istio Profile แบบ Demo เหมาะสำหรับ Development และ Testing นะ ถ้าจะใช้ Production ต้องเลือก Profile ที่เหมาะสมกว่านี้
หลังจากติดตั้ง Istio แล้ว เราก็ Deploy Application ของเราลง Kubernetes ได้เลย แต่ต้อง Enable Istio Sidecar Injection ก่อน Sidecar คือ Container ที่ Istio Inject เข้าไปใน Pod ของเรา เพื่อจัดการ Traffic ให้ Service นั้นๆ
kubectl label namespace default istio-injection=enabled
คำสั่งนี้จะ Enable Istio Sidecar Injection ใน Namespace default พอเรา Deploy Application ใน Namespace นี้ Istio Sidecar ก็จะถูก Inject เข้าไปใน Pod โดยอัตโนมัติ
Istio ช่วยให้เรา Define Traffic Rules ได้ง่ายๆ เช่น Route Traffic ไปยัง Version ต่างๆ ของ Service, Implement Canary Deployments, หรือ Implement Circuit Breaker
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my-service
spec:
hosts:
- my-service
gateways:
- my-gateway
http:
- route:
- destination:
host: my-service
subset: v1
weight: 90
- destination:
host: my-service
subset: v2
weight: 10
Code snippet นี้จะ Route 90% ของ Traffic ไปยัง Version v1 ของ Service my-service และ Route 10% ไปยัง Version v2 เหมาะสำหรับการทำ Canary Deployment
Service Mesh ไม่ใช่ Silver Bullet นะ มันมีข้อดีข้อเสีย และมีทางเลือกอื่นๆ ด้วย
| Feature | Istio | Linkerd | API Gateway (Kong, Tyk) |
|---|---|---|---|
| Complexity | สูง | ต่ำ | ปานกลาง |
| Performance Overhead | สูงกว่า Linkerd | ต่ำ | ปานกลาง |
| Features | เยอะมาก (Traffic Management, Security, Observability) | เน้น Lightweight และใช้งานง่าย | เน้น API Management (Authentication, Rate Limiting) |
| Use Case | Application ขนาดใหญ่ที่ต้องการ Features ครบ | Application ที่ต้องการ Performance และ Simplicity | API ที่ต้องการ Management และ Security |
สมัยผมทำร้านเน็ต SiamCafe.net ถ้ามี Service Mesh คงสบายขึ้นเยอะ ไม่ต้องมานั่งเขียน Code จัดการ Traffic เอง
ลองเข้าไปดูข้อมูลเพิ่มเติมได้ที่ SiamCafe Blog นะครับ มีบทความเกี่ยวกับ IT อีกเยอะเลย
น้องๆ ลองเลือกดูนะว่า Service Mesh ตัวไหนเหมาะกับ Application ของเรา Istio มัน Powerful แต่ก็ซับซ้อน Linkerd มัน Lightweight แต่ Features อาจจะไม่เยอะเท่า ส่วน API Gateway ก็เหมาะกับการ Manage API แต่ไม่ได้จัดการ Traffic ระหว่าง Services โดยตรง
ถ้าอยากรู้เรื่อง Istio หรือ Linkerd เพิ่มเติม ลองเข้าไปดูที่ SiamCafe Blog ได้เลย ผมเขียนไว้ละเอียดมาก
ดูวิดีโอเพิ่มเติมเกี่ยวกับService Mesh Istio Linkerd Gui:
เอาล่ะ มาถึงส่วนสำคัญ ที่ผมอยากแชร์จากประสบการณ์จริง สมัยทำร้านเน็ต SiamCafe เมื่อ 20 กว่าปีที่แล้ว (โอ้โห นานขนาดนั้นเลยเหรอเนี่ย) คือเทคโนโลยีมันเปลี่ยนไปเยอะ แต่หลักการบางอย่างมันก็ยังใช้ได้อยู่นะ
Service Mesh เนี่ย มันเหมือนเราสร้างเลเยอร์ใหม่ครอบแอปพลิเคชันอีกทีนึง เพื่อให้การสื่อสารระหว่าง Service มันง่ายและปลอดภัยขึ้น แต่ถ้าใช้ไม่ถูกวิธี แทนที่จะดี มันจะกลายเป็นภาระซะงั้น
อย่าเพิ่งคิดว่า "ฉันจะเอา Istio มาครอบทุก Service ในองค์กรเลย!" ใจเย็นๆ น้อง สมัยผมทำร้านเน็ต ก็ไม่ได้เปลี่ยนจาก Windows 95 เป็น Linux ทีเดียว 50 เครื่องหรอกนะ ค่อยๆ ลองกับ Service ที่สำคัญน้อยก่อน ดูว่ามันเวิร์คจริงไหม
ลองเริ่มจาก Service ที่มีการเรียกใช้งานเยอะๆ แต่ถ้ามีปัญหาแล้วกระทบคนน้อย เช่น ระบบ Report หรือ Dashboard ภายในก่อนก็ได้ พอคล่องแล้ว ค่อยขยายไป Service ที่สำคัญมากขึ้น
Service Mesh มันช่วยเรื่อง Monitoring ได้เยอะมาก แต่น้องต้องตั้งค่าให้ถูกด้วยนะ อย่าปล่อยให้มันเป็นแค่ "กล่องดำ" ที่มี Metrics เพียบ แต่ไม่รู้จะดูอะไร
ผมแนะนำให้ตั้ง Alert ที่สำคัญๆ ไว้เลย เช่น Latency เกิน X มิลลิวินาที, Error Rate เกิน Y เปอร์เซ็นต์ แล้ว Integrate เข้ากับระบบแจ้งเตือนของน้อง (Slack, Email, PagerDuty ว่าไป) จะได้รู้ตัวทันทีที่เกิดปัญหา
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my-service
spec:
hosts:
- my-service
gateways:
- my-gateway
http:
- match:
- uri:
prefix: /
route:
- destination:
host: my-service
subset: v1
weight: 90
- destination:
host: my-service
subset: v2
weight: 10
ตัวอย่าง Virtual Service ใน Istio ที่กำหนด Traffic Splitting ระหว่างเวอร์ชัน v1 และ v2
Service Mesh มันช่วยเรื่อง Security ได้เยอะ แต่ก็ต้อง Config ให้ถูกต้องด้วยนะ อย่าลืม Enable Mutual TLS (mTLS) เพื่อให้ทุก Service ต้องยืนยันตัวตนกันก่อนที่จะสื่อสารกันได้
สมัยผมทำร้านเน็ต ก็ต้องคอยระวังเรื่องไวรัส Malware เหมือนกัน Service Mesh ก็เหมือน Firewall ที่คอยป้องกันการโจมตีจากภายในองค์กร
ก่อนจะใช้ Service Mesh ให้คล่อง น้องต้องเข้าใจพื้นฐาน Network ก่อนนะ TCP/IP, DNS, Routing พวกนี้ต้องแม่น ถ้าไม่เข้าใจ จะ Config ผิดๆ ถูกๆ แก้ปัญหายากมาก
เปรียบเทียบง่ายๆ เหมือนตอนผมทำร้านเน็ต ต้องรู้ว่าสาย LAN เสียบผิดช่อง Router Config ไม่ถูก มันก็เล่นเน็ตไม่ได้ Service Mesh ก็เหมือนกัน ถ้า Network พื้นฐานไม่ดี มันก็พัง
อันนี้ตอบยาก ขึ้นอยู่กับความต้องการของน้องเลย Istio มัน Feature เยอะ Config ละเอียด แต่ก็ซับซ้อนกว่า Linkerd มัน Lightweight กว่า ใช้งานง่ายกว่า แต่ Feature อาจจะไม่เท่า Istio
ถ้าองค์กรน้องใหญ่ มีทีม Operation เก่งๆ Istio ก็อาจจะตอบโจทย์กว่า แต่ถ้าองค์กรเล็กๆ เน้นความง่าย Linkerd ก็อาจจะดีกว่า
จริงครับ แต่ถ้า Config ดีๆ มันจะเพิ่มขึ้นไม่เยอะ จนแทบจะไม่รู้สึกเลย Service Mesh มันต้อง Inject Proxy เข้าไปในทุก Service ซึ่ง Proxy ตัวนี้แหละที่จะทำให้ Latency เพิ่มขึ้น
แต่ข้อดีของ Service Mesh มันช่วย Optimise Traffic ได้ เช่น Retry อัตโนมัติ, Load Balancing ฉลาดๆ ซึ่งมันจะช่วยลด Latency ในภาพรวมได้
ผมแนะนำให้เริ่มจาก Documentation ของ Istio หรือ Linkerd ก่อนเลย แล้วก็ลองทำ Workshop หรือ Tutorial ตาม Blog ต่างๆ ดู SiamCafe Blog ก็มีบทความ IT ดีๆ เยอะนะ
อีกวิธีนึงคือลองหา Community ที่เกี่ยวกับ Service Mesh แล้วเข้าไปถามคำถาม แลกเปลี่ยนความรู้กับคนอื่นๆ จะช่วยให้เรียนรู้ได้เร็วขึ้น
ไม่จำเป็นครับ ถ้าองค์กรน้องยังเล็ก มี Service ไม่เยอะ อาจจะยังไม่คุ้มที่จะลงทุนกับ Service Mesh แต่ถ้าองค์กรน้องใหญ่ มี Service เยอะๆ การใช้ Service Mesh จะช่วยให้ Manage ได้ง่ายขึ้นเยอะ
เหมือนสมัยผมทำร้านเน็ต ถ้ามีแค่ 5 เครื่อง ก็ไม่ต้องลง Server อะไรให้วุ่นวาย แต่ถ้ามี 50 เครื่อง Server มันก็จำเป็น
Service Mesh มันเป็น Technology ที่น่าสนใจ และมีประโยชน์มาก แต่ก็ต้องศึกษาให้เข้าใจก่อนที่จะเอาไปใช้จริง อย่าเพิ่งรีบร้อน ค่อยๆ เรียนรู้ ค่อยๆ ปรับใช้ แล้วน้องจะพบว่ามันช่วยแก้ปัญหาหลายๆ อย่างได้จริงๆ
สุดท้ายนี้ ผมอยากฝากไว้ว่า เทคโนโลยีมันเปลี่ยนไปเรื่อยๆ สิ่งที่สำคัญที่สุดคือ "ความเข้าใจ" ถ้าเราเข้าใจหลักการพื้นฐาน เราก็จะสามารถปรับตัวเข้ากับเทคโนโลยีใหม่ๆ ได้เสมอ iCafeForex ก็เช่นกัน ต้องปรับตัวตามตลาดเสมอ