ReplicaSet คือ Object ชิ้นหนึ่งของ Kubernetes (K8s) ที่ทำหน้าที่หลักในการ ควบคุมและดูแลจำนวน Pod ให้ทำงานอยู่ในระบบตามจำนวนที่เรากำหนดไว้ตลอดเวลา (Desired State) เพื่อให้เข้าใจง่ายขึ้น ลองจินตนาการว่า ReplicaSet เป็น “ผู้จัดการฝ่ายควบคุมคุณภาพ” ที่คอยตรวจดูหน้างานตลอดเวลา ถ้าเราบอกว่าต้องการให้มีแอปพลิเคชันนี้ทำงานอยู่ 3 หน้าต่าง (3 Pods) ตัว ReplicaSet จะคอยนับจำนวนอยู่เสมอ หากมี Pod ไหนค้าง พัง หรือดับไป มันจะสั่งสร้าง Pod ใหม่ขึ้นมาทดแทนทันที หรือถ้าจู่ๆ มี Pod เกินมา มันก็จะลบออกให้เหลือเท่าที่สั่ง
นอกเรื่องนิดหน่อย ถ้าเคยดู star trek / star gate ชื่อ Replica มันคือแมลงมุมเหล็กที่ทำทุกอย่างเพื่อ clone เพิ่มตัวเองนั่นละ แต่ ReplicaSet มันทำกับ pod คิดว่าเป็นเครื่อง cloning อัตโนมัติละกัน
หน้าที่หลักของ ReplicaSet
- รักษาจำนวน Pod (Redundancy & High Availability): รับประกันว่าแอปพลิเคชันของเราจะมีจำนวนสำรองเพียงพอรองรับผู้ใช้งาน แม้ว่า Node (เครื่องเซิร์ฟเวอร์) บางเครื่องจะพังไปก็ตาม
- รองรับการขยายระบบ (Scaling): เราสามารถสั่งเพิ่มหรือลดจำนวน Pod ได้ง่าย ๆ เพียงแค่เปลี่ยนตัวเลขจำนวนที่ต้องการ (Replicas) เช่น จาก 3 เป็น 10 เพื่อรองรับ Traffic ที่ถล่มเข้ามา
- ระบุกลุ่มเป้าหมายด้วย Label Selector: ReplicaSet ไม่ได้ผูกติดกับ Pod ตัวใดตัวหนึ่งเป็นการถาวร แต่จะใช้ระบบ
Selectorในการมองหา Pod ที่ติดค้ายาง (Labels) ตรงกับที่มันกำหนด เพื่อเข้าไปควบคุมดูแล
โครงสร้างหน้าตาของ ReplicaSet (YAML)
ตัวอย่างไฟล์คอนฟิกเวลาเราจะสร้าง ReplicaSet ขึ้นมาใช้งาน
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend-replicaset
labels:
app: guestbook
tier: frontend
spec:
# 1. กำหนดจำนวน Pod ที่ต้องการให้รันตลอดเวลา
replicas: 3
# 2. ตัวเลือกในการมองหา Pod ที่ต้องการควบคุม
selector:
matchLabels:
tier: frontend
# 3. แม่พิมพ์ (Template) สำหรับสร้าง Pod ใหม่ขึ้นมาหากจำนวนไม่ครบ
template:
metadata:
labels:
tier: frontend
spec:
containers:
- name: php-redis
image: gcr.io/google_samples/gb-frontend:v3
ข้อควรทราบ: Deployment vs ReplicaSet
ในความเป็นจริงของการทำงานกับ Kubernetes เราแทบจะไม่สร้าง ReplicaSet ขึ้นมาใช้งานตรง ๆ แต่เราจะนิยมสร้าง Object ที่ชื่อว่า Deployment แทน เพราะ Deployment เป็น Object ระดับที่สูงกว่า ซึ่งมันจะครอบและเข้าไปบริหารจัดการ ReplicaSet อีกทีหนึ่ง ข้อดีของการใช้ Deployment คือมันจะช่วยจัดการเรื่อง Rolling Update (การอัปเดตเวอร์ชันแอปพลิเคชันแบบไม่ล่ม) และการ Rollback (ย้อนกลับไปเวอร์ชันเก่า) ได้อย่างราบรื่น โดยที่ Deployment จะไปสั่งสร้างและสลับใช้งาน ReplicaSet ตัวใหม่ให้อัตโนมัติเบื้องหลัง
อ่านเพิ่มเติม