k3s: ติดตั้ง Kubernetes ขนาดเล็กบน Cloud Server เครื่องเดียว

ติดตั้ง k3s ซึ่งเป็น Kubernetes ขนาดเล็กบน Cloud Server เครื่องเดียว ตั้ง kubectl, Deploy แอปผ่าน Traefik Ingress, สำรองข้อมูล และรู้ว่าเมื่อไรไม่ควรใช้

โดย ทีมงาน THAI DATA CLOUD อัปเดต อ่าน 11 นาที

แชร์FacebookXLINELinkedIn
k3s — k3s: ติดตั้ง Kubernetes ขนาดเล็กบน Cloud Server เครื่องเดียว
k3s: ติดตั้ง Kubernetes ขนาดเล็กบน Cloud Server เครื่องเดียว

คำตอบสั้น ๆ: ติดตั้ง k3s ซึ่งเป็น Kubernetes ขนาดเล็กบน Cloud Server เครื่องเดียว ตั้ง kubectl, Deploy แอปผ่าน Traefik Ingress, สำรองข้อมูล และรู้ว่าเมื่อไรไม่ควรใช้

คู่มือนี้อธิบาย k3s ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย

k3s คือ Kubernetes ฉบับย่อส่วนที่รวมทุกอย่างไว้ในไฟล์โปรแกรมเดียว ใช้หน่วยความจำน้อย ติดตั้งด้วยคำสั่งเดียว และผ่านการรับรองว่าเข้ากันได้กับ Kubernetes มาตรฐาน จึงใช้ไฟล์ YAML และ kubectl ชุดเดียวกับคลัสเตอร์ใหญ่ได้ เหมาะกับทีมพัฒนาที่อยากฝึกหรือทดสอบ Kubernetes บนเครื่องจริง และระบบขนาดเล็กที่ต้องการ Rolling Update กับ Self-healing โดยไม่ต้องดูแลคลัสเตอร์หลายเครื่อง

เมื่อทำตามคู่มือนี้ คุณจะมีคลัสเตอร์ k3s หนึ่งโหนดบน Cloud Server ใช้ kubectl ด้วยผู้ใช้ทั่วไปได้ Deploy แอปตัวอย่างสองสำเนา เปิดให้เข้าจากภายนอกด้วย Traefik Ingress ที่มากับ k3s และรู้วิธีสำรองข้อมูลของคลัสเตอร์ ก่อนเริ่มให้อ่านหัวข้อว่าเมื่อไรไม่ควรใช้ Kubernetes ด้วย

สิ่งที่ต้องเตรียม

  • Cloud Server ที่ใช้ Ubuntu 22.04/24.04, Debian 12 หรือ AlmaLinux/Rocky Linux 9 ขั้นต่ำ 2 vCPU และ RAM 2 GB ตามเอกสาร k3s แนะนำ 4 GB ขึ้นไปถ้าจะรันแอปจริง และควรใช้ดิสก์ SSD
  • สิทธิ์ sudo และ Public IP (ตัวอย่าง 203.0.113.10) พร้อม DNS ของ app.example.com ชี้มาที่เครื่องนี้
  • พอร์ต 80 และ 443 ว่าง เพราะ Traefik ของ k3s จะใช้ ถ้ามี Nginx หรือ Apache อยู่ให้ปิดก่อน
  • ความรู้พื้นฐานเรื่อง Container (ดู คำสั่ง Docker พื้นฐาน)

เมื่อไรไม่ควรใช้: ถ้ามีเว็บหรือแอปไม่กี่ตัวที่รันด้วย Docker Compose ได้ดีอยู่แล้ว ทีมยังไม่มีใครดูแล Kubernetes ได้ หรือเครื่องมี RAM ไม่ถึง 2 GB ให้ใช้ Docker Compose ต่อ คลัสเตอร์หนึ่งโหนดยังเป็นจุดล่มจุดเดียว ถ้าเครื่องดับ ทุกแอปดับพร้อมกัน

แผนภาพคลัสเตอร์ k3s หนึ่งโหนด ผู้ใช้เข้าผ่าน Traefik Ingress ไป Service และ Pod ของแอปสองสำเนา
Traefik รับคำขอที่พอร์ต 80/443 แล้วส่งตามชื่อโดเมนไป Service ที่กระจายงานให้ Pod

ขั้นตอนที่ 1: เปิด Firewall ให้ k3s ทำงานได้

เอกสาร k3s แนะนำให้ปิด UFW หรือ firewalld แต่บนเครื่องที่ออกอินเทอร์เน็ตตรงควรเปิดไว้และเพิ่มกฎตามนี้ ช่วง 10.42.0.0/16 คือ IP ของ Pod และ 10.43.0.0/16 คือ IP ของ Service ซึ่งต้องคุยกับโฮสต์ได้ ส่วนพอร์ต API 6443 ไม่ต้องเปิดสู่อินเทอร์เน็ต ใช้ผ่าน SSH Tunnel แทน

# Ubuntu / Debian (UFW)
sudo ufw allow 80,443/tcp
sudo ufw allow from 10.42.0.0/16 to any
sudo ufw allow from 10.43.0.0/16 to any

# AlmaLinux / Rocky Linux 9 (firewalld)
sudo firewall-cmd --permanent --add-service=http --add-service=https
sudo firewall-cmd --permanent --zone=trusted --add-source=10.42.0.0/16
sudo firewall-cmd --permanent --zone=trusted --add-source=10.43.0.0/16
sudo firewall-cmd --reload

ขั้นตอนที่ 2: ติดตั้ง k3s

สคริปต์ทางการจะติดตั้ง k3s เป็น systemd service ชื่อ k3s พร้อม kubectl, crictl และสคริปต์ถอนการติดตั้ง บน AlmaLinux/Rocky สคริปต์จะติดตั้งนโยบาย SELinux ของ k3s ให้เองด้วย ใช้เวลาประมาณหนึ่งถึงสองนาที

curl -sfL https://get.k3s.io | sh -
sudo systemctl status k3s --no-pager
sudo k3s kubectl get nodes

ถ้าต้องการล็อกเวอร์ชันให้ตรงกับคลัสเตอร์อื่น ใส่ตัวแปร INSTALL_K3S_VERSION หน้า sh - ได้ รอจนสถานะโหนดเป็น Ready แล้วดู Pod ระบบด้วย sudo k3s kubectl get pods -A ควรเห็น coredns, local-path-provisioner, metrics-server และ traefik ทำงานอยู่

ขั้นตอนที่ 3: ตั้ง kubectl ให้ผู้ใช้ทั่วไป

ไฟล์ kubeconfig อยู่ที่ /etc/rancher/k3s/k3s.yaml และอ่านได้เฉพาะ root คัดลอกมาไว้ที่บ้านของคุณแทนการเปลี่ยนสิทธิ์ไฟล์เดิม เพราะไฟล์นี้คือสิทธิ์ผู้ดูแลคลัสเตอร์ทั้งหมด

mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown "$(id -u):$(id -g)" ~/.kube/config
chmod 600 ~/.kube/config
echo 'export KUBECONFIG=$HOME/.kube/config' >> ~/.bashrc
source ~/.bashrc
kubectl get nodes

ถ้าจะใช้ kubectl จากโน้ตบุ๊ก ให้คัดลอกไฟล์นี้ไปเครื่องคุณ แล้วเปิด Tunnel ด้วย ssh -L 6443:127.0.0.1:6443 [email protected] ค่า server: https://127.0.0.1:6443 ในไฟล์จะใช้ได้ทันทีโดยไม่ต้องเปิดพอร์ต 6443

ขั้นตอนที่ 4: Deploy แอปตัวอย่าง

สร้างไฟล์ hello.yaml ที่มี Deployment สองสำเนาและ Service ภายใน การกำหนด resources สำคัญมากบนเครื่องเดียว เพราะป้องกันไม่ให้แอปตัวหนึ่งกิน RAM จนระบบทั้งเครื่องล่ม

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello
spec:
  replicas: 2
  selector:
    matchLabels:
      app: hello
  template:
    metadata:
      labels:
        app: hello
    spec:
      containers:
        - name: web
          image: nginx:1.27-alpine
          ports:
            - containerPort: 80
          resources:
            requests: { cpu: 50m, memory: 32Mi }
            limits: { memory: 128Mi }
---
apiVersion: v1
kind: Service
metadata:
  name: hello
spec:
  selector:
    app: hello
  ports:
    - port: 80
      targetPort: 80
kubectl apply -f hello.yaml
kubectl get pods -o wide
ผลคำสั่ง kubectl บนคลัสเตอร์ k3s แสดงโหนด Ready และ Pod ของแอปตัวอย่างสองตัวสถานะ Running
Pod ทั้งสองต้องเป็น Running และ READY 1/1 ก่อนไปทำ Ingress

ขั้นตอนที่ 5: เปิดให้เข้าจากภายนอกด้วย Traefik Ingress

k3s ติดตั้ง Traefik เป็น Ingress Controller ที่ฟังพอร์ต 80 และ 443 ของเครื่องไว้แล้ว เพิ่ม Ingress ต่อท้าย hello.yaml เพื่อบอกว่าคำขอที่มาด้วยชื่อ app.example.com ให้ส่งไป Service hello

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: hello
spec:
  ingressClassName: traefik
  rules:
    - host: app.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: hello
                port:
                  number: 80
kubectl apply -f hello.yaml
kubectl get ingress
curl -s -H 'Host: app.example.com' http://203.0.113.10/ | grep -i '<title>'

ผลลัพธ์ควรเป็น <title>Welcome to nginx!</title> สำหรับ HTTPS แบบอัตโนมัติ ให้ติดตั้ง cert-manager เพิ่ม แล้วระบุ tls ใน Ingress

ขั้นตอนที่ 6: ดูแลประจำวันและสำรองข้อมูลคลัสเตอร์

kubectl logs deploy/hello --tail=50
kubectl scale deploy/hello --replicas=3
kubectl set image deploy/hello web=nginx:1.27.5-alpine
kubectl rollout status deploy/hello
kubectl rollout undo deploy/hello

คลัสเตอร์ k3s เครื่องเดียวเก็บสถานะไว้ใน SQLite ที่ /var/lib/rancher/k3s/server/db/ และต้องใช้ Token ที่ /var/lib/rancher/k3s/server/token คู่กันตอนกู้คืน การหยุด Service k3s ชั่วคราวไม่หยุด Container ที่รันอยู่ จึงสำรองได้โดยแอปไม่ล่ม

sudo systemctl stop k3s
sudo tar czf /root/k3s-backup-$(date +%F).tar.gz \
  /var/lib/rancher/k3s/server/db /var/lib/rancher/k3s/server/token
sudo systemctl start k3s

ข้อมูลใน PersistentVolume ของ StorageClass local-path อยู่ใต้ /var/lib/rancher/k3s/storage ต้องสำรองแยก ถ้าต้องการลบ k3s ทั้งหมด ใช้ /usr/local/bin/k3s-uninstall.sh (ลบข้อมูลคลัสเตอร์ทั้งหมด)

ปัญหาที่พบบ่อยเกี่ยวกับ k3s

รัน kubectl แล้วขึ้น permission denied หรือ connection refused ต้องทำอย่างไร?

ถ้าเป็น permission denied แปลว่า kubectl พยายามอ่าน /etc/rancher/k3s/k3s.yaml ที่อ่านได้เฉพาะ root ให้ตั้ง KUBECONFIG ตามขั้นตอนที่ 3 ถ้าเป็น connection refused ให้ตรวจว่า Service ทำงานด้วย sudo systemctl status k3s และดู Log ด้วย sudo journalctl -u k3s -n 50

Pod ค้างสถานะ Pending หรือ ImagePullBackOff เกิดจากอะไร?

ใช้ kubectl describe pod ชื่อพ็อด ดูส่วน Events ท้ายผลลัพธ์ Pending มักเป็นเพราะ requests ของ CPU หรือ RAM เกินที่เครื่องเหลือ ImagePullBackOff คือชื่อ Image หรือ Tag ผิด หรือ Registry ต้องการรหัสผ่าน

Pod ติดต่อกันหรือหา DNS ไม่ได้หลังเปิด Firewall แก้อย่างไร?

ตรวจว่ามีกฎอนุญาต 10.42.0.0/16 และ 10.43.0.0/16 ตามขั้นตอนที่ 1 ครบ อาการที่พบบ่อยคือ coredns หรือ metrics-server รีสตาร์ตวนซ้ำ เพราะคุยกับ API Server บนโฮสต์ไม่ได้

k3s ใช้ทำงานจริง (Production) ได้หรือไม่?

ได้ k3s เป็น Kubernetes ที่ผ่านการรับรองความเข้ากันได้ แต่คลัสเตอร์หนึ่งโหนดไม่มีความพร้อมใช้งานสูง งานจริงควรมีอย่างน้อยสามโหนด Server ใช้ Embedded etcd หรือฐานข้อมูลภายนอก และเก็บฐานข้อมูลของแอปไว้นอกคลัสเตอร์

ตารางเปรียบเทียบ k3s กับ Docker Compose บนเซิร์ฟเวอร์เครื่องเดียว เรื่องทรัพยากร การอัปเดต และทีมที่เหมาะ
ถ้าคำตอบส่วนใหญ่อยู่คอลัมน์ Docker Compose ยังไม่จำเป็นต้องใช้ Kubernetes

ถ้าต้องการวางคลัสเตอร์ k3s หลายโหนดบน Cloud Server หรือประเมินว่างานของคุณควรใช้ Kubernetes หรือไม่ ติดต่อทีมงาน THAI DATA CLOUD อ่านเอกสารทางการได้ที่ K3s Documentation

อ่านเพิ่มเติมเกี่ยวกับ k3s

แชร์FacebookXLINELinkedIn

มีคำถามเรื่องบริการ? ติดต่อทีมงาน