Saat Anda perlu memperbaiki atau memelihara node, Anda harus memasukkan node ke mode pemeliharaan terlebih dahulu. Tindakan ini akan menghentikan pod dan workload yang ada dengan benar, 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 pada node, dan pod yang ada akan dihentikan.
Daripada menggunakan mode pemeliharaan, Anda dapat menggunakan perintah Kubernetes secara manual seperti kubectl cordon
dan kubectl drain
di node tertentu.
Saat Anda menggunakan proses mode pemeliharaan, Google Distributed Cloud akan melakukan hal berikut:
1,29
Google Distributed Cloud menambahkan
baremetal.cluster.gke.io/maintenance:NoSchedule
taint ke node yang ditentukan untuk mencegah penjadwalan pod baru di node tersebut.Google Distributed Cloud menggunakan Eviction API untuk mengeluarkan setiap Pod. Metode pengurasan node ini mematuhi PodDisruptionBudgets (PDB). Anda dapat mengonfigurasi PDB untuk melindungi workload dengan menentukan tingkat gangguan yang dapat ditoleransi untuk sekumpulan pod menggunakan kolom
minAvailable
danmaxUnavailable
. Menguras node dengan cara ini memberikan perlindungan yang lebih baik terhadap gangguan workload. Pengurasan node berbasis pengusiran tersedia sebagai GA untuk rilis 1.29.Waktu tunggu 20 menit diterapkan untuk memastikan node tidak macet saat menunggu pod berhenti. Pod mungkin tidak berhenti jika dikonfigurasi untuk mentoleransi semua taint atau memiliki finalizer. Google Distributed Cloud mencoba menghentikan semua pod, tetapi jika waktu tunggu habis, node akan dimasukkan ke mode pemeliharaan. Waktu tunggu ini mencegah pod yang sedang berjalan memblokir upgrade.
1.28 dan yang lebih lama
Google Distributed Cloud menambahkan
baremetal.cluster.gke.io/maintenance:NoSchedule
taint ke node yang ditentukan untuk mencegah penjadwalan pod baru di node tersebut.Google Distributed Cloud menambahkan taint
baremetal.cluster.gke.io/maintenance:NoExecute
. Dengan menindaklanjuti taintNoExecute
,kube-scheduler
Google Distributed Cloud akan menghentikan pod dan menguras node. Metode pengurasan node ini tidak mematuhi PDB.Waktu tunggu 20 menit diterapkan untuk memastikan node tidak macet saat menunggu pod berhenti. Pod mungkin tidak berhenti jika dikonfigurasi untuk mentoleransi semua taint atau memiliki finalizer. Google Distributed Cloud mencoba menghentikan semua pod, tetapi jika waktu tunggu habis, node akan dimasukkan ke mode pemeliharaan. Waktu tunggu ini mencegah pod yang sedang berjalan memblokir upgrade.
Pengurasan berbasis pengusiran
Tidak ada perubahan prosedural yang terkait dengan peralihan ke pengosongan node berbasis pengusiran dari pengosongan berbasis taint. Pengalihan 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, pengurasan node berbasis taint yang dilakukan oleh
Google Distributed Cloud kube-scheduler
tidak menggunakan algoritma
tertentu untuk menguras pod dari node. Dengan pengurasan node berbasis penghapusan, pod akan dihapus dalam urutan tertentu berdasarkan prioritas. Prioritas pengusiran
dikaitkan dengan kriteria pod tertentu seperti yang ditunjukkan dalam tabel berikut:
Urutan pengosongan | Kriteria pod (harus cocok 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:
Perintah pengusiran untuk pod yang cocok didasarkan pada
|
4 |
Tunggu hingga CSI membersihkan pemasangan PV/PVC setelah semua pod
dikeluarkan. Gunakan |
5 |
Pod yang cocok dengan kriteria berikut akan dikeluarkan:
Pod ini masih perlu dikuras, karena kubelet tidak menyediakan kompatibilitas upgrade di tempat. |
Karena pengurasan node berbasis penghapusan menghormati PDB, setelan PDB dapat memblokir pengurasan node dalam beberapa keadaan. Untuk mengetahui informasi pemecahan masalah tentang pengurasan node pool, lihat Memeriksa alasan node berada dalam status pengurasan dalam waktu yang lama.
Menonaktifkan pengosongan node berbasis pengusiran
Pengurasan node berbasis penghapusan 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 pengusiran menyebabkan masalah pada upgrade cluster atau
pemeliharaan cluster, Anda dapat kembali ke pengosongan node berbasis taint dengan menambahkan anotasi
baremetal.cluster.gke.io/maintenance-mode-ignore-pdb: ""
ke resource
cluster.
Untuk memulihkan perilaku pengurasan node berbasis pengusiran default, hapus anotasi sepenuhnya. Menyetel anotasi ke false
tidak akan mengaktifkan kembali
perilaku default.
Menempatkan node ke mode pemeliharaan
Pilih node yang ingin Anda masukkan ke mode pemeliharaan dengan menentukan rentang IP
untuk node yang dipilih di bagian maintenanceBlocks
dalam file konfigurasi
cluster Anda. Node yang Anda pilih harus dalam status siap, dan berfungsi di cluster.
Untuk mengaktifkan mode pemeliharaan pada node:
Edit file konfigurasi cluster untuk memilih node yang ingin Anda masukkan 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_NAME
Ganti kode berikut:
CLUSTER_NAMESPACE
: namespace cluster.CLUSTER_NAME
: nama cluster.
Tambahkan bagian
maintenanceBlocks
ke file konfigurasi cluster untuk menentukan satu alamat IP, atau rentang alamat, untuk node yang ingin Anda masukkan 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.64
Simpan 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=KUBECONFIG
Outputnya 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.1600
Perhatikan bahwa node masih dapat dijadwalkan, tetapi taint mencegah pod apa pun (tanpa toleransi yang sesuai) dijadwalkan di node.
Jalankan perintah berikut untuk mendapatkan jumlah node dalam mode pemeliharaan:
kubectl get nodepools --kubeconfig ADMIN_KUBECONFIG
Responsnya akan terlihat seperti contoh berikut:
NAME READY RECONCILING STALLED UNDERMAINTENANCE UNKNOWN np1 3 0 0 1 0
Kolom
UNDERMAINTENANCE
dalam contoh ini menunjukkan bahwa satu node dalam mode pemeliharaan.Google Distributed Cloud juga menambahkan taint berikut ke node saat node tersebut ditempatkan ke mode pemeliharaan:
baremetal.cluster.gke.io/maintenance:NoExecute
baremetal.cluster.gke.io/maintenance:NoSchedule
Menghapus node dari mode pemeliharaan
Untuk mengeluarkan node dari mode pemeliharaan:
Edit file konfigurasi cluster untuk mengeluarkan 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_NAME
Ganti kode berikut:
CLUSTER_NAMESPACE
: namespace cluster.CLUSTER_NAME
: nama cluster.
Edit alamat IP untuk menghapus node tertentu dari mode pemeliharaan atau hapus bagian
maintenanceBlocks
untuk menghapus semua node dari mode pemeliharaan.Simpan dan terapkan konfigurasi cluster yang telah diupdate.
Gunakan perintah
kubectl
untuk memeriksa status node Anda.
Mematikan dan memulai ulang cluster
Jika perlu menonaktifkan seluruh cluster, gunakan petunjuk di bagian berikut untuk mematikan cluster dan mengaktifkannya kembali dengan aman.
Menghentikan cluster
Jika Anda menonaktifkan cluster yang mengelola cluster pengguna, Anda harus menonaktifkan 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_KUBECONFIG
Ganti
CLUSTER_KUBECONFIG
dengan 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.1600
Jika
STATUS
untuk node bukanReady
, sebaiknya Anda memecahkan masalah node dan melanjutkan hanya jika semua nodeReady
.Jika Anda mematikan cluster pengguna, periksa status node cluster admin:
kubectl get nodes --kubeconfig ADMIN_KUBECONFIG
Ganti
ADMIN_KUBECONFIG
dengan jalur file kubeconfig untuk cluster pengelolaan.Langkah-langkah berikutnya memiliki dependensi pada cluster admin. Jika
STATUS
untuk node bukanReady
, sebaiknya Anda memecahkan masalah node dan melanjutkan hanya jika semua node berstatusReady
.Periksa kondisi cluster yang ingin Anda nonaktifkan:
bmctl check cluster -c CLUSTER_NAME --kubeconfig ADMIN_KUBECONFIG
Ganti 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
etcd
sedang berjalan:kubectl get pods --kubeconfig CLUSTER_KUBECONFIG -A \ -l component=etcd
Ganti
CLUSTER_KUBECONFIG
dengan 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 2d22h
Jika
STATUS
untuk pod bukanRunning
, sebaiknya Anda memecahkan masalah pod dan melanjutkan hanya jika semua pod berstatusRunning
.Lakukan pencadangan seperti yang dijelaskan dalam Mencadangkan cluster.
Anda harus membuat cadangan etcd sebelum mematikan cluster agar cluster dapat dipulihkan jika Anda mengalami masalah saat memulai ulang cluster. Kerusakan etcd, kegagalan hardware node, masalah konektivitas jaringan, dan kemungkinan kondisi lainnya dapat mencegah cluster dimulai ulang dengan benar.
Jika Anda mematikan cluster dengan node pekerja, masukkan node pekerja ke mode pemeliharaan.
Langkah ini meminimalkan jumlah penulisan ke etcd, yang mengurangi kemungkinan sejumlah besar penulisan etcd perlu disesuaikan saat cluster dimulai ulang.
Aktifkan mode pemeliharaan pada node bidang kontrol.
Langkah ini mencegah penulisan yang rusak untuk workload stateful selama penonaktifan node.
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 memiliki cluster dengan ketersediaan tinggi (HA), Anda dapat menemukan pemimpin etcd dengan menggunakan SSH untuk terhubung ke setiap node bidang kontrol dan menjalankan perintah
etcdctl
berikut: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 status
Respons mencakup kolom
IS LEADER
, yang menampilkantrue
jika 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.
Mulai ulang cluster
Gunakan langkah-langkah berikut untuk memulai ulang cluster yang telah dimatikan sepenuhnya.
Nyalakan mesin node dalam urutan terbalik dari urutan mematikan daya.
Keluarkan node bidang kontrol dari mode pemeliharaan.
Untuk mengetahui petunjuknya, lihat Menghapus node dari mode pemeliharaan.
Keluarkan node pekerja dari mode pemeliharaan.
Jalankan health check cluster untuk memastikan cluster beroperasi dengan benar:
bmctl check cluster -c CLUSTER_NAME --kubeconfig ADMIN_KUBECONFIG
Jika masalah, seperti etcd crashlooping, mencegah cluster dimulai ulang dengan benar, coba pulihkan cluster dari cadangan terakhir yang diketahui baik. Untuk mengetahui petunjuknya, lihat Memulihkan cluster.
Mode penagihan dan pemeliharaan
Penagihan untuk Google Distributed Cloud didasarkan pada jumlah vCPU yang dimiliki cluster Anda untuk Node yang dapat menjalankan beban kerja. Saat Anda mengaktifkan mode pemeliharaan Node, 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. Perintah ini tidak mempertimbangkan apakah Node dapat dijadwalkan atau tidak, 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.