26. เปิดใช้งาน Kubernetes (Local)
หน้า 26ทำไมต้อง Local K8s?
การใช้ Cloud (EKS/GKE) มีค่าใช้จ่ายสูง การเปิด Kubernetes บนเครื่องตัวเองด้วย Docker Desktop ช่วยให้เราทดสอบ Deployment Manifests ได้ฟรีๆ ก่อนขึ้น Production จริง
- เปิดโปรแกรม Docker Desktop
- คลิกที่ไอคอนเฟือง ⚙️ (Settings) ด้านบนขวา
- เลือกเมนู Kubernetes ทางซ้ายมือ
- ติ๊กถูกที่ช่อง Enable Kubernetes
- กดปุ่ม Apply & Restart
Docker Desktop includes K8s!
Single-node cluster is creating...
27. ตรวจสอบสถานะ (Basic Commands)
หน้า 27
เมื่อติดตั้งเสร็จ เราจะใช้คำสั่ง kubectl (คูบ-คอนโทรล) ในการคุยกับ Cluster
โดยเปิด Terminal (หรือ CMD/PowerShell) แล้วลองคำสั่งต่อไปนี้
1. Switch Context (เปลี่ยนมาใช้ Docker Desktop)
kubectl config use-context docker-desktop
เพื่อให้แน่ใจว่าเราไม่ได้เผลอไปสั่งงาน Cluster บน AWS
2. ดู Node (เครื่อง Server จำลอง)
kubectl get nodes
docker-desktop Ready control-plane 5m v1.29.1
3. ดู Pods (ดูว่ามีแอปอะไรทำงานอยู่ไหม)
kubectl get pods -A
-A คือ All Namespaces (ดูระบบหลังบ้านด้วย)
28. สร้าง Deployment แรก
หน้า 28📝 Concept: Deployment YAML
แทนที่เราจะใช้คำสั่ง docker run เราจะเขียนไฟล์ YAML เพื่อบอก K8s ว่า
"ฉันต้องการแอป Nginx จำนวน 2 ตัว" (Replicas) แล้ว K8s จะจัดการสร้างและดูแลให้
1. สร้างไฟล์ my-web.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-web-deployment
spec:
replicas: 2
selector:
matchLabels:
app: my-web
template:
metadata:
labels:
app: my-web
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
2. ส่งไฟล์เข้า Cluster (Apply)
kubectl apply -f my-web.yaml
3. ตรวจสอบผลลัพธ์
kubectl get pods
29. เปิดการเข้าถึง (Service)
หน้า 29Pod ใน K8s มี IP ส่วนตัวที่เข้าถึงจากภายนอกไม่ได้ (Isolated) เราต้องสร้าง "Service" เพื่อเป็นประตูทางเข้า
1. เพิ่ม Service ในไฟล์
my-web.yaml
(ต่อท้ายไฟล์เดิม โดยคั่นด้วย ---)
---
apiVersion: v1
kind: Service
metadata:
name: my-web-service
spec:
type: LoadBalancer
selector:
app: my-web
ports:
- protocol: TCP
port: 80
targetPort: 80
2. Apply อีกครั้ง
kubectl apply -f my-web.yaml
3. ดู Service
kubectl get svc
Docker Desktop จะ map LoadBalancer เข้ากับ localhost โดยอัตโนมัติ
30. การ Scale และดู Logs
หน้า 30Manual Scaling
สมมติคนเข้าเว็บเยอะมาก เราต้องการเพิ่มจาก 2 เครื่อง เป็น 5 เครื่องทันที
kubectl scale deployment/my-web-deployment --replicas=5
ลองกด kubectl get pods ดูจะเห็น Pod
ใหม่ผุดขึ้นมาทันที
Check Logs
ถ้าแอปพัง หรืออยากดูว่าใครเข้ามาใช้งานบ้าง
kubectl logs deployment/my-web-deployment
หรือระบุชื่อ pod:
kubectl logs my-web-deployment-xxxx
Clean Up (ลบทุกอย่าง)
เพื่อไม่ให้รกเครื่อง ลบ Deployment และ Service ทิ้งเมื่อเล่นเสร็จ
kubectl delete -f my-web.yaml
🎉 จบ Basic แล้ว! ไปต่อ Advanced CI/CD กันเลย
31. จำลอง CI/CD Pipeline (Local)
SimulationCI/CD กับ Kubernetes?
ในโลกจริง เราจะไม่แก้ไฟล์ YAML ด้วยมือตลอดเวลา แต่จะใช้ Pipeline (เช่น Jenkins, GitHub Actions) เพื่อ Build Docker Image และสั่ง Update Cluster โดยอัตโนมัติ
Step 1: จำลองการ Build & Deploy
เราสามารถเขียน Script ง่ายๆ เพื่อจำลอง Pipeline บนเครื่อง Local ได้
#!/bin/bash # 1. Build New Image (สมมติว่าเป็น v2) docker build -t my-web:v2 . # 2. Push (ถ้าใช้ Local K8s บางทีไม่ต้อง Push ก็ได้ถ้าตั้งค่าถูก) # docker push my-web:v2 # 3. สั่ง K8s เปลี่ยน Image ใน Deployment kubectl set image deployment/my-web-deployment nginx=my-web:v2 # 4. รอจนกว่าจะ Deploy เสร็จ kubectl rollout status deployment/my-web-deployment
set image คือหัวใจสำคัญของการทำ CI/CD ใน K8s
Step 2: การอัปเดตแบบไร้รอยต่อ
เปลี่ยนจาก Nginx ธรรมดา เป็นรุ่น Alpine (ขนาดเล็ก)
kubectl set image deployment/my-web-deployment nginx=nginx:alpine
ถ้าเวอร์ชั่นใหม่พัง ย้อนกลับได้ทันที
kubectl rollout undo deployment/my-web-deployment
32. GitHub Actions (Self-hosted)
AdvancedStep 1: ติดตั้ง Runner (Agent)
- ไปที่ Repo ของคุณใน GitHub > Settings
- เมนูซ้ายมือเลือก Actions > Runners
- กดปุ่มเขียว New self-hosted runner
- เลือกระบบปฏิบัติการ (macOS, Linux, Windows) แล้วรันคำสั่งตามที่ GitHub บอกใน Terminal เครื่องเรา
- เมื่อรันเสร็จ จะขึ้นสถานะ Idle (Green) บนหน้าเว็บ GitHub แปลว่าพร้อมรับงาน
Step 2: สร้าง Workflow File
สร้างไฟล์ .github/workflows/deploy-local.yml
ในโปรเจ็ค
name: Deploy to Local K8s
on:
push:
branches: [ "main" ]
jobs:
deploy:
# สำคัญมาก! บรรทัดนี้บอกให้รันบนเครื่องเรา ไม่ใช่ Cloud
runs-on: self-hosted
steps:
- uses: actions/checkout@v3
- name: Build Docker Image
run: |
docker build -t my-app:latest .
# ใน Local K8s ไม่ต้อง push ขึ้น Registry ก็ได้ ถ้าใช้ imagePullPolicy: Never
- name: Update Kubernetes
run: |
# คำสั่งนี้จะรันบนเครื่องเราโดยตรง จึงใช้ kubectl ได้เลย
kubectl apply -f my-web.yaml
kubectl rollout restart deployment/my-web-deployment
- name: Verify
run: kubectl get pods
เมื่อคุณ git push โค้ดขึ้น GitHub > ตัว Runner บนเครื่องคุณจะตื่นขึ้นมา >
Build Docker > และสั่ง Update Kubernetes ในเครื่องคุณโดยอัตโนมัติ!