ติดตั้ง K3s Kubernetes บน VPS แบบ Lightweight

ติดตั้ง K3s Kubernetes บน VPS แบบ Lightweight

กันยายน 2026 · อ่าน 9 นาที

K3s คือ Kubernetes distribution ที่มีน้ำหนักเบา ผ่านการรับรอง CNCF และออกแบบมาสำหรับ environment ที่มีทรัพยากรจำกัด เช่น VPS RAM 1–2 GB ต่างจาก Kubernetes เต็มรูปแบบที่ต้องการ RAM อย่างน้อย 2 GB เพียงสำหรับ control plane, K3s รวม API server, scheduler, controller manager และ etcd ไว้ในไบนารีเดียวขนาดไม่ถึง 100 MB และเริ่มทำงานได้ด้วย RAM เพียง 512 MB ในบทความนี้จะพาติดตั้ง K3s single-node cluster บน VPS Ubuntu 22.04/24.04 พร้อม deploy แอปพลิเคชันแรกและตั้งค่า Traefik ingress ที่มาพร้อมกับ K3s

ความต้องการของระบบ

K3s ทำงานได้บน VPS ขนาดเล็กมาก แต่เพื่อ production ที่ stable แนะนำ spec ดังนี้:

Componentขั้นต่ำแนะนำ
RAM512 MB1–2 GB+
CPU1 vCore2 vCore+
Disk2 GB20 GB+
OSUbuntu 20.04+Ubuntu 22.04 / 24.04
# ตรวจสอบ kernel version (ต้องการ 4.15+)
uname -r

# ตรวจสอบ RAM
free -h

# ตรวจสอบ CPU
nproc

ติดตั้ง K3s (Server/Control Plane)

K3s ติดตั้งด้วยคำสั่งเดียว script จะดาวน์โหลดไบนารี, ตั้งค่า systemd service และเริ่มทำงานโดยอัตโนมัติ:

# ติดตั้ง K3s (latest stable)
curl -sfL https://get.k3s.io | sh -

# รอให้ service เริ่มทำงาน
sudo systemctl status k3s

# ตรวจสอบ node พร้อมใช้งาน
sudo kubectl get nodes

หลังติดตั้งสำเร็จ K3s จะสร้าง kubeconfig ไว้ที่ /etc/rancher/k3s/k3s.yaml โดยอัตโนมัติ:

# ตั้งค่า KUBECONFIG สำหรับ user ปัจจุบัน
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config
export KUBECONFIG=~/.kube/config

# ยืนยันว่า cluster ทำงาน
kubectl cluster-info

เพิ่ม Worker Node (Multi-Node Cluster)

ถ้าต้องการเพิ่ม node อื่นเข้า cluster ต้องใช้ token จาก server node:

# บน server node — ดู token สำหรับ join
sudo cat /var/lib/rancher/k3s/server/node-token

# บน worker node — ติดตั้ง K3s ในโหมด agent
curl -sfL https://get.k3s.io | K3S_URL=https://SERVER_IP:6443 \
  K3S_TOKEN=NODE_TOKEN sh -

# ตรวจสอบว่า worker node เข้า cluster แล้ว (บน server)
kubectl get nodes -o wide
Note: เปิด port 6443 (API server) และ 10250 (Kubelet) ใน firewall ระหว่าง server กับ worker nodes ด้วย ufw allow 6443/tcp และ ufw allow 10250/tcp

Deploy แอปพลิเคชันแรก

ทดสอบ cluster ด้วยการ deploy Nginx แบบง่าย:

# สร้าง deployment
kubectl create deployment nginx --image=nginx:alpine --replicas=2

# expose เป็น service แบบ NodePort
kubectl expose deployment nginx --port=80 --type=NodePort

# ดู pod และ service
kubectl get pods
kubectl get svc nginx

จด NodePort ที่ได้ (เช่น 30xxx) แล้วเข้าถึงที่ http://VPS_IP:NodePort เพื่อยืนยันว่า Nginx ทำงาน

ใช้ Traefik Ingress ที่มาพร้อม K3s

K3s ติดตั้ง Traefik ingress controller ให้โดยอัตโนมัติ ซึ่งรับ traffic บน port 80 และ 443:

# ตรวจสอบว่า Traefik ทำงาน
kubectl get pods -n kube-system | grep traefik

# ดู service ของ Traefik
kubectl get svc -n kube-system traefik

สร้าง Ingress resource สำหรับ Nginx ที่ deploy ไว้ก่อนหน้า:

cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
  rules:
  - host: nginx.yourdomain.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx
            port:
              number: 80
EOF
Tip: ชี้ DNS ของ nginx.yourdomain.com มายัง IP ของ VPS ก่อน จากนั้น Traefik จะ route request ไปยัง Nginx pod โดยอัตโนมัติ

คำสั่ง kubectl ที่ใช้บ่อย

# ดูทุก resource ใน namespace ปัจจุบัน
kubectl get all

# ดู log ของ pod
kubectl logs POD_NAME

# exec เข้าไปใน container
kubectl exec -it POD_NAME -- /bin/sh

# scale deployment
kubectl scale deployment nginx --replicas=3

# ลบ deployment
kubectl delete deployment nginx

# apply manifest จากไฟล์
kubectl apply -f app.yaml

# ดู resource ทุก namespace
kubectl get pods -A

ตั้งค่า Persistent Volume ด้วย Local Storage

K3s มี Local Path Provisioner ให้ใช้สำหรับ PersistentVolume แบบง่าย:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: local-path
  resources:
    requests:
      storage: 5Gi
EOF

