DevOps
น้องๆ เคยเจอปัญหาตอนทำเว็บหรือแอปพลิเคชันไหม? แบบว่า...ตอนแรกก็รันดี๊ดี พอคนใช้เยอะๆ เริ่มอืด เริ่มล่ม สมัยผมทำร้านเน็ตคาเฟ่ SiamCafe.net เมื่อก่อนนะ เวลามีเกมออนไลน์ฮิตๆ นี่แทบจะกราบกรานเซิร์ฟเวอร์เลย เพราะมันรับโหลดไม่ไหว
Azure Kubernetes Service หรือ AKS เนี่ยแหละ คือพระเอกที่จะมาช่วยแก้ปัญหานี้ AKS มันเป็นบริการของ Microsoft Azure ที่ช่วยให้เราจัดการ Container ได้ง่ายขึ้นมากๆ ลองนึกภาพว่า Container เหมือนตู้คอนเทนเนอร์ ที่ข้างในบรรจุเว็บหรือแอปพลิเคชันของเรา พร้อมทุกอย่างที่จำเป็นในการรัน ไม่ว่าจะเป็นโค้ด ไลบรารี หรือ Dependencies ต่างๆ
AKS จะช่วยจัดการตู้คอนเทนเนอร์เหล่านี้ ให้ทำงานร่วมกันได้อย่างมีประสิทธิภาพ สเกลได้ตามต้องการ (เพิ่มหรือลดจำนวนตู้คอนเทนเนอร์ได้อัตโนมัติ) แถมยังช่วยเรื่องการอัปเดตและการดูแลรักษาอีกด้วย สรุปง่ายๆ AKS คือเครื่องมือที่ช่วยให้เรา Deploy, Scale, และ Manage แอปพลิเคชันแบบ Container ได้อย่างง่ายดายบน Azure นั่นเอง
ก่อนจะไปลุย AKS กันจริงๆ เรามาปูพื้นฐานกันหน่อยดีกว่า จะได้ไม่งงตอนลงมือทำ
Containerization คือการแพ็กแอปพลิเคชันของเราพร้อมกับทุกอย่างที่มันต้องการ (โค้ด, ไลบรารี, ฯลฯ) ลงใน "คอนเทนเนอร์" ทำให้แอปพลิเคชันสามารถรันได้ทุกที่ที่มี Container Runtime (เช่น Docker) โดยไม่ต้องกังวลเรื่อง Environment ที่แตกต่างกัน
สมัยก่อนตอนทำร้านเน็ตนะ เวลาจะลงเกมใหม่แต่ละที ต้องมานั่งลง Driver ลงโปรแกรมเสริมสารพัด กว่าจะเล่นได้ครบทุกเครื่องนี่เหนื่อยหอบ Containerization นี่แหละคือทางออกที่ช่วยให้ชีวิตเราง่ายขึ้นเยอะ
Kubernetes (K8s) เป็นระบบ Orchestration สำหรับ Container พูดง่ายๆ คือเป็นตัวจัดการ Container จำนวนมากๆ ให้ทำงานร่วมกันได้อย่างมีประสิทธิภาพ Kubernetes จะช่วยดูแลเรื่องการ Deploy, Scaling, Load Balancing, และการจัดการ Resources ต่างๆ ของ Container
ลองนึกภาพว่า Kubernetes เป็นเหมือนหัวหน้าวงออร์เคสตรา ที่คอยควบคุมเครื่องดนตรีแต่ละชิ้น (Container) ให้เล่นเพลง (แอปพลิเคชัน) ออกมาได้อย่างไพเราะ AKS ก็คือ Kubernetes ที่ Microsoft จัดการให้เราบน Azure นั่นเอง
ถ้าอยากอ่านเรื่องราว IT สนุกๆ เพิ่มเติม ลองแวะไปดูที่ SiamCafe Blog ได้นะ
เอาล่ะ! ได้เวลาลงมือทำกันแล้ว มาดูกันว่าเราจะเริ่มต้นใช้งาน AKS ยังไงได้บ้าง
ขั้นตอนแรกคือการสร้าง AKS Cluster ซึ่งก็คือกลุ่มของ Virtual Machine (VM) ที่จะรัน Container ของเรา เราสามารถสร้าง AKS Cluster ได้หลายวิธี เช่น ใช้ Azure Portal (GUI), Azure CLI (Command-Line Interface), หรือ Infrastructure-as-Code (IaC) tools อย่าง Terraform
ผมแนะนำให้ใช้ Azure CLI เพราะมันสะดวกและรวดเร็วดี สมมติว่าเราต้องการสร้าง AKS Cluster ชื่อ "myAKSCluster" ใน Resource Group ชื่อ "myResourceGroup" เราสามารถใช้คำสั่งนี้ได้:
az aks create --resource-group myResourceGroup --name myAKSCluster --node-count 3 --generate-ssh-keys
คำสั่งนี้จะสร้าง AKS Cluster ที่มี Node (VM) จำนวน 3 เครื่อง และสร้าง SSH Key เพื่อให้เราสามารถเข้าถึง Node ได้
เมื่อสร้าง AKS Cluster เสร็จแล้ว เราก็สามารถ Deploy แอปพลิเคชันของเราได้ วิธีที่นิยมใช้คือการสร้าง Kubernetes Deployment และ Service Deployment จะบอกว่าเราต้องการรัน Container กี่ตัว และ Service จะบอกว่าเราจะเปิดให้เข้าถึงแอปพลิเคชันของเราได้อย่างไร
สมมติว่าเรามี Docker Image ของแอปพลิเคชันของเราชื่อ "my-app:latest" เราสามารถสร้าง Deployment และ Service ได้ดังนี้:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 80
selector:
app: my-app
จากนั้นเราก็ใช้คำสั่ง kubectl apply -f deployment.yaml เพื่อ Deploy แอปพลิเคชันของเรา Kubernetes จะจัดการสร้าง Pod (Instance ของ Container) ตามจำนวนที่เรากำหนด และ Service จะสร้าง Load Balancer เพื่อกระจาย Traffic ไปยัง Pod เหล่านั้น
สมัยผมทำร้านเน็ตนี่ ต้องมานั่งเซ็ต Load Balancer เองทีละเครื่อง กว่าจะได้แต่ละทีนี่หัวหมุน AKS ช่วยให้ชีวิตง่ายขึ้นเยอะจริงๆ
ดูวิดีโอเพิ่มเติมเกี่ยวกับAzure Kubernetes Service Aks Guide:
AKS ไม่ได้เป็นทางเลือกเดียวในการรัน Container ยังมีทางเลือกอื่นๆ อีกมากมาย เช่น AWS Elastic Kubernetes Service (EKS), Google Kubernetes Engine (GKE), หรือการจัดการ Kubernetes เอง (Self-managed Kubernetes) มาดูกันว่าแต่ละทางเลือกมีข้อดีข้อเสียยังไงบ้าง
| ทางเลือก | ข้อดี | ข้อเสีย |
|---|---|---|
| AKS |
|
|
| EKS |
|
|
| GKE |
|
|
| Self-managed Kubernetes |
|
|
จะเห็นว่าแต่ละทางเลือกก็มีข้อดีข้อเสียแตกต่างกันไป การเลือกใช้ทางเลือกไหนก็ขึ้นอยู่กับความต้องการและความเชี่ยวชาญของทีม ถ้าทีมเรามีประสบการณ์ในการจัดการ Kubernetes อยู่แล้ว การใช้ Self-managed Kubernetes ก็อาจจะเป็นทางเลือกที่ดี แต่ถ้าทีมเราต้องการความสะดวกและรวดเร็ว AKS, EKS, หรือ GKE ก็เป็นทางเลือกที่น่าสนใจกว่า
ถ้าอยากรู้เรื่อง IT เก่าๆ สมัยร้านเน็ตเฟื่องฟู ลองตามไปอ่านต่อได้ที่ SiamCafe Blog นะครับ
เอาล่ะน้องๆ มาถึงตรงนี้ ผมจะแชร์ best practices จากประสบการณ์ตรงที่คลุกคลีกับ AKS มานาน สมัยผมทำร้านเน็ต SiamCafe นี่แหละ ระบบหลังบ้านก็ซับซ้อนใช่ย่อย ต้อง scale รองรับลูกค้าที่เข้ามาเล่นเกมพร้อมๆ กันเป็นร้อยๆ คน AKS นี่แหละช่วยชีวิตไว้เยอะเลย
เรื่องแรกที่ต้องใส่ใจคือการจัดการ resource ครับน้องๆ สมัยก่อนผมเคยเจอเคสที่ pod ตัวนึงมันกิน resource เกินขนาด ทำให้ pod อื่นๆ ทำงานไม่ได้ วิธีแก้คือต้องกำหนด Resource Quotas และ Limit Ranges ให้ชัดเจนไปเลย
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
spec:
hard:
pods: "10"
requests.cpu: "4"
requests.memory: "4Gi"
limits.cpu: "8"
limits.memory: "8Gi"
โค้ดข้างบนนี่คือตัวอย่าง ResourceQuota ที่จำกัดจำนวน pod, CPU requests/limits, และ memory requests/limits ใน namespace นั้นๆ ลองเอาไปปรับใช้ดูนะครับ
AKS มันดีตรงที่ scale ได้อัตโนมัติ สมัยก่อนนี่ต้องมานั่ง scale เอง เหนื่อยสายตัวแทบขาด แต่ HPA มันช่วยชีวิตเราได้จริงๆ นะน้องๆ กำหนดเกณฑ์ให้ชัดเจน เช่น ถ้า CPU utilization เกิน 70% ให้ scale จำนวน pod เพิ่ม
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: my-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
โค้ดนี้บอกว่า ถ้า CPU utilization ของ `my-app` deployment เกิน 70% ให้ scale เพิ่มได้สูงสุด 10 replicas
การมอนิเตอร์และ logging นี่สำคัญมากๆ น้องๆ เหมือนขับรถแล้วไม่มีหน้าปัดบอกความเร็วหรือน้ำมัน มันอันตราย! ต้องใช้เครื่องมืออย่าง Prometheus, Grafana, และ Azure Monitor เพื่อดู performance และหาปัญหาให้เจอตั้งแต่เนิ่นๆ
สมัยก่อนผมเคยเจอเคสที่ application มัน memory leak แต่กว่าจะรู้ตัวก็คือระบบล่มไปแล้ว ถ้ามี monitoring ที่ดี จะเห็นอาการผิดปกติได้ก่อน
Network Policies ช่วยควบคุม traffic ภายใน cluster ครับน้องๆ เหมือนมี firewall คอยกั้นไม่ให้ pod คุยกันมั่วซั่ว ต้องกำหนด policy ให้ชัดเจนว่า pod ไหนคุยกับ pod ไหนได้บ้าง เพื่อความปลอดภัย
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
spec:
podSelector: {}
ingress: []
policyTypes:
- Ingress
โค้ดนี้คือ NetworkPolicy ที่บล็อก traffic ขาเข้าทั้งหมดไปยัง pod ที่ match podSelector (ในที่นี้คือทุก pod) จากนั้นค่อยๆ เปิด policy เฉพาะที่จำเป็น
ข้อดีของ AKS คือมันจัดการเรื่อง scaling, high availability, และ resource utilization ได้ดีกว่ามากครับน้องๆ เหมือนเช่าคอนโดที่มีคนดูแลทุกอย่างให้เรา แทนที่จะสร้างบ้านเองตั้งแต่ต้นจนจบ แถม AKS ยัง integrate กับ Azure ecosystem ได้ง่าย ทำให้ deployment และ management สะดวกขึ้นเยอะ
AKS เหมาะกับ workload ที่ต้องการ scalability, resilience, และ agility ครับน้องๆ เช่น microservices, web applications, APIs, และ data processing สมัยผมทำร้านเน็ต ก็ใช้ AKS รันระบบ backend ของเกมต่างๆ นี่แหละ
AKS เองไม่มีค่าใช้จ่ายในการจัดการ cluster ครับน้องๆ เราจ่ายแค่ค่า compute, storage, และ network ที่ใช้จริงเท่านั้น แต่ต้องวางแผนการใช้ resource ให้ดี ไม่งั้นบิลมาอาจจะตกใจได้
ก่อน update AKS version ต้องอ่าน release notes ให้ละเอียดก่อนครับน้องๆ แล้วทดสอบบน staging environment ก่อนเสมอ อย่า update บน production โดยตรงเด็ดขาด! ไม่งั้นอาจจะเจอปัญหาที่ไม่คาดคิดได้
AKS เป็นเครื่องมือที่ทรงพลังสำหรับ DevOps ครับน้องๆ แต่ต้องศึกษาและทำความเข้าใจให้ดีก่อนใช้งานจริง ลองเอาเทคนิคที่ผมแชร์ไปปรับใช้ดูนะครับ แล้วจะพบว่า AKS ช่วยให้ชีวิตง่ายขึ้นเยอะเลย ถ้าอยากรู้เรื่อง forex ลองไปดูที่ iCafeForex ได้นะ
อย่าลืมแวะไปอ่านบทความอื่นๆ ใน SiamCafe Blog ด้วยนะครับ มีเรื่อง IT สนุกๆ อีกเยอะเลย