เริ่มต้นใช้งาน Kubernetes
Kubernetes (หรือเรียกย่อว่า K8s) เป็นระบบ Container Orchestration แบบโอเพนซอร์สที่ช่วยให้สามารถ deploy, scale และจัดการแอปพลิเคชันที่อยู่ใน Container ได้อย่างอัตโนมัติ
Kubernetes คืออะไร?
Kubernetes คือแพลตฟอร์มที่ช่วยจัดการ Container หลายตัวพร้อมกันบน Cluster ของเครื่องหลายเครื่อง โดยจัดการเรื่อง:
- การ Deploy อัตโนมัติ — กระจาย Container ไปยัง Node ที่เหมาะสม
- Auto-scaling — เพิ่มหรือลดจำนวน Container ตาม load
- Self-healing — รีสตาร์ท Container ที่ล้มเหลวโดยอัตโนมัติ
- Load Balancing — กระจาย Traffic ระหว่าง Container
- Rolling Updates — อัปเดตแอปพลิเคชันโดยไม่มี downtime
สถาปัตยกรรม Kubernetes
Control Plane Components
| Component | หน้าที่ |
|---|---|
| kube-apiserver | จุดศูนย์กลางสำหรับ API ทั้งหมด |
| etcd | ฐานข้อมูลแบบ key-value สำหรับ cluster state |
| kube-scheduler | เลือก Node สำหรับ Pod ใหม่ |
| kube-controller-manager | ควบคุม controller loops ต่างๆ |
Node Components
| Component | หน้าที่ |
|---|---|
| kubelet | Agent ที่รันบนทุก Node |
| kube-proxy | จัดการ network rules |
| Container runtime | รัน Container (เช่น containerd) |
การติดตั้ง
ติดตั้ง kubectl
# บน Linux
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
# ตรวจสอบเวอร์ชัน
kubectl version --client
ติดตั้ง Minikube (สำหรับทดสอบในเครื่อง)
# บน Linux
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# เริ่ม cluster
minikube start
# ตรวจสอบ status
minikube status
Object หลักใน Kubernetes
Pod
Pod คือหน่วยที่เล็กที่สุดที่ Deploy ได้ใน Kubernetes มักประกอบด้วย Container เดียวหรือหลาย Container ที่ทำงานร่วมกัน
# pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx:alpine
ports:
- containerPort: 80
# สร้าง Pod
kubectl apply -f pod.yaml
# ดู Pod ที่มีอยู่
kubectl get pods
# ดูรายละเอียด Pod
kubectl describe pod my-pod
# ลบ Pod
kubectl delete pod my-pod
Deployment
Deployment จัดการชุดของ Pod ให้มีจำนวนตามที่กำหนดและรองรับ rolling update
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx:alpine
ports:
- containerPort: 80
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "250m"
memory: "256Mi"
# Deploy แอปพลิเคชัน
kubectl apply -f deployment.yaml
# ดู Deployment
kubectl get deployments
# Scale replicas
kubectl scale deployment my-deployment --replicas=5
# อัปเดต image
kubectl set image deployment/my-deployment my-container=nginx:1.25
# ดู rollout status
kubectl rollout status deployment/my-deployment
# ย้อนกลับ deployment
kubectl rollout undo deployment/my-deployment
Service
Service ทำให้ Pod สามารถเข้าถึงได้จากภายนอกหรือระหว่างกันภายใน Cluster
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
type: ClusterIP # ClusterIP | NodePort | LoadBalancer
ports:
- protocol: TCP
port: 80
targetPort: 80
ประเภทของ Service:
| ประเภท | คำอธิบาย |
|---|---|
| ClusterIP | เข้าถึงได้ภายใน Cluster เท่านั้น (ค่าเริ่มต้น) |
| NodePort | เปิด port บนทุก Node |
| LoadBalancer | สร้าง External Load Balancer (บน Cloud) |
ConfigMap และ Secret
# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: my-config
data:
APP_ENV: "production"
LOG_LEVEL: "info"
DB_HOST: "postgres-service"
# secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
# ค่าต้องเป็น base64 encoded
DB_PASSWORD: <base64-encoded-password>
# สร้าง Secret จาก command line (ไม่ต้อง encode เอง)
kubectl create secret generic my-secret --from-literal=DB_PASSWORD=your_secure_password_here
Namespace
Namespace ใช้แบ่งทรัพยากรใน Cluster ออกเป็นกลุ่ม เช่น แยก environment
# สร้าง Namespace
kubectl create namespace staging
# Deploy ไปยัง Namespace ที่กำหนด
kubectl apply -f deployment.yaml -n staging
# ดูทรัพยากรทุกประเภทใน Namespace
kubectl get all -n staging
คำสั่ง kubectl พื้นฐาน
# ดูทรัพยากรทุกประเภท
kubectl get all
# ดูรายละเอียดทรัพยากร
kubectl describe <resource> <name>
# ดู logs ของ Pod
kubectl logs my-pod
# ดู logs แบบ real-time
kubectl logs -f my-pod
# เข้าไปใน Pod
kubectl exec -it my-pod -- bash
# ดู resource usage
kubectl top pods
kubectl top nodes
# ดู events ใน Cluster
kubectl get events --sort-by='.lastTimestamp'
# ลบทรัพยากรทั้งหมดที่สร้างจากไฟล์
kubectl delete -f deployment.yaml
Ingress
Ingress จัดการ HTTP/HTTPS traffic จากภายนอกเข้าสู่ Service ต่างๆ
# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
Horizontal Pod Autoscaler (HPA)
HPA ปรับจำนวน Pod อัตโนมัติตามการใช้งาน CPU หรือ Memory
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-deployment
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
# ดู HPA status
kubectl get hpa
เคล็ดลับการใช้งาน
# ดูการใช้งาน resource ของ Node
kubectl describe nodes
# Port-forward เพื่อทดสอบ Service จาก local
kubectl port-forward service/my-service 8080:80
# Copy ไฟล์เข้า/ออก Pod
kubectl cp my-pod:/app/log.txt ./log.txt
kubectl cp ./config.json my-pod:/app/config.json
# ตั้ง context (สำหรับหลาย Cluster)
kubectl config get-contexts
kubectl config use-context my-cluster
เครื่องมือที่เกี่ยวข้อง
- System Monitor — มอนิเตอร์ประสิทธิภาพระบบแบบเรียลไทม์
- System Info — ข้อมูลระบบและเบราว์เซอร์โดยละเอียด