Senario
Bayangkan anda mengendalikan kluster Kubernetes dalam pengeluaran, dan tiba-tiba banyak amaran berbunyi: beberapa nod melaporkan MemoryPressure, pod sedang diusir, dan aplikasi menjadi tidak stabil. Ini adalah insiden biasa tetapi menekan. Tanpa playbook yang jelas, anda berisiko memburukkan keadaan. Artikel ini membimbing anda melalui insiden tekanan memori yang realistik, memberikan arahan berguna dan titik keputusan untuk memulihkan perkhidmatan dengan selamat.
Gejala dan Amaran
Gejala biasa termasuk:
- Keadaan nod menunjukkan
MemoryPressureatauNotReady. - Pod berulang kali diusir (status
EvictedatauFailed). - Pemeriksaan kesihatan aplikasi gagal, peningkatan kependaman, atau ralat kepada pengguna.
- Sistem amaran (Prometheus, DataDog, dll.) menghantar notifikasi
MemoryPressure,NodeNotReady, atauPodEvicted.
Aliran Diagnosis
1. Nilai Keadaan Kluster
Mula dengan mendapatkan pandangan global:
kubectl get nodes
kubectl get pods -A -o wide
Jika banyak nod NotReady, masalah mungkin berkaitan dengan satah kawalan. Jika hanya beberapa nod terjejas, fokus pada kehabisan sumber peringkat nod.
2. Periksa Keadaan Nod
Gunakan describe untuk memeriksa status nod:
kubectl describe node <nama-nod>
Lihat bahagian Conditions, terutamanya sama ada MemoryPressure adalah True. Juga semak Allocated resources untuk melihat permintaan/ had versus beban sebenar.
3. Semak Penggunaan Sumber pada Tahap Nod dan Pod
Gunakan arahan top untuk metrik langsung:
kubectl top node
kubectl top pods -A --sort-by='memory'
Kenal pasti pengguna memori tertinggi. Jika penggunaan memori pod jauh melebihi hadnya, kemungkinan berlaku kebocoran memori atau saiz heap yang terlalu besar.
4. Semak Events dan Log Kubelet
Events merekodkan pengusiran:
kubectl get events --sort-by='.lastTimestamp' -A | grep -i evict
Periksa log kubelet (laluan mungkin berbeza mengikut pengedaran):
journalctl -u kubelet -n 100 --no-pager
Log ini selalunya mengandungi Evicting dan MemoryPressure yang menjelaskan keputusan.
Kawalan Risiko Segera dan Mitigasi
1. Hadkan Skop Kesan
- Jangan padam semua replika: Jika aplikasi tanpa keadaan dan berbilang replika, pastikan sekurang-kurangnya satu replika sihat.
- Gunakan PodDisruptionBudgets (PDB): Jika belum dikonfigurasi, buat PDB untuk beban kerja kritikal sebelum sebarang gangguan sukarela (contohnya, drain).
- Simpan sandaran konfigurasi: Sebelum membuat perubahan, simpan definisi sumber semasa untuk membolehkan pengembalian.
2. Kurangkan Tekanan Nod Serta-merta
Jika nod tertentu mengalami tekanan memori, anda boleh:
- Padam pod yang tidak perlu secara manual:
bash kubectl delete pod <nama-pod> -n <namespace> - Pertimbangkan untuk membuang atau menjeda kerja batch berkeutamaan rendah.
- Selamatkan drain nod selepas memastikan PDB wujud:
bash kubectl drain <nama-nod> --ignore-daemonsets --delete-emptydir-dataNota keselamatan: Drain menyebabkan nod tidak boleh dijadualkan. Lakukan semasa waktu lalu lintas rendah dan ingat untuk uncordon kemudian.
3. Laraskan Permintaan dan Had Sumber Beban Kerja
Periksa spesifikasi sumber aplikasi yang bermasalah. Jika requests dan limits tiada, penjadual tidak dapat mengagihkan sumber dengan cekap, dan kubelet mungkin mengusir pod akibat OOM. Kemas kini manifes:
resources:
requests:
memory: "512Mi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "1"
Gunakan kemas kini dan mulakan semula deployment:
kubectl rollout restart deployment/<nama-app> -n <namespace>
4. Skala Naik Kapasiti
Jika kluster penuh, tambah nod atau aktifkan autoscaling. Pada Kubernetes terurus, laraskan kumpulan nod. Dalam persekitaran awan, sahkan kluster autoscaler berfungsi.
Strategi Pengembalian
Jika perubahan yang anda buat memburukkan insiden, kembalikan dengan segera:
- Kembalikan Deployment:
bash kubectl rollout undo deployment/<nama-app> -n <namespace> - Kembalikan konfigurasi: Pulihkan fail konfigurasi kluster atau kubelet yang disandarkan dan mulakan semula komponen terjejas.
Jika anda telah drain nod, aktifkan semula penjadualan selepas mengesahkan isu diselesaikan:
kubectl uncordon <nama-nod>
Pengesahan dan Semakan Selepas Insiden
1. Sahkan Pemulihan Kluster
- Semak status nod:
bash kubectl get nodesPastikan semua nodReadydan bebas daripada tekanan. - Semak status pod:
bash kubectl get pods -A | grep -v RunningPastikan tiada pod tersekat dalamPendingatauEvicted. - Pantau kesihatan aplikasi melalui papan pemuka atau ujian permintaan langsung.
2. Jalankan Postmortem Tanpa Menyalahkan
- Bina semula garis masa dan kenal pasti punca (perubahan deploy, lonjakan trafik, kebocoran memori).
- Gunakan
kubectl describe nodedan metrik sejarah untuk menganalisis trend. - Tentukan tindakan: tetapkan had sumber sesuai, tambah PDB, laraskan ambang amaran, dan pertimbangkan autoscaling kluster.
Bila Perlu Menghubungi OpsGlobal
Pasukan sokongan DevOps/SRE jauh OpsGlobal boleh membantu dalam situasi berikut:
- Kluster mati dan anda kekurangan liputan 24/7 untuk bertindak segera.
- Punca utama adalah kompleks (kernel, kubelet, atau isu penyedia awan) dan pasukan anda memerlukan kepakaran senior.
- Anda perlu memulihkan pengeluaran dengan cepat tanpa risiko kesilapan daripada operasi peringkat rendah.
- Anda ingin membina sistem kebolehpercayaan yang lebih mantap: playbook, penambahbaikan pemantauan, dan latihan kegagalan.
Jika mana-mana berkenaan, serahkan tiket OpsGlobal. Jurutera kami akan bertindak dalam beberapa minit dan memberikan sokongan jauh secara langsung untuk menstabilkan kluster anda.
Kesimpulan
Respons insiden Kubernetes memerlukan pendekatan yang tenang dan sistematik. Senario tekanan memori ini hanyalah satu contoh, tetapi menguasai langkah-langkah ini menyediakan anda untuk banyak isu sumber kluster. Ingat: mitigasi cepat, operasi selamat, dan postmortem menyeluruh adalah tonggak kebolehpercayaan kluster.
Senario Penggunaan
Sesuai untuk pasukan yang menyelesaikan isu Kubernetes dan memerlukan aliran kerja yang jelas.
Latar Belakang Masalah
Panduan praktikal untuk pasukan DevOps dalam mendiagnosis dan bertindak balas terhadap insiden tekanan memori Kubernetes, termasuk arahan langkah demi langkah, kawalan risiko, pengembalian, dan bila perlu menghubungi OpsGlobal.
Langkah Penyelesaian
Sahkan impak dan perubahan terkini, kumpul log, konfigurasi dan metrik, kemudian baiki mengikut risiko.
Contoh Arahan
Gantikan contoh dengan nama sumber sebenar dan simpan kata laluan, token atau kunci dalam pembolehubah persekitaran.
Risiko
Sebelum operasi produksi, semak sandaran, akses, tetingkap perubahan dan pelan rollback.
Pelan Rollback
Simpan konfigurasi dan versi asal; rollback konfigurasi, imej atau perubahan pangkalan data jika metrik tidak normal.
Senarai Serahan
Rekod punca isu, arahan penting, langkah pembaikan, hasil pengesahan dan cadangan susulan.
Perlu bantuan isu teknikal serupa?
Jika pelayan, Kubernetes, Docker, CI/CD, pangkalan data atau pemantauan anda bermasalah, hantar log dan konfigurasi untuk diagnosis jauh.