# ตรวจสอบ PVC
kubectl get pvc

อัปเกรดและถอนการติดตั้ง K3s

# อัปเกรด K3s เป็น version ใหม่
curl -sfL https://get.k3s.io | sh -

# หยุดและถอนการติดตั้ง K3s (server)
/usr/local/bin/k3s-uninstall.sh

# ถอน agent node
/usr/local/bin/k3s-agent-uninstall.sh

ตรวจสอบว่า K3s ทำงานถูกต้อง

# ดูสถานะ K3s service
sudo systemctl status k3s

# ตรวจสอบ node พร้อมใช้งาน (STATUS = Ready)
kubectl get nodes

# ดู pod ระบบทั้งหมดใน kube-system
kubectl get pods -n kube-system

# ตรวจสอบ API server ตอบสนอง
kubectl cluster-info

# ดู version ของ K3s
k3s --version
Tip: ถ้า node แสดงสถานะ NotReady ให้ตรวจสอบ log ด้วย sudo journalctl -u k3s -f — ส่วนใหญ่เกิดจาก CNI plugin ยังโหลดไม่เสร็จ รอสัก 1–2 นาทีแล้วตรวจสอบใหม่

แก้ปัญหาที่พบบ่อย

Error: "node not found" หรือ node ค้างที่ NotReady

CNI network plugin ยังเริ่มต้นไม่สมบูรณ์ หรือ firewall บล็อก VXLAN traffic ระหว่าง nodes

# ดู logs K3s ว่า error อะไร
sudo journalctl -u k3s --no-pager | tail -50

# ตรวจสอบ Flannel CNI pod (K3s ใช้ Flannel โดยค่าเริ่มต้น)
kubectl get pods -n kube-system | grep flannel

# เปิด UDP port 8472 สำหรับ VXLAN (ถ้าใช้ multi-node)
sudo ufw allow 8472/udp

Error: "x509: certificate signed by unknown authority"

kubeconfig ใน ~/.kube/config ถูก copy มาแล้วแต่ IP/hostname ไม่ตรงกับ SAN ใน certificate

# ดู kubeconfig ที่ K3s สร้าง (ใช้ localhost)
sudo cat /etc/rancher/k3s/k3s.yaml

# ถ้าเข้าถึงจากเครื่องอื่น ต้องแทน 127.0.0.1 ด้วย IP จริง
sed 's/127.0.0.1/VPS_PUBLIC_IP/g' /etc/rancher/k3s/k3s.yaml > ~/.kube/config

Error: "dial tcp: connect: connection refused" บน port 6443

K3s API server ไม่ทำงาน หรือ firewall บล็อก port 6443

# ตรวจสอบว่า K3s listen อยู่บน port 6443
sudo ss -tlnp | grep 6443

# รีสตาร์ท K3s
sudo systemctl restart k3s

# เปิด port ใน firewall
sudo ufw allow 6443/tcp

Error: pod ถูก evict หรือ "Insufficient memory"

VPS มี RAM ไม่พอสำหรับ pod ที่ต้องการรัน K3s evict pod เมื่อ node memory ต่ำกว่า threshold

# ตรวจสอบ memory usage ใน node
kubectl describe node | grep -A5 "Allocated resources"

# ตั้งค่า swap memory เพิ่ม
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab

Traefik ไม่รับ traffic บน port 80/443

Traefik LoadBalancer service ต้องการ IP จาก external load balancer ซึ่ง VPS ทั่วไปไม่มี สถานะจะเป็น Pending

# ตรวจสอบสถานะ Traefik service
kubectl get svc -n kube-system traefik

# patch externalIPs ด้วย IP ของ VPS
kubectl patch svc traefik -n kube-system \
  -p '{"spec":{"externalIPs":["VPS_PUBLIC_IP"]}}'

คำถามที่พบบ่อย

K3s ต่างจาก Kubernetes เต็มรูปแบบอย่างไร?

K3s ผ่านการรับรอง CNCF Kubernetes conformance ดังนั้น API และ resource ทุกอย่างเหมือนกัน ความแตกต่างหลักคือ K3s ใช้ SQLite แทน etcd ใน single-node ทำให้ประหยัด RAM ประมาณ 200 MB รวม component หลายตัวไว้ในไบนารีเดียว และตัดส่วนที่ไม่จำเป็นออก ทำให้ binary เล็กกว่า 10x และ startup เร็วกว่ามาก สำหรับ production cluster ขนาดใหญ่ยังคงแนะนำ Kubernetes เต็มรูปแบบพร้อม etcd cluster

K3s รองรับ Helm charts ได้ไหม?

ได้ ทุก Helm chart ที่รองรับ Kubernetes ทำงานบน K3s ได้ทันที K3s ยังมี Helm Controller ในตัวที่ให้คุณ deploy Helm chart ผ่าน HelmChart CRD ได้โดยไม่ต้องติดตั้ง Helm CLI ด้วยซ้ำ แต่ถ้าต้องการใช้ Helm CLI ก็ติดตั้งได้ตามปกติด้วย curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

K3s เหมาะสำหรับ production ไหม?

ใช่ K3s ถูกใช้ใน production โดยองค์กรขนาดใหญ่หลายแห่ง โดยเฉพาะสำหรับ edge computing, IoT และ small-scale Kubernetes cluster บน VPS ถ้าต้องการ high availability สามารถตั้ง K3s embedded etcd cluster ได้ด้วยการติดตั้ง server node 3 ตัวขึ้นไป: curl -sfL https://get.k3s.io | K3S_TOKEN=SECRET sh -s - server --cluster-init