ข้ามไปเนื้อหาหลัก
คอนเทนเนอร์· ~15 นาที· อัปเดตล่าสุด

StatefulSet — workload ที่มี identity (+ Lab)

ฐานข้อมูล/คิวที่แต่ละ Pod ต้องมีชื่อและ storage คงที่

พื้นฐานที่ควรรู้: แอปพลิเคชันทั่วไปมักเป็นแบบ "Stateless" คือไม่ต้องจำสถานะใดๆ ใครจะมาแทนใครก็ได้ แต่สำหรับแอปอย่างฐานข้อมูล (Database) เราต้องการให้แอปจำได้ว่าใครเป็น Master ใครเป็น Slave และแต่อะตัวต้องมีพื้นที่เก็บข้อมูลของตัวเองไม่ปะปนกัน (Stateful)

พนักงานชั่วคราว vs พนักงานประจำ

Deployment ปฏิบัติกับ Pod เหมือนพนักงานชั่วคราวที่สลับกันได้ (ใครก็ได้) · StatefulSet เหมือนพนักงานที่มีโต๊ะประจำและชื่อประจำ — Pod-0, Pod-1, Pod-2 มีลำดับและ storage เป็นของตัวเองไม่สลับกัน

งานที่มี state (ฐานข้อมูล, Kafka, Redis cluster) ต้องการ 3 อย่างที่ Deployment ให้ไม่ได้: ชื่อ/ลำดับคงที่, storage ติดตัวแต่ละ Pod, และการสร้าง/ลบตามลำดับ · StatefulSet ให้ครบ

แต่ละ Pod มีชื่อคงที่ + PVC ของตัวเอง ไม่สลับกัน

web-0ชื่อคงที่
pvc-0storage ติดตัว
web-1ชื่อคงที่
pvc-1storage ติดตัว
web-2ชื่อคงที่
pvc-2storage ติดตัว

สร้างตามลำดับ 0→1→2 · Pod สร้างใหม่ได้ PVC เดิมกลับมา

StatefulSet: แต่ละ Pod มีชื่อคงที่ (web-0, web-1) + PVC เป็นของตัวเอง ไม่สลับกัน
  • ชื่อคงที่ — Pod ชื่อ <name>-0, -1, -2 ตามลำดับ (ไม่สุ่มเหมือน Deployment)
  • storage ติดตัว — แต่ละ Pod ได้ PVC ของตัวเอง ที่ผูกกลับมาแม้ Pod สร้างใหม่
  • ลำดับ — สร้าง 0→1→2, ลบ 2→1→0 (สำคัญกับ cluster ที่มี leader/follower)
  • มักคู่กับ Headless Service (clusterIP: None) เพื่อให้เข้าถึงแต่ละ Pod ตรง ๆ ด้วยชื่อ

สรุป Key Takeaways

  • StatefulSet = workload ที่ต้องมี identity คงที่ + storage ติดตัว + ลำดับ (DB, Kafka, Redis)
  • Pod มีชื่อคงที่ (name-0/1/2) และ PVC ของตัวเองที่ผูกกลับมา
  • มักคู่กับ Headless Service · stateless ทั่วไปยังใช้ Deployment
  • พิจารณา managed DB ของ cloud ก่อนรัน DB เองบน K8s

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

StatefulSet ต่างจาก Deployment ตรงไหน

สามอย่างที่ Deployment ไม่ให้: (1) ชื่อ pod คงที่มีลำดับ (db-0, db-1) (2) แต่ละ pod มี PVC ของตัวเองที่ตามตัวไปตลอด (3) เกิด/ตายตามลำดับ — จำเป็นกับระบบที่ replica ไม่เท่ากัน (database primary/replica, Kafka broker) ส่วนแอป stateless ใช้ Deployment เสมอ

แอปธรรมดาต่อฐานข้อมูล ต้องเป็น StatefulSet ไหม

ไม่ — แอปที่ "เรียกใช้" ฐานข้อมูลภายนอก (RDS ฯลฯ) เป็น stateless ใช้ Deployment ปกติ StatefulSet ใช้เฉพาะเมื่อ "ตัวแอปเอง" ถือ state ติดดิสก์ที่แยกตาม replica — และในทางปฏิบัติ ฐานข้อมูล production บน cloud มักใช้ managed service แทนการรันเองใน cluster

อ่านจบแล้วอย่าลืมทำเครื่องหมาย