อัปเดตคอนเทนเนอร์นักเทียบท่าโดยไม่หยุดทำงาน


17

สมมติว่าฉันมีที่เก็บ Docker พร้อมเว็บเซิร์ฟเวอร์ (เช่น Apache 2) ตอนนี้ฉันต้องการอัปเดตระบบปฏิบัติการภายใต้ คำตอบ SF นี้บอกว่าวิธีที่ดีที่สุดคือการสร้างอิมเมจพื้นฐานและอิมเมจ Apache ของฉันใหม่ แต่การปรับใช้อิมเมจนั้นหมายถึงการหยุดทำงานเนื่องจากฉันต้องลบคอนเทนเนอร์เก่าก่อนที่จะสร้างใหม่ดังนั้นจึงมีคอนเทนเนอร์เดียวเท่านั้นที่เชื่อมกับพอร์ต 80/443

แต่ฉันจะปรับใช้การอัปเดตนี้ด้วยการหยุดทำงานเป็นศูนย์ได้อย่างไร ฉันควรใช้ตัวโหลดบาลานซ์และใช้การสื่อสารระหว่างคอนเทนเนอร์หรือไม่? และฉันจะอัพเดตตัวโหลดบาลานซ์ได้อย่างไร?

คำตอบ:


18

สถานการณ์เป้าหมายในอุดมคติ

ใช่คุณควรใช้ load balancer และอัพเดตครั้งละหนึ่งอินสแตนซ์ ฉันไม่แน่ใจว่ามีการสื่อสารระหว่างคอนเทนเนอร์ที่ใด

ตัวอย่างเช่นสมมติว่าคุณมี load balancer ซึ่งให้บริการเว็บไซต์ของคุณ A. ผู้ใช้เชื่อมต่อกับมันและรู้ว่ามันเป็น "A" เท่านั้น ตัวโหลดบาลานซ์รู้ว่ามีแบ็กเอนด์สองตัวหรือมากกว่า (B, C, ฯลฯ ) และไม่ว่าจะเป็น VMs หรือคอนเทนเนอร์ไม่สำคัญ

จากนั้นคุณต้องการอัพเกรดแบ็กเอนด์ซึ่งในกรณีนี้คืออินสแตนซ์ของ Apache

  1. นำ B ออกจากแบ็กเอนด์ที่มีสิทธิ์สำหรับ load balancer ดังนั้นจึงไม่ยอมรับการรับส่งข้อมูลอีกต่อไป
  2. รอคำร้องขอปัจจุบันที่จะให้บริการและปิดการเชื่อมต่อที่มีอยู่
  3. อัปเดตคอนเทนเนอร์หรือ VM พื้นฐานที่ให้บริการ B
  4. รีสตาร์ท B รอให้โหลดแล้วเริ่มทำงาน
  5. ทดสอบ B เพื่อให้แน่ใจว่าบริการคำขอใหม่อย่างถูกต้อง
  6. เพิ่ม B กลับไปที่พูลแบ็คเอนด์ของตัวโหลดบาลานซ์เพื่อเปิดใช้งานทราฟฟิกอีกครั้ง

จากนั้นทำกระบวนการเดียวกันสำหรับ C, D และอื่น ๆ

โปรดทราบว่ามีการร้องขอแบบเปิดสำหรับการอัปเกรดคอนเทนเนอร์ Docker แบบแทนที่ตั้งแต่เดือนพฤศจิกายน 2013 แต่ดูเหมือนว่าจะไม่มีความคืบหน้ามากนักดังนั้นโซลูชันด้านบนจึงเป็นสิ่งที่คุณควรทำในเวลาเฉลี่ย

สิ่งที่ต้องทำสำหรับเว็บไซต์สดที่มีอยู่

สมมุติว่าคุณกำลังถามสิ่งนี้อยู่เพราะคุณใช้งานเว็บไซต์จริงในรุ่นนี้อยู่แล้วและต้องการอัปเกรดโดยไม่ต้องหยุดทำงาน ดังนั้นเราจำเป็นต้องได้รับสถานะเป้าหมายในอุดมคติด้านบน แต่เพิ่มขึ้นเรื่อย ๆ

สมมติว่า:

  • คุณมีชื่อ DNS ที่ชี้ไปที่คอนเทนเนอร์ของคุณ
  • ที่เก็บของคุณทำงานบนที่อยู่ IP บางส่วน
  • ผู้ใช้ของคุณไม่ทราบที่อยู่ IP ของคอนเทนเนอร์และไม่ได้กำหนดรหัสไว้ที่ใดเลย

หากสมมติฐานเหล่านี้เป็นเท็จคุณควรแก้ไขให้ถูกต้องเสียก่อน

จากนั้นทำตามขั้นตอนเหล่านี้:

  1. สร้าง load balancer ที่ IP ใหม่และชี้ไปที่ container ที่มีอยู่เป็น backend เท่านั้น
  2. เปลี่ยน DNS เพื่อชี้ไปที่ load balancer แทน IP container โดยตรง
  3. เพิ่ม Apache แบ็กเอนด์ตัวเดียวกันด้วยการตั้งค่าคอนเทนเนอร์ VM + เดียวกัน
  4. ตอนนี้คุณมี load balancer สองแบ็กเอนด์ B และ C ดังนั้นให้ทำตามคำแนะนำในส่วน "สถานการณ์เป้าหมายในอุดมคติ" เพื่ออัปเกรดหนึ่งครั้ง

วิธีอัพเดตตัวโหลดบาลานซ์

วิธีที่ง่าย (โฮสต์)

ตัวเลือกที่ง่ายที่สุดคือไม่เรียกใช้เครื่องสร้างสมดุลของคุณเอง ตัวอย่างเช่นหากคุณกำลังใช้แพลตฟอร์มคลาวด์ซึ่งให้บริการโหลดบาลานซ์เป็นบริการให้พิจารณาใช้และจากนั้นการบำรุงรักษาและการปรับปรุงของโหลดบาลานซ์จะไม่เป็นปัญหา

คู่มือวิธี

หากคุณใช้ load balancer ของคุณเองการเพิ่มเลเยอร์ทางอ้อม (เช่น DNS) จะช่วยคุณได้ สมมติว่า:

  • ว่าเรามีชื่อโฮสต์ที่แปลงเป็น IP ของ load balancer ของเราที่เราต้องการอัพเดท
  • ตัวโหลดบาลานซ์ของเรามีพูลแบ็คเอนด์ที่ P1, P2 และอื่น ๆ

เราดำเนินการดังนี้:

  • สร้าง load balancer ใหม่ B พร้อมซอฟต์แวร์เวอร์ชันใหม่
  • เพิ่มอินสแตนซ์พูลแบ็กเอนด์ P1, P2 และอื่น ๆ ทั้งหมดลงในโหลดบาลานเซอร์ B ใหม่ของเราเป็นแบ็กเอนด์
  • เพิ่มที่อยู่ IP ของ B ลงในการแก้ไข DNS พร้อมกับ A

    • ตอนนี้เรากำลังใช้ DNS เป็นเครื่องมือสร้างสมดุล
    • หากรายการสำหรับ A และ B ไม่ได้ถูกลดน้ำหนักรายการเหล่านั้นจะมีประสิทธิภาพ 50-50
    • ตอนนี้ดูเพื่อดูว่าประสิทธิภาพของ B ไม่ว่าจะมีข้อผิดพลาดใด ๆ ฯลฯ
    • หากมีสิ่งใดผิดปกติกับ B ให้เลิกทำดังนี้:

      1. ลบ B ออกจากการกำหนดค่า DNS
      2. รอให้รายการ B ใน DNS หายไป (เช่นรอให้TTLหมดอายุ)
      3. ปิด B
  • สมมติว่าคุณทำแบบทดสอบ "เบิร์นอิน" สำหรับ B และทุกอย่างเรียบร้อยดี
  • อัปเดตลำดับความสำคัญและน้ำหนักสำหรับ B ใน DNS ค่อยๆ
  • ลบ A จาก DNS ทั้งหมด
  • รอให้ DNS TTL หมดอายุ ไม่ควรได้รับการร้องขออีกต่อไป
  • เปิด A

และคุณทำเสร็จแล้ว

รายละเอียดไดอะแกรมและเครื่องมือ

ดูการเขียนและเครื่องมือเหล่านี้ที่สามารถช่วยคุณดำเนินการอัตโนมัติ แต่แนวคิดทั่วไปเหมือนกัน:

คุณธรรม

"ปัญหาทั้งหมดในวิทยาการคอมพิวเตอร์สามารถแก้ไขได้โดยการอ้อมอีกระดับหนึ่งยกเว้นหลักสูตรสำหรับปัญหาที่เกิดจากการอ้อมมากเกินไป" - เดวิดวีลเลอร์


แต่เมื่อ load balancer อยู่ใน container ด้วย (เมื่อใช้ CoreOS) ฉันจะอัพเดต container ได้อย่างไร?
das_j

@das_j ฉันได้แก้ไขคำตอบเพื่อเพิ่มวิธีการสำหรับการปรับปรุงตัวโหลดบาลานซ์เช่นกัน คำแนะนำ: มันเกี่ยวกับการอ้อมไปอีกระดับหนึ่ง :-)
Misha Brukman

1
ทั้งหมดนี้ดูเหมือนว่าจะมีการอัพเดตเซิร์ฟเวอร์ฟิสิคัลและโหลดบาลานซ์แบบฟิสิคัลด้วยเช่นกัน
Stefan Lasiewski

@StefanLasiewski คุณพูดถูกและฉันได้ลบบันทึก "container" ในหัวข้อใดหัวข้อหนึ่ง สำหรับผู้ใช้ภายนอกไม่ว่าจะเป็นแอพพลิเคชั่นหรือโหลดบาลานเซอร์กำลังทำงานบนโลหะเปลือยภาชนะหรือ VM เป็นสิ่งที่มองไม่เห็น
Misha Brukman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.