IS
ISSARAPONG
System
🇹🇭 ภาษาไทย

เริ่มต้นใช้งาน Kubernetes

เรียนรู้วิธีการใช้งาน Kubernetes ตั้งแต่พื้นฐาน ครอบคลุม Pod, Deployment, Service, ConfigMap, Namespace และคำสั่ง kubectl ที่จำเป็นสำหรับการจัดการ Container Orchestration

Issarapong15 พฤษภาคม 25674 นาที

เริ่มต้นใช้งาน 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หน้าที่
kubeletAgent ที่รันบนทุก 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 — ข้อมูลระบบและเบราว์เซอร์โดยละเอียด