Cập nhật container Docker mà không có thời gian chết


17

Giả sử tôi có một Docker container với một máy chủ web (như Apache 2). Bây giờ tôi muốn cập nhật hệ điều hành theo nó. Câu trả lời SF này cho biết cách tốt nhất là xây dựng lại hình ảnh cơ sở và hình ảnh Apache của tôi. Nhưng triển khai hình ảnh có nghĩa là thời gian chết vì tôi phải xóa container cũ trước khi tôi có thể tạo cái mới, vì vậy chỉ có một container liên kết với cổng 80/443.

Nhưng làm thế nào tôi có thể triển khai bản cập nhật này với thời gian chết bằng không? Tôi có nên sử dụng một bộ cân bằng tải và sử dụng giao tiếp giữa các container? Và làm cách nào để cập nhật bộ cân bằng tải?

Câu trả lời:


18

Kịch bản mục tiêu lý tưởng

Có, bạn nên sử dụng bộ cân bằng tải và cập nhật từng trường hợp một. Tôi không chắc chắn nơi liên lạc giữa các container đến.

Ví dụ: hãy tưởng tượng bạn có một bộ cân bằng tải phục vụ trang web của mình A. Người dùng chỉ kết nối với nó và chỉ biết nó là "A". Bộ cân bằng tải biết rằng có hai hoặc nhiều phụ trợ (B, C, v.v.) và liệu chúng có phải là VM hay container không.

Sau đó, bạn muốn nâng cấp các phụ trợ, trong trường hợp này là các phiên bản Apache.

  1. đưa B ra khỏi các phụ trợ đủ điều kiện cho bộ cân bằng tải để nó không còn chấp nhận bất kỳ lưu lượng truy cập nào.
  2. chờ cho các yêu cầu hiện đang được phục vụ và các kết nối hiện có được đóng lại.
  3. cập nhật container hoặc VM bên dưới phục vụ B
  4. khởi động lại B, đợi cho nó tải và bắt đầu làm việc
  5. kiểm tra B để đảm bảo rằng nó phục vụ đúng yêu cầu mới
  6. thêm B trở lại nhóm phụ trợ cân bằng tải để kích hoạt lại lưu lượng

Sau đó, làm quá trình tương tự cho C, D, v.v.

Lưu ý rằng có một yêu cầu mở đối với việc nâng cấp tại chỗ các container Docker , từ tháng 11 năm 2013, nhưng dường như không có nhiều tiến triển, vì vậy giải pháp trên là điều bạn nên làm trong thời gian trung bình.

Phải làm gì cho một trang web trực tiếp hiện có

Có lẽ, bạn đang hỏi điều này bởi vì bạn đang chạy một trang web trực tiếp trong mô hình này và bạn muốn nâng cấp nó mà không có thời gian chết. Vì vậy, chúng ta cần đến trạng thái mục tiêu lý tưởng ở trên, nhưng tăng dần.

Hãy giả sử rằng:

  • bạn có một tên DNS trỏ đến container của bạn
  • container của bạn chạy trên một số địa chỉ IP
  • Người dùng của bạn không biết địa chỉ IP của người chứa và nó không được mã hóa cứng ở bất cứ đâu

Nếu những giả định này là sai, trước tiên bạn nên sửa nó sao cho đúng.

Sau đó, làm theo các bước sau:

  1. tạo bộ cân bằng tải tại một IP mới và trỏ nó vào vùng chứa hiện tại làm phụ trợ duy nhất của nó
  2. thay đổi DNS để trỏ đến bộ cân bằng tải thay vì IP container trực tiếp
  3. thêm một phụ trợ Apache giống hệt nhau với cùng thiết lập bộ chứa VM +
  4. bây giờ bạn có một bộ cân bằng tải với hai phụ trợ B và C, vì vậy hãy làm theo các hướng dẫn trong phần "kịch bản mục tiêu lý tưởng" để nâng cấp chúng cùng một lúc

Cách cập nhật bộ cân bằng tải

Cách dễ dàng (được lưu trữ)

Tùy chọn đơn giản nhất là không chạy bộ cân bằng của riêng bạn. Ví dụ: nếu bạn đang sử dụng nền tảng đám mây cung cấp cân bằng tải như một dịch vụ, hãy xem xét sử dụng nó và sau đó bảo trì và cập nhật bộ cân bằng tải không phải là vấn đề.

Cách thủ công

Nếu bạn đang chạy bộ cân bằng tải của riêng mình, việc thêm một lớp cảm ứng (tức là DNS) sẽ giúp ích. Hãy giả sử như sau:

  • rằng chúng tôi có một tên máy chủ phân giải IP của bộ cân bằng tải A mà chúng tôi muốn cập nhật
  • bộ cân bằng tải của chúng tôi có một nhóm phụ trợ của P1, P2, v.v.

Chúng tôi tiến hành như sau:

  • tạo bộ cân bằng tải B mới với phiên bản phần mềm mới
  • thêm tất cả các phiên bản nhóm phụ trợ P1, P2, v.v. vào bộ cân bằng tải B mới của chúng tôi làm phụ trợ
  • thêm địa chỉ IP của B vào độ phân giải DNS cùng với A

    • bây giờ chúng tôi sử dụng DNS một cách cân bằng hiệu quả
    • nếu các mục nhập cho A và B không có trọng số, chúng có hiệu quả 50-50
    • Bây giờ hãy xem để xem B thực hiện như thế nào, có lỗi nào không, v.v.
    • nếu có gì sai với B, hãy hoàn tác như sau:

      1. xóa B khỏi cấu hình DNS
      2. chờ cho mục B trong DNS để biến mất (tức là, chờ đợi cho TTL hết hạn)
      3. từ chối B
  • giả sử bạn đã thực hiện bài kiểm tra "burn-in" cho B và mọi thứ đều ổn
  • dần dần cập nhật mức độ ưu tiên và trọng số cho B trong DNS
  • xóa A khỏi DNS hoàn toàn
  • chờ DNS TTL hết hạn; Không nên nhận bất kỳ yêu cầu nào nữa
  • từ chối A

và bạn đã hoàn thành.

Chi tiết, sơ đồ và dụng cụ

Xem các bài viết và công cụ này có thể giúp bạn tự động hóa quy trình, nhưng ý tưởng chung là như nhau:

Đạo đức

"Tất cả các vấn đề trong khoa học máy tính có thể được giải quyết bằng một mức độ gián tiếp khác, tất nhiên ngoại trừ vấn đề có quá nhiều chỉ định." - David Wheeler


Nhưng khi cân bằng tải cũng ở trong một container (khi sử dụng CoreOS), làm cách nào để cập nhật container này?
das_j

@das_j Tôi cũng đã chỉnh sửa câu trả lời để thêm cách cập nhật bộ cân bằng tải. Gợi ý: đó là tất cả về một mức độ gián tiếp khác. :-)
Misha Brukman

1
Nói chung, điều này nghe giống như cách người ta sẽ cập nhật các máy chủ vật lý và bộ cân bằng vật lý.
Stefan Lasiewski

@StefanLasiewski bạn hoàn toàn đúng và tôi đã xóa ghi chú "container" trong một trong các tiêu đề. Đối với người dùng bên ngoài, cho dù ứng dụng hoặc bộ cân bằng tải đang chạy trên kim loại trần, thùng chứa hoặc VM, phần lớn là vô hình.
Misha Brukman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.