ป้ายกำกับ: Scaling

Kubernetes: ReplicaSet (ทำซำ)Kubernetes: ReplicaSet (ทำซำ)

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 ตัวใหม่ให้อัตโนมัติเบื้องหลัง


อ่านเพิ่มเติม