Jika perlu memperbaiki atau memelihara node, Anda harus menempatkan node ke mode pemeliharaan terlebih dahulu. Tindakan ini akan mengosongkan pod dan workload yang ada dengan baik, kecuali pod sistem penting seperti server API. Mode pemeliharaan juga mencegah node menerima tugas pod baru. Dalam mode pemeliharaan, Anda dapat mengerjakan node tanpa risiko mengganggu traffic pod.
Cara kerjanya
Google Distributed Cloud menyediakan cara untuk menempatkan node ke mode pemeliharaan. Pendekatan ini memungkinkan komponen cluster lain mengetahui dengan benar bahwa node berada dalam mode pemeliharaan. Saat Anda menempatkan node dalam mode pemeliharaan, tidak ada pod tambahan yang dapat dijadwalkan di node, dan pod yang ada akan dihentikan.
Daripada menggunakan mode pemeliharaan, Anda dapat menggunakan perintah Kubernetes secara manual seperti kubectl cordon dan kubectl drain pada node tertentu.
Saat Anda menggunakan proses mode pemeliharaan, Google Distributed Cloud akan melakukan hal berikut:
1.29
Google Distributed Cloud adds the
baremetal.cluster.gke.io/maintenance:NoScheduletaint ke node yang ditentukan untuk mencegah penjadwalan pod baru di node.Google Distributed Cloud menggunakan Eviction API untuk mengeluarkan setiap Pod. Metode pengosongan node ini mematuhi PodDisruptionBudgets (PDB). Anda dapat mengonfigurasi PDB untuk melindungi workload dengan menentukan tingkat gangguan yang dapat ditoleransi untuk sekumpulan pod menggunakan kolom
minAvailabledanmaxUnavailable. Mengosongkan node dengan cara ini memberikan perlindungan yang lebih baik terhadap gangguan workload. Pengosongan node berbasis pengeluaran tersedia sebagai GA untuk rilis 1.29.Batas waktu 20 menit diterapkan untuk memastikan node tidak macet menunggu pod berhenti. Pod mungkin tidak berhenti jika dikonfigurasi untuk menoleransi semua taint atau memiliki finalizer. Google Distributed Cloud mencoba menghentikan semua pod, tetapi jika batas waktu terlampaui, node akan ditempatkan ke mode pemeliharaan. Batas waktu ini mencegah pod yang berjalan memblokir upgrade.
1.28 dan yang lebih lama
Google Distributed Cloud adds the
baremetal.cluster.gke.io/maintenance:NoScheduletaint ke node yang ditentukan untuk mencegah penjadwalan pod baru di node.Google Distributed Cloud menambahkan taint
baremetal.cluster.gke.io/maintenance:NoExecute. Dengan bertindak berdasarkan taintNoExecute,kube-schedulerGoogle Distributed Cloud menghentikan pod dan mengosongkan node. Metode pengosongan node ini tidak mematuhi PDB.Batas waktu 20 menit diterapkan untuk memastikan node tidak macet menunggu pod berhenti. Pod mungkin tidak berhenti jika dikonfigurasi untuk menoleransi semua taint atau memiliki finalizer. Google Distributed Cloud mencoba menghentikan semua pod, tetapi jika batas waktu terlampaui, node akan ditempatkan ke mode pemeliharaan. Batas waktu ini mencegah pod yang berjalan memblokir upgrade.
Pengosongan berbasis pengeluaran
Tidak ada perubahan prosedural yang terkait dengan peralihan ke pengosongan node berbasis pengeluaran dari pengosongan berbasis taint. Peralihan ini hanya memengaruhi logika rekonsiliasi.
Kemampuan ini tidak berada pada tahap peluncuran yang sama untuk semua versi yang didukung:
- 1.29: GA
- 1.28: Tidak tersedia
- 1.16: Tidak tersedia
Urutan pengosongan
Sebelum rilis 1.29, pengosongan node berbasis taint yang dilakukan oleh kube-scheduler Google Distributed Cloud tidak menggunakan algoritma tertentu untuk mengosongkan pod dari node. Dengan pengosongan node berbasis pengeluaran, pod dikeluarkan dalam urutan tertentu berdasarkan prioritas. Prioritas pengeluaran dikaitkan dengan kriteria pod tertentu seperti yang ditunjukkan dalam tabel berikut:
| Urutan pengosongan | Kriteria pod (harus cocok dengan semua) dan |
|---|---|
| 1 |
Pod yang cocok dengan kriteria berikut akan dikeluarkan:
|
| 2 |
Pod yang cocok dengan kriteria berikut akan dikeluarkan:
|
| 3 |
Pod yang cocok dengan kriteria berikut akan dikeluarkan:
Urutan pengeluaran untuk pod yang cocok didasarkan pada
|
| 4 |
Tunggu CSI membersihkan pemasangan PV/PVC setelah semua pod dikeluarkan. Gunakan |
| 5 |
Pod yang cocok dengan kriteria berikut akan dikeluarkan:
Pod ini masih perlu dikosongkan, karena kubelet tidak memberikan kompatibilitas upgrade di tempat. |
Karena pengosongan node berbasis pengeluaran mematuhi PDB, setelan PDB dapat memblokir pengosongan node dalam beberapa situasi. Untuk mengetahui informasi pemecahan masalah tentang pengosongan node pool, lihat Memeriksa alasan node berada dalam status pengosongan dalam waktu lama.
Batas waktu pengosongan berbasis pengeluaran
Saat Anda menempatkan node ke mode pemeliharaan, sistem akan menerapkan batas waktu default 20 menit (1200 detik) untuk mengosongkan node. Saat batas waktu berlalu, semua Pod yang tidak menoleransi mode pemeliharaan akan dikeluarkan dan node akan ditempatkan ke mode pemeliharaan. Mulai versi 1.16, Anda dapat menambahkan anotasi baremetal.cluster.gke.io/maintenance-mode-deadline-seconds ke resource cluster untuk menyesuaikan durasi batas waktu. Misalnya, untuk mengubah
batas waktu menjadi 10 menit, tambahkan
baremetal.cluster.gke.io/maintenance-mode-deadline-seconds: "600" anotasi
ke resource cluster Anda.
Pengosongan berbasis pengeluaran terkadang dapat melebihi batas waktu yang ditentukan oleh maintenance-mode-deadline-seconds. Jika Pod macet dalam status penghentian
setelah batas waktu terlampaui, jangan gunakan kubectl dengan flag
--grace-period=0 --force untuk menghapusnya secara paksa, karena hal ini dapat menyebabkan kerusakan data
atau masalah split-brain untuk aplikasi stateful. Sebagai gantinya, reboot node dengan Pod stateful yang macet.
Jika Anda memerlukan bantuan tambahan, hubungi
Menonaktifkan pengosongan node berbasis pengeluaran
Pengosongan node berbasis pengeluaran diaktifkan secara default untuk cluster pada versi minor 1.29 dan yang lebih baru atau cluster yang diupgrade ke versi minor 1.29 dan yang lebih baru. Jika
pengosongan node berbasis pengeluaran menyebabkan masalah pada upgrade cluster atau
pemeliharaan cluster, Anda dapat kembali ke pengosongan node berbasis taint dengan menambahkan
baremetal.cluster.gke.io/maintenance-mode-ignore-pdb: "" anotasi ke
resource cluster Anda.
Untuk memulihkan perilaku pengosongan node berbasis pengeluaran default, hapus anotasi sepenuhnya. Menetapkan anotasi ke false tidak akan mengaktifkan kembali perilaku default.
Menempatkan node ke mode pemeliharaan
Pilih node yang ingin Anda tempatkan ke mode pemeliharaan dengan menentukan rentang IP untuk node yang dipilih di bagian maintenanceBlocks dalam file konfigurasi cluster. Node yang Anda pilih harus dalam status siap, dan berfungsi di cluster.
Untuk menempatkan node ke mode pemeliharaan:
Edit file konfigurasi cluster untuk memilih node yang ingin Anda tempatkan ke mode pemeliharaan.
Anda dapat mengedit file konfigurasi dengan editor pilihan Anda, atau Anda dapat mengedit resource kustom cluster secara langsung dengan menjalankan perintah berikut:
kubectl -n CLUSTER_NAMESPACE edit cluster CLUSTER_NAMEGanti kode berikut:
CLUSTER_NAMESPACE: namespace cluster.CLUSTER_NAME: nama cluster.
Tambahkan bagian
maintenanceBlockske file konfigurasi cluster untuk menentukan alamat IP tunggal, atau rentang alamat, untuk node yang ingin Anda tempatkan ke mode pemeliharaan.Contoh berikut menunjukkan cara memilih beberapa node dengan menentukan rentang alamat IP:
metadata: name: my-cluster namespace: cluster-my-cluster spec: maintenanceBlocks: cidrBlocks: - 172.16.128.1-172.16.128.64Simpan dan terapkan konfigurasi cluster yang telah diupdate.
Google Distributed Cloud mulai menempatkan node ke mode pemeliharaan.
Jalankan perintah berikut untuk mendapatkan status node di cluster Anda:
kubectl get nodes --kubeconfig=KUBECONFIGOutputnya mirip dengan hal berikut ini:
NAME STATUS ROLES AGE VERSION user-baremetal-01 Ready control-plane 2d22h v1.27.4-gke.1600 user-baremetal-04 Ready worker 2d22h v1.27.4-gke.1600 user-baremetal-05 Ready worker 2d22h v1.27.4-gke.1600 user-baremetal-06 Ready worker 2d22h v1.27.4-gke.1600Perhatikan bahwa node masih dapat dijadwalkan, tetapi taint mencegah pod (tanpa toleransi yang sesuai) dijadwalkan di node.
Jalankan perintah berikut untuk mendapatkan jumlah node dalam mode pemeliharaan:
kubectl get nodepools --kubeconfig ADMIN_KUBECONFIGResponsnya akan terlihat seperti contoh berikut:
NAME READY RECONCILING STALLED UNDERMAINTENANCE UNKNOWN np1 3 0 0 1 0Kolom
UNDERMAINTENANCEdalam contoh ini menunjukkan bahwa satu node berada dalam mode pemeliharaan.Google Distributed Cloud juga menambahkan taint berikut ke node saat ditempatkan ke mode pemeliharaan:
baremetal.cluster.gke.io/maintenance:NoExecutebaremetal.cluster.gke.io/maintenance:NoSchedule
Menghapus node dari mode pemeliharaan
Untuk menghapus node dari mode pemeliharaan:
Edit file konfigurasi cluster untuk menghapus node yang ingin Anda hapus dari mode pemeliharaan.
Anda dapat mengedit file konfigurasi dengan editor pilihan Anda, atau Anda dapat mengedit resource kustom cluster secara langsung dengan menjalankan perintah berikut:
kubectl -n CLUSTER_NAMESPACE edit cluster CLUSTER_NAMEGanti kode berikut:
CLUSTER_NAMESPACE: namespace cluster.CLUSTER_NAME: nama cluster.
Edit alamat IP untuk menghapus node tertentu dari mode pemeliharaan atau hapus bagian
maintenanceBlocksuntuk menghapus semua node dari mode pemeliharaan.Simpan dan terapkan konfigurasi cluster yang telah diupdate.
Gunakan perintah
kubectluntuk memeriksa status node Anda.
Mematikan dan memulai ulang cluster
Jika perlu mematikan seluruh cluster, gunakan petunjuk di bagian berikut untuk mematikan cluster dan mengaktifkannya kembali dengan aman.
Mematikan cluster
Jika Anda mematikan cluster yang mengelola cluster pengguna, Anda harus mematikan semua cluster pengguna terkelola terlebih dahulu. Petunjuk berikut berlaku untuk semua jenis cluster Google Distributed Cloud.
Periksa status semua node cluster:
kubectl get nodes --kubeconfig CLUSTER_KUBECONFIGGanti
CLUSTER_KUBECONFIGdengan jalur file kubeconfig untuk cluster.Outputnya mirip dengan hal berikut ini:
NAME STATUS ROLES AGE VERSION control-0 Ready control-plane 202d v1.27.4-gke.1600 control-1 Ready control-plane 202d v1.27.4-gke.1600 control-2 Ready control-plane 202d v1.27.4-gke.1600 worker-0 Ready worker 202d v1.27.4-gke.1600 worker-1 Ready worker 202d v1.27.4-gke.1600 worker-2 Ready worker 202d v1.27.4-gke.1600 worker-3 Ready worker 202d v1.27.4-gke.1600 worker-4 Ready worker 154d v1.27.4-gke.1600 worker-5 Ready worker 154d v1.27.4-gke.1600 worker-6 Ready worker 154d v1.27.4-gke.1600 worker-7 Ready worker 154d v1.27.4-gke.1600 worker-8 Ready worker 154d v1.27.4-gke.1600 worker-9 Ready worker 154d v1.27.4-gke.1600Jika
STATUSuntuk node bukanReady, sebaiknya pecahkan masalah node dan lanjutkan hanya jika semua nodeReady.Jika Anda mematikan cluster pengguna, periksa status node cluster admin:
kubectl get nodes --kubeconfig ADMIN_KUBECONFIGGanti
ADMIN_KUBECONFIGdengan jalur file kubeconfig untuk cluster pengelola.Langkah-langkah berikutnya memiliki dependensi pada cluster admin. Jika
STATUSuntuk node bukanReady, sebaiknya pecahkan masalah node dan lanjutkan hanya jika semua nodeReady.Periksa kondisi cluster yang ingin Anda matikan:
bmctl check cluster -c CLUSTER_NAME --kubeconfig ADMIN_KUBECONFIGGanti kode berikut:
CLUSTER_NAME: nama cluster yang Anda periksa.ADMIN_KUBECONFIG: jalur file kubeconfig untuk cluster pengelola.
Perbaiki masalah yang dilaporkan sebelum melanjutkan.
Untuk cluster yang Anda matikan, pastikan semua Pod
etcdberjalan:kubectl get pods --kubeconfig CLUSTER_KUBECONFIG -A \ -l component=etcdGanti
CLUSTER_KUBECONFIGdengan jalur file kubeconfig untuk cluster.Outputnya mirip dengan hal berikut ini:
NAMESPACE NAME READY STATUS RESTARTS AGE kube-system etcd-control-0-admin 1/1 Running 0 2d22h kube-system etcd-control-1-admin 1/1 Running 0 2d22h kube-system etcd-control-2-admin 1/1 Running 0 2d22hJika
STATUSuntuk pod bukanRunning, sebaiknya pecahkan masalah pod dan lanjutkan hanya jika semua podRunning.Lakukan pencadangan seperti yang dijelaskan dalam Mencadangkan cluster.
Penting untuk membuat cadangan etcd sebelum mematikan cluster agar cluster Anda dapat dipulihkan jika Anda mengalami masalah saat memulai ulang cluster. Kerusakan Etcd, kegagalan hardware node, masalah konektivitas jaringan, dan kondisi lain yang mungkin terjadi dapat mencegah cluster dimulai ulang dengan benar.
Jika Anda mematikan cluster dengan node pekerja, tempatkan node pekerja ke mode pemeliharaan.
Langkah ini meminimalkan jumlah penulisan ke etcd, yang mengurangi kemungkinan sejumlah besar penulisan etcd perlu direkonsiliasi saat cluster dimulai ulang.
Tempatkan node bidang kontrol ke mode pemeliharaan.
Langkah ini mencegah penulisan yang rusak untuk workload stateful selama node dimatikan.
Matikan node cluster dalam urutan berikut:
- Node pekerja
- Node load balancer bidang kontrol
Node bidang kontrol, dimulai dengan follower etcd dan diakhiri dengan pemimpin etcd
Jika Anda memiliki cluster ketersediaan tinggi (HA), Anda dapat menemukan pemimpin etcd dengan menggunakan SSH untuk terhubung ke setiap node bidang kontrol dan menjalankan perintah
etcdctlberikut:ETCDCTL_API=3 etcdctl \ --cacert /etc/kubernetes/pki/etcd/ca.crt \ --cert /etc/kubernetes/pki/etcd/server.crt \ --key /etc/kubernetes/pki/etcd/server.key \ --write-out=table endpoint statusResponsnya mencakup kolom
IS LEADER, yang menampilkantruejika node adalah pemimpin etcd.
Pada tahap ini, cluster Anda akan dimatikan sepenuhnya. Setelah melakukan pemeliharaan yang diperlukan, Anda dapat memulai ulang cluster seperti yang dijelaskan di bagian berikutnya.
Memulai ulang cluster
Gunakan langkah-langkah berikut untuk memulai ulang cluster yang telah dimatikan sepenuhnya.
Aktifkan mesin node dalam urutan terbalik dari urutan pematian.
Hapus node bidang kontrol dari mode pemeliharaan.
Untuk mengetahui petunjuknya, lihat Menghapus node dari mode pemeliharaan.
Hapus node pekerja dari mode pemeliharaan.
Jalankan health check cluster untuk memastikan cluster beroperasi dengan benar:
bmctl check cluster -c CLUSTER_NAME --kubeconfig ADMIN_KUBECONFIGJika masalah, seperti crashlooping etcd, mencegah cluster dimulai ulang dengan benar, coba pulihkan cluster dari cadangan baik terakhir yang diketahui. Untuk mengetahui petunjuknya, lihat Memulihkan cluster.
Mode pemeliharaan dan penagihan
Penagihan untuk Google Distributed Cloud didasarkan pada jumlah vCPU yang dimiliki cluster Anda untuk Node yang dapat menjalankan workload. Saat Anda menempatkan Node ke mode pemeliharaan, taint NoExecute dan NoSchedule akan ditambahkan ke Node, tetapi tidak menonaktifkan penagihan. Setelah menempatkan node ke mode pemeliharaan, pisahkan node
(kubectl cordon NODE_NAME) untuk menandainya sebagai tidak dapat dijadwalkan. Setelah node ditandai sebagai tidak dapat dijadwalkan, Node dan vCPU terkait akan dikecualikan dari penagihan.
Seperti yang dijelaskan di halaman harga, Anda dapat menggunakan
kubectl untuk melihat kapasitas vCPU (digunakan untuk penagihan) setiap cluster pengguna Anda. Perintah ini tidak mempertimbangkan apakah Node dapat dijadwalkan atau tidak, tetapi hanya memberikan jumlah vCPU per node.
Untuk mengidentifikasi jumlah vCPU per node untuk cluster pengguna Anda:
kubectl get nodes \
--kubeconfig USER_KUBECONFIG \
-o=jsonpath="{range .items[*]}{.metadata.name}{\"\t\"} \
{.status.capacity.cpu}{\"\n\"}{end}"
Ganti USER_KUBECONFIG dengan jalur file kubeconfig untuk cluster pengguna Anda.