DevOps
น้องๆ เคยเจอปัญหาตอนทำเว็บหรือแอปฯ ที่ต้อง deploy ขึ้น server หลายๆ เครื่องมั้ย? สมัยผมทำร้านเน็ตฯ นี่ปวดหัวมาก! ต้องคอย remote เข้าไปจัดการทีละเครื่องๆ ถ้าเครื่องไหนเจ๊งก็ต้องรีบเข้าไปแก้ วุ่นวายสุดๆ
Kubernetes (K8s) เนี่ยแหละ คือพระเอกขี่ม้าขาวที่เข้ามาช่วยแก้ปัญหานี้ มันคือระบบ orchestration ที่ช่วยจัดการ container (เช่น Docker) ให้เราแบบอัตโนมัติ คิดซะว่ามันเป็น "หัวหน้า" ที่คอยสั่งงาน container ต่างๆ ให้ทำงานร่วมกันอย่างราบรื่น
ทำไมถึงสำคัญ? เพราะมันช่วยลดภาระการจัดการ server ของเราไปเยอะมากๆ เราไม่ต้องคอย remote เข้าไปแก้ปัญหาเองบ่อยๆ Kubernetes จะจัดการให้หมด ไม่ว่าจะเป็นการ scale แอปฯ, restart container ที่ตายไป, หรือ update version ใหม่
Container ก็เหมือน "กล่อง" ที่บรรจุทุกอย่างที่แอปฯ ของเราต้องการ (code, library, dependencies) ทำให้แอปฯ ของเราสามารถทำงานได้ทุกที่ที่มี Docker ติดตั้งอยู่ สมัยก่อนเราต้องกังวลว่า server แต่ละเครื่องมี library เวอร์ชั่นไม่ตรงกัน แต่พอใช้ container ปัญหานี้ก็หมดไป
Pod คือหน่วยที่เล็กที่สุดใน Kubernetes คิดซะว่ามันเป็น "บ้าน" ที่ container ของเราอาศัยอยู่ 1 Pod อาจจะมี 1 หรือหลาย container ก็ได้ โดย container ที่อยู่ใน Pod เดียวกันจะ share network และ storage กัน
Deployment คือตัวที่คอยสั่งให้ Kubernetes สร้างและจัดการ Pod ให้เรา มันจะคอยตรวจสอบว่ามี Pod ที่เราต้องการรันอยู่หรือไม่ ถ้า Pod ตายไป มันก็จะสร้าง Pod ใหม่ขึ้นมาทดแทนอัตโนมัติ
การเริ่มต้นใช้งาน Kubernetes อาจจะดูยากนิดนึง แต่ไม่ต้องกลัว! ผมจะค่อยๆ อธิบายให้ฟังแบบ step-by-step
Step 1: ติดตั้ง Minikube หรือ Docker Desktop
Minikube คือ Kubernetes เวอร์ชั่นเล็กๆ ที่เราสามารถติดตั้งบนเครื่องตัวเองเพื่อทดลองใช้งานได้ ส่วน Docker Desktop ก็มี Kubernetes ให้เราใช้งานได้เหมือนกัน เลือกอันที่ถนัดเลย
Step 2: สร้าง Deployment
เราจะสร้าง Deployment โดยใช้ไฟล์ YAML ซึ่งเป็นไฟล์ configuration ของ Kubernetes ไฟล์ YAML จะบอก Kubernetes ว่าเราต้องการรันแอปฯ อะไร, จำนวน Pod ที่ต้องการ, และอื่นๆ
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: nginx:latest
ports:
- containerPort: 80
Step 3: Apply Deployment
หลังจากสร้างไฟล์ YAML แล้ว เราจะใช้คำสั่ง kubectl apply -f my-app.yaml เพื่อบอก Kubernetes ให้สร้าง Deployment ตามที่เรากำหนด
ในตัวอย่างข้างบน เรา deploy Nginx ซึ่งเป็น web server ยอดนิยม ถ้าทุกอย่างเป็นไปด้วยดี เราจะได้ Nginx รันอยู่ 3 Pod
โดยปกติ Pod จะไม่สามารถเข้าถึงได้จากภายนอก เราต้องใช้ Service เพื่อ expose แอปฯ ของเรา Service จะสร้าง endpoint ที่เราสามารถใช้เข้าถึงแอปฯ ได้
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
Step 4: ตรวจสอบสถานะ
เราสามารถใช้คำสั่ง kubectl get pods, kubectl get deployments, และ kubectl get services เพื่อตรวจสอบสถานะของ Pod, Deployment, และ Service ของเราได้
ถ้า traffic เข้ามาเยอะ เราสามารถ scale แอปฯ ของเราได้ง่ายๆ โดยการเพิ่มจำนวน replicas ใน Deployment
kubectl scale deployment my-app --replicas=5
Kubernetes ไม่ใช่ทางเลือกเดียวในการจัดการ container ยังมีทางเลือกอื่นๆ เช่น Docker Swarm, Nomad, และ AWS ECS แต่ละตัวก็มีข้อดีข้อเสียต่างกัน
Docker Swarm ใช้งานง่ายกว่า Kubernetes เหมาะสำหรับโปรเจกต์เล็กๆ ที่ไม่ต้องการความซับซ้อนมากนัก Nomad ก็เป็นทางเลือกที่ดีสำหรับคนที่ต้องการระบบที่เรียบง่ายและมีประสิทธิภาพ AWS ECS เหมาะสำหรับคนที่ใช้ AWS อยู่แล้ว เพราะมัน integrated กับ AWS services อื่นๆ ได้ดี
แต่ Kubernetes ยังคงเป็นที่นิยมมากที่สุด เพราะมันมี ecosystem ที่ใหญ่ มี community ที่แข็งแกร่ง และมี features ที่หลากหลาย
| Feature | Kubernetes | Docker Swarm | Nomad |
|---|---|---|---|
| Complexity | สูง | ต่ำ | กลาง |
| Scalability | สูง | กลาง | สูง |
| Ecosystem | ใหญ่ | เล็ก | กลาง |
| Learning Curve | สูง | ต่ำ | กลาง |
ถ้าอยากรู้เรื่อง IT เพิ่มเติม แวะไปอ่านบทความอื่นๆ ใน SiamCafe Blog ได้เลยนะ
หวังว่าน้องๆ จะเข้าใจ Kubernetes มากขึ้นนะครับ ถ้ามีคำถามอะไร ถามมาได้เลย ผมยินดีตอบ
อย่าลืมแวะไปดูบทความ DevOps อื่นๆ ที่ SiamCafe Blog ด้วยนะ!
ดูวิดีโอเพิ่มเติมเกี่ยวกับKubernetes 101 Thai Guide:
เอาล่ะน้องๆ หลังจากที่เราปูพื้นฐาน Kubernetes กันไปแล้ว คราวนี้มาถึงส่วนสำคัญ นั่นคือ Best Practices หรือเคล็ดลับที่พี่สั่งสมมาจากการทำร้านเน็ต (SiamCafe.net) สมัยก่อนนู้นนนน จนถึงงาน DevOps ทุกวันนี้ มันคือสิ่งที่ช่วยให้ชีวิตเราง่ายขึ้นเยอะ ลดปัญหาที่อาจจะเกิดขึ้นได้ในอนาคต
จำไว้ว่า Kubernetes มัน powerful มาก แต่ถ้าเราใช้ไม่ถูกวิธี มันก็อันตรายเหมือนกัน ดังนั้น ตั้งใจอ่าน ตั้งใจทำความเข้าใจ แล้วเอาไปปรับใช้ให้เข้ากับงานของน้องๆ นะ
สมัยพี่ทำร้านเน็ต สิ่งที่สำคัญที่สุดคือ "รู้" ว่าเครื่องไหนมีปัญหา ลูกค้าคนไหนเล่นเกมอะไรอยู่ bandwidth เป็นยังไง Kubernetes ก็เหมือนกัน น้องต้อง Monitoring และ Logging อย่างละเอียด
Kubernetes มี tools ให้ใช้เยอะแยะ ตั้งแต่ Prometheus, Grafana, ELK Stack (Elasticsearch, Logstash, Kibana) เลือกใช้ให้เหมาะกับ budget และความถนัดของทีม แล้วตั้ง Alert ไว้ด้วย ถ้าเกิดอะไรผิดปกติจะได้รู้ตัวทัน
# ตัวอย่าง Alerting rule ใน Prometheus
alert: HighCpuUsage
expr: sum(rate(container_cpu_usage_seconds_total{namespace="production"}[5m])) > 0.8
for: 5m
labels:
severity: critical
annotations:
summary: "High CPU usage detected on production namespace"
description: "CPU usage is above 80% for more than 5 minutes."
เคยไหม ลูกค้าในร้านแย่งกันเล่นเกม จนเครื่องกระตุก? Kubernetes ก็เหมือนกัน ถ้า Pod ไหนใช้ resource เยอะเกินไป มันจะกิน resource ของ Pod อื่นๆ ทำให้ระบบโดยรวมช้าลง
ดังนั้น กำหนด Resource Limits และ Requests ให้ชัดเจน ว่าแต่ละ Pod จะใช้ CPU, Memory เท่าไหร่ ถ้า Pod ไหนเกิน limit Kubernetes จะจัดการให้เอง (อาจจะ kill หรือ throttle แล้วแต่ config)
apiVersion: v1
kind: Pod
metadata:
name: resource-demo
spec:
containers:
- name: resource-demo-ctr
image: nginx
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "200m"
memory: "256Mi"
สมัยพี่ทำร้านเน็ต พี่แทบจะ automate ทุกอย่าง ตั้งแต่การเปิดปิดเครื่อง การ update เกม การ backup ข้อมูล Kubernetes ก็เหมือนกัน น้องต้อง automate ทุกอย่างเท่าที่จะทำได้
ใช้ CI/CD tools อย่าง Jenkins, GitLab CI, GitHub Actions เพื่อ automate การ build, test, deploy application ใช้ tools อย่าง Terraform, Ansible เพื่อ automate การ provision infrastructure ยิ่ง automate ได้เยอะ ชีวิตน้องก็จะสบายขึ้นเยอะ
อย่ากลัวที่จะเรียนรู้ tools ใหม่ๆ นะน้อง Tool มันเปลี่ยนไปเรื่อยๆ แต่ concept เดิมๆ มันก็ยังใช้ได้อยู่
Namespace เหมือนห้องในร้านเน็ต ที่แบ่งลูกค้าเป็นกลุ่มๆ Kubernetes ก็ใช้ Namespace เพื่อแบ่ง resource และ isolate environment ออกจากกัน เช่น แบ่งเป็น development, staging, production
การใช้ Namespace ช่วยให้เราจัดการ resource ได้ง่ายขึ้น และป้องกันไม่ให้ Pod ใน environment หนึ่ง ไปรบกวน Pod ใน environment อื่น
apiVersion: v1
kind: Namespace
metadata:
name: production
สมัยพี่ทำร้านเน็ต Security สำคัญมาก ต้องคอยระวังพวกแฮกเกอร์มาเจาะระบบ Kubernetes ก็เช่นกัน ต้องให้ความสำคัญกับ Security ตั้งแต่แรก
ใช้ Network Policies เพื่อควบคุม traffic ระหว่าง Pods, ใช้ RBAC (Role-Based Access Control) เพื่อกำหนดสิทธิ์การเข้าถึง Kubernetes resources, scan images เพื่อหา vulnerabilities และ update Kubernetes version เป็นประจำ
มันก็ไม่ได้ง่ายขนาดนั้นแหละน้อง แต่ก็ไม่ได้ยากเกินไปถ้าเราตั้งใจเรียนรู้ พี่แนะนำให้เริ่มจาก concept พื้นฐานก่อน เข้าใจว่า Pod, Deployment, Service คืออะไร แล้วค่อยๆ ลองทำตาม tutorial ไปเรื่อยๆ
อย่าเพิ่งไป focus เรื่อง advance มากเกินไป เอาพื้นฐานให้แน่นก่อน แล้วค่อยๆ เรียนรู้เพิ่มเติมตามความจำเป็น
ทั้งหมดเป็น tools ที่ใช้สำหรับ run Kubernetes ในเครื่อง local Minikube เหมาะสำหรับคนที่อยากลอง Kubernetes แบบ full-fledged แต่ resource intensive Kind เหมาะสำหรับคนที่ต้องการ run Kubernetes cluster หลาย node ในเครื่อง local K3s เหมาะสำหรับคนที่ต้องการ Kubernetes ที่ lightweight และง่ายต่อการติดตั้ง
ถ้าเพิ่งเริ่มต้น พี่แนะนำให้ลอง Minikube ก่อน ถ้าเครื่องน้อง resource ไม่พอ ค่อยลอง K3s
ถ้าบริษัทน้องมีทีม DevOps ที่แข็งแกร่ง และต้องการ control ทุกอย่างเอง การ run Kubernetes เองก็เป็นทางเลือกที่ดี แต่ถ้าบริษัทน้อง resource น้อย และต้องการ focus ที่ application มากกว่า พี่แนะนำให้ใช้ Managed Kubernetes Service
ข้อดีของ Managed Kubernetes Service คือ มันจัดการเรื่อง infrastructure ให้เราเกือบทั้งหมด เราแค่ deploy application อย่างเดียว
CKA (Certified Kubernetes Administrator), CKAD (Certified Kubernetes Application Developer), CKS (Certified Kubernetes Security Specialist) พวกนี้เป็น certification ที่เป็นที่ยอมรับในวงการ ถ้ามีติดตัวไว้ จะช่วยเพิ่มโอกาสในการทำงานได้เยอะเลย
Kubernetes เป็น technology ที่มีประโยชน์มากๆ แต่ก็ต้องใช้ให้เป็น น้องๆ ต้องเรียนรู้ concept พื้นฐานให้แน่น และ practice บ่อยๆ แล้วน้องจะเก่งเอง
อย่ากลัวที่จะลองผิดลองถูก เพราะการลองผิดลองถูกคือวิธีที่ดีที่สุดในการเรียนรู้
ขอให้สนุกกับการทำ DevOps นะน้อง!
iCafeForex