Cụm Kubernetes hai site có cần ba bầu cử viên etcd không?
Ba nút mặt phẳng điều khiển trên hai site VPN vẫn mất túc số khi site lớn hơn sập. Đếm số bầu cử viên etcd thật và chọn mất mát mà bạn sống sót.
Ba VM mặt phẳng điều khiển trông như ba cơ hội sống sót qua một đêm tồi tệ. Thực tế không phải vậy, và chính khoảng cách giữa hai niềm tin đó biến một thiết kế ba nút gọn gàng thành cụm ngừng nhận ghi khi một tòa nhà mất điện. Liên kết VPN giữa các site làm máy tiếp cận được nhau và che giấu vấn đề thay vì sửa nó. Phiếu được đếm theo từng thành viên etcd, và hai trong số các thành viên đó vẫn có thể ngồi sau một switch, một UPS và một đường uplink.
Ba nút mặt phẳng điều khiển, một miền hỏng
Bạn chạy kubectl get nodes, thấy ba mục mặt phẳng điều khiển và ghi cụm là có tính sẵn sàng cao. Con số đó mô tả dung lượng có thể lập kế hoạch, không phải khả năng sống sót. Trong kubeadm không có etcd bên ngoài, mỗi nút mặt phẳng điều khiển cũng lưu trữ một thành viên, nên ba nút thực sự cho ba bầu cử viên. Liệu các bầu cử viên đó có hỏng độc lập hay không là câu hỏi riêng mà danh sách nút không thể trả lời.
Hai VM trên một hypervisor, hai rack trên một nguồn điện, hai đường uplink từ một ISP: mỗi cặp là một miền duy nhất mang hai tên máy. Viết ra cách bố trí và đánh dấu mỗi bầu cử viên chia sẻ gì — hypervisor, PDU, switch đỉnh rack, mảng lưu trữ, thiết bị NAT, bộ tập trung VPN. Sau đó bỏ từng đối tượng dùng chung trên giấy và đếm lại số phiếu còn lại. Một cụm mất hai bầu cử viên vì một máy hỏng luôn là cụm một bầu cử viên từ đầu; chưa ai đặt câu hỏi đó cho nó.
Việc tách hai site chịu được gì và không chịu được gì
Khi ba bầu cử viên được đặt hai và một trên hai site, phía lớn hơn giữ túc số khi site kia biến mất, còn phía một bầu cử viên thì không bao giờ. Sự bất đối xứng đó là số học, không phải tinh chỉnh. Bất kỳ cụm etcd dựa trên đa số nào trải đúng trên hai site độc lập đều trượt bài kiểm tra "mất một trong hai site và vẫn tiếp tục xác nhận", vì cả hai phía phải giữ hơn nửa số phiếu cùng lúc.
Bảng dưới đây là cách nhanh nhất để thấy bạn thực sự đã mua những hỏng hóc nào. Đọc từng hàng như sau: nếu đêm nay cả hàng này biến mất, những người sống sót có còn xác nhận được một ghi không?
| What disappears | Voters left | Writes still commit |
|---|---|---|
| Site B, holding voter 3 | 2 of 3 | Yes |
| Site A, holding voters 1 and 2 | 1 of 3 | No |
| One hypervisor carrying any two voters | 1 of 3 | No |
| The inter-site VPN only | 2 of 3 on one side | Only on the majority side |
Tại sao đường hầm không bao giờ thêm phiếu
VPN là vận chuyển, không phải thành viên. Nó có thể làm một bầu cử viên ở xa tiếp cận được và có thể biến một phân vùng thành thứ trông như một thời gian chờ chậm, và đó là toàn bộ đóng góp của nó cho túc số. Điều nó thêm là chi phí, vì mỗi lần xác nhận phải đi qua liên kết và etcd trả cho chuyến đi khứ hồi đó ở những ghi chạm vào nhật ký raft. Một đường dao động biến sao chép thành thử lại và bầu chọn.
Phân vùng là nơi người ta mong đợi phép màu, nên hãy chính xác về chúng. Nếu liên kết rớt khi lãnh đạo cũ ngồi ở phía một bầu cử viên, phía đó không thể xác nhận và lãnh đạo bước xuống khi hết thời gian bầu chọn, trong khi phía hai bầu cử viên chọn người thay thế. Hướng dẫn của etcd về các chế độ hỏng mô tả hành vi một cách thẳng thắn: dịch vụ tiếp tục ở phía đa số, không có cụm thứ hai ghi được ở phía bị cô lập.
Quyết định bạn mua sự gián đoạn nào
Hai cộng một là thiết kế chính đáng khi Site A là site chính và bạn chấp nhận rằng mất nó nghĩa là mất ghi của mặt phẳng điều khiển cho đến khi ai đó hành động. Điều biến nó thành khuyết điểm là để quyết định đó ngầm định. Ghi vào runbook: mặt phẳng điều khiển của bạn sống sót từ site nào, và người vận hành làm gì khi site kia tắt lúc 03:00.
Nếu yêu cầu thay vào đó là "site nào cũng có thể hỏng", cách bố trí phải giữ đa số ở mỗi site, và ba bầu cử viên trên hai site không làm được điều đó. Bạn hoặc thêm miền thứ ba thực sự độc lập — một vùng nhỏ ở nhà cung cấp khác hoạt động nếu đường tới đó ổn định — hoặc tách thành hai cụm với etcd riêng và chấp nhận chi phí vận hành của việc tách đó. Không lối tắt nhân chứng nào tránh được điều này: etcd không có thành viên trọng tài nhẹ, nên bầu cử viên thứ ba là thành viên đầy đủ với yêu cầu riêng về đĩa, bộ nhớ và mạng. Vẽ một ô ghi nhãn nhân chứng trên sơ đồ không tạo ra nhân chứng.
Túc số không giống như dịch vụ
Túc số etcd giữ máy chủ API có thể nhận ghi, và đó là tất cả những gì nó giữ. Các kiểm tra sức khỏe của bộ cân bằng tải, ingress, khả năng tiếp cận CNI qua đường hầm, vùng gắn ổ đĩa và sao chép ứng dụng mỗi thứ cần câu trả lời riêng. Một cụm có thể giữ đa số trong sạch mà vẫn không cung cấp gì hữu ích cho người dùng.
Sau đó xác nhận tư cách thành viên mà bạn nghĩ mình có, vì sơ đồ trôi:
kubectl -n kube-system get pods -l component=etcd -o wide
kubectl get endpoints kube-apiserver -n default
etcdctl member list -w table
So danh sách thành viên với bản vẽ bố trí. Nếu hai thành viên phân giải về cùng một máy hoặc cùng một rack, bản vẽ mới sai chứ không phải cụm, và thay đổi kích thước quanh một topo sai chỉ mua phiên bản đắt hơn của cùng sự gián đoạn đó.
Trước khi phê duyệt bất kỳ thiết kế ba bầu cử viên nào, hãy trả lời bốn câu hỏi: bao nhiêu bầu cử viên mất điện cùng nhau, mất site nào vẫn còn đa số, lãnh đạo ngồi đâu khi đường hầm sập, và site sống sót còn làm được gì. Một câu "không chắc" ở bất kỳ điều nào trong đó nghĩa là cụm chưa có tính sẵn sàng cao. Đó là ba cỗ máy đã gặp may.