ข้ามไปยังเนื้อหา

การรัน Kubernetes บนเครื่องตัวเอง

คุณไม่จำเป็นต้องมี data center เพื่อเรียน Kubernetes เครื่องมืออย่าง kind, minikube และ k3d ให้คุณได้ cluster จริงที่รองรับหลาย node รันอยู่บนเครื่องของคุณเองทั้งหมด

เครื่องมือสามตัวนี้ครอบคลุมการพัฒนาและเรียนรู้ Kubernetes บนเครื่องตัวเองเกือบทั้งหมด

  • kind (Kubernetes IN Docker) รัน node แต่ละตัวของ cluster เป็น Docker container สร้างและลบเร็ว จึงเหมาะกับ CI pipeline และเหมาะกับการเรียนตามคอร์สแบบนี้
  • minikube รัน cluster แบบ single หรือ multi-node ข้างใน VM หรือ container driver ที่คุณเลือก มาพร้อม ecosystem ของ addon (dashboard, ingress, metrics) ที่เปิดใช้ได้ด้วยคำสั่งเดียวต่อตัว
  • k3d รัน k3s ที่เป็น Kubernetes distribution แบบ lightweight ที่ผ่าน certified อยู่ข้างใน Docker container แนวคิดคล้าย kind แต่สร้างขึ้นรอบ footprint ที่เล็กกว่าของ k3s

ทั้งสามตัวมีไว้เพื่อทำให้การพัฒนาและเรียนรู้บนเครื่องตัวเองเร็วและทิ้งได้ ไม่มีตัวไหนตั้งใจให้ใช้บน production เลย production cluster จะสร้างด้วยเครื่องมืออย่าง kubeadm หรือจัดเตรียมโดย managed cloud service บนเครื่องจริงหรือ virtual machine ที่มี networking, storage และ high availability ที่เหมาะสม

สร้าง local cluster แล้วลองสำรวจดูสักหน่อย

Terminal window
kind create cluster
kubectl cluster-info
kubectl get nodes

kubectl cluster-info ยืนยันว่าคุณเข้าถึง API server ได้ และแสดงว่า core service รันอยู่ที่ไหน ส่วน kubectl get nodes แสดงรายการ node ใน cluster พร้อมสถานะ Ready ของตัวเอง สิ่งแรกที่ควรเช็คทุกครั้งที่รู้สึกว่ามีอะไรผิดปกติ

พอมี cluster แล้ว ให้รัน Pod แล้วเข้าถึง Pod นั้นจาก laptop ของคุณ

Terminal window
kubectl run nginx --image=nginx
kubectl get pods
kubectl port-forward pod/nginx 8080:80

kubectl run เป็นวิธีแบบ imperative เร็ว ๆ ในการสร้าง Pod เดียวที่รัน container ตัวเดียว มีประโยชน์เวลาจะ smoke-test image สักตัว kubectl port-forward เปิด tunnel จาก port บนเครื่องของคุณไปยัง port ข้างใน Pod ทำให้ http://localhost:8080 เข้าถึง nginx ที่รันอยู่ใน cluster ได้เลยโดยไม่ต้องมี Service หรือ Ingress เลย สะดวกมากสำหรับขั้นตอนแรก ๆ ของการ debug หรือลองอะไรเล่น ๆ

namespace คือวิธีแบ่ง cluster เดียวออกเป็นขอบเขตแยกกันสำหรับชื่อ, การเข้าถึง และ resource limit ทุก cluster มาพร้อม namespace พื้นฐานอยู่แล้วไม่กี่ตัว

  • default — ที่ที่ object จะไปอยู่ถ้าคุณไม่ระบุ namespace
  • kube-system — สงวนไว้สำหรับ component ที่ control plane จัดการเอง เช่น CoreDNS และ Pod ของ kube-proxy เอง ปกติคุณแค่มาดู ไม่ต้องไปแตะ
  • kube-public — ผู้ใช้ทุกคนอ่านได้ (รวมถึงคนที่ไม่ authenticate) ใช้เก็บข้อมูล cluster ที่ควรเปิดเผยต่อสาธารณะ

แสดงรายการ namespace แล้วสร้างของคุณเองสำหรับโปรเจกต์

Terminal window
kubectl get namespaces
kubectl create namespace my-app
flowchart TB
  laptop["Your laptop"] --> docker["Docker"]
  subgraph cluster["kind cluster"]
    cp["control-plane node (container)"]
    w1["worker node (container)"]
    w2["worker node (container)"]
  end
  docker --> cluster
A local kind cluster running entirely inside Docker on your laptop
kind, minikube และ k3d ใช้ทำอะไรเป็นหลัก
คำสั่งไหนบอกว่า node ใน cluster ของคุณ healthy และ ready หรือยัง
namespace kube-system ใช้ทำอะไร
คำสั่งไหนสร้าง namespace ใหม่ของคุณเอง