Apakah klaster Kubernetes dua situs membutuhkan tiga pemilih etcd?
Tiga node bidang kendali di dua situs VPN tetap kehilangan kuorum saat situs yang lebih besar mati. Hitung pemilih etcd yang sebenarnya dan pilih kerugian yang Anda selamatkan.
Tiga VM bidang kendali terasa seperti tiga peluang untuk selamat dari malam buruk. Kenyataannya tidak, dan jarak antara dua keyakinan itu adalah yang mengubah desain tiga node yang rapi menjadi klaster yang berhenti menerima tulisan saat satu gedung kehilangan listrik. Tautan VPN antar situs membuat mesin saling terjangkau dan menyembunyikan masalah alih-alih memperbaikinya. Suara dihitung per anggota etcd, dan dua dari anggota itu tetap bisa duduk di belakang satu sakelar, satu UPS, dan satu uplink.
Tiga node bidang kendali, satu domain kegagalan
Anda menjalankan kubectl get nodes, melihat tiga entri bidang kendali, dan mencatat klaster sebagai sangat tersedia. Jumlah itu menggambarkan kapasitas yang dapat dijadwalkan, bukan kelangsungan hidup. Dalam kubeadm tanpa etcd eksternal, setiap node bidang kendali juga menghosting satu anggota, jadi tiga node benar-benar memberi Anda tiga pemilih. Apakah para pemilih itu gagal secara independen adalah pertanyaan terpisah yang tidak bisa dijawab daftar node.
Dua VM pada satu hypervisor, dua rak pada satu catu daya, dua uplink dari satu ISP: setiap pasangan adalah satu domain yang memakai dua nama host. Tuliskan penempatannya dan tandai apa yang dibagi setiap pemilih — hypervisor, PDU, sakelar puncak rak, larik penyimpanan, perangkat NAT, konsentrator VPN. Lalu hapus setiap objek bersama di atas kertas dan hitung ulang suara yang tersisa. Klaster yang kehilangan dua pemilih karena satu host gagal selama ini adalah klaster satu pemilih; tidak ada yang pernah menanyakannya.
Apa yang dapat dan tidak dapat dipertahankan oleh pemisahan dua situs
Saat tiga pemilih ditempatkan dua dan satu di dua situs, sisi yang lebih besar mempertahankan kuorum ketika situs lain lenyap dan sisi satu pemilih tidak pernah. Asimetri itu adalah aritmetika, bukan penyetelan. Klaster etcd berbasis mayoritas apa pun yang tersebar tepat di dua situs independen gagal dalam uji "kehilangan salah satu situs dan tetap melakukan komit", karena kedua sisi harus memegang lebih dari separuh suara pada saat yang sama.
Tabel di bawah adalah cara tercepat untuk melihat kegagalan mana yang benar-benar Anda beli. Baca setiap baris seperti ini: jika seluruh baris ini lenyap malam ini, apakah yang selamat masih dapat melakukan komit tulisan?
| 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 |
Mengapa terowongan tidak pernah menambah suara
VPN adalah transportasi, bukan anggota. Ia dapat membuat pemilih jarak jauh terjangkau dan dapat mengubah partisi menjadi sesuatu yang tampak seperti timeout lambat, dan itulah seluruh kontribusinya terhadap kuorum. Yang ditambahkannya adalah biaya, karena setiap komit harus melintasi tautan dan etcd membayar perjalanan pulang-pergi itu pada tulisan yang menyentuh log raft. Jalur yang berkedip mengubah replikasi menjadi percobaan ulang dan pemilihan.
Partisi adalah tempat orang mengharapkan keajaiban, jadi tepatlah tentangnya. Jika tautan putus saat pemimpin lama duduk di sisi satu pemilih, sisi itu tidak dapat melakukan komit dan pemimpin turun begitu batas waktu pemilihan habis, sementara sisi dua pemilih memilih pengganti. Panduan etcd tentang mode kegagalan menjelaskan perilakunya secara gamblang: layanan berlanjut di sisi mayoritas, tidak ada klaster kedua yang dapat ditulisi di sisi terisolasi.
Putuskan pemadaman mana yang Anda beli
Dua ditambah satu adalah desain yang sah ketika Situs A adalah yang utama dan Anda menerima bahwa kehilangannya berarti kehilangan tulisan bidang kendali sampai seseorang bertindak. Yang menjadikannya cacat adalah membiarkan keputusan itu implisit. Tuliskan di runbook: situs mana yang masih dipertahankan bidang kendali Anda, dan apa yang dilakukan operator ketika situs lain mati pukul 03:00.
Jika persyaratannya justru "situs mana pun boleh gagal", penempatan harus memegang mayoritas di setiap situs, dan tiga pemilih di dua situs tidak dapat melakukannya. Anda menambahkan domain ketiga yang benar-benar independen — wilayah kecil di penyedia lain berfungsi jika jalur ke sana stabil — atau terbelah menjadi dua klaster dengan etcd terpisah dan menerima biaya operasional pemisahan itu. Tidak ada jalan pintas saksi yang menghindari ini: etcd tidak punya anggota arbiter ringan, jadi pemilih ketiga adalah anggota penuh dengan tuntutan disk, memori, dan jaringannya sendiri. Menggambar kotak berlabel saksi pada diagram tidak menciptakannya.
Kuorum tidak sama dengan layanan
Kuorum etcd menjaga server API mampu menerima tulisan, dan hanya itu yang dijaganya. Pemeriksaan kesehatan penyeimbang beban, ingress, keterjangkauan CNI melintasi terowongan, zona pemasangan volume, dan replikasi aplikasi masing-masing membutuhkan jawabannya sendiri. Klaster dapat memegang mayoritas bersih dan tetap tidak menyajikan apa pun yang berguna bagi pengguna.
Lalu pastikan keanggotaan yang Anda yakini Anda miliki, karena diagram bergeser:
kubectl -n kube-system get pods -l component=etcd -o wide
kubectl get endpoints kube-apiserver -n default
etcdctl member list -w table
Bandingkan daftar anggota dengan gambar penempatan. Jika dua anggota mengarah ke host yang sama atau rak yang sama, gambarnya yang salah, bukan klasternya, dan mengubah ukuran di sekitar topologi yang keliru hanya membeli versi yang lebih mahal dari pemadaman yang sama.
Sebelum menyetujui desain tiga pemilih mana pun, jawab empat pertanyaan: berapa pemilih yang kehilangan listrik bersama, kehilangan situs siapa yang masih menyisakan mayoritas, di mana pemimpin duduk saat terowongan putus, dan apa yang masih bisa dilakukan situs yang selamat. "Tidak yakin" pada salah satunya berarti klaster belum sangat tersedia. Itu tiga mesin yang beruntung.