Tindak Balas Insiden Kubernetes: Mengendalikan Pod OOMKilled dan Kebolehpercayaan Kluster
Senario
Kluster Kubernetes anda melaporkan lonjakan but semula pod akibat ralat kekurangan memori (OOMKilled). Pelbagai mikrosiber mengalami tamat masa, dan beberapa nod memasuki keadaan tekanan. Pasukan pembangunan mengesahkan pelepasan baru tetapi tidak pasti punca. Sebagai SRE, anda perlu bertindak balas dengan pantas untuk memulihkan perkhidmatan dan mengelakkan kehilangan data.
Gejala
- Pengguna melaporkan ralat 502 atau permintaan lambat.
kubectl get podsmenunjukkan banyak pod dalam statusCrashLoopBackOff.kubectl describe pod <name>menunjukkanExit Code: 137atauReason: OOMKilled.- Metrik nod (cth.,
kubectl top node) menunjukkan penggunaan memori hampir 100%. - Peristiwa Kubernetes (
kubectl get events) menunjukkanFailedKillPodatauOOMKilling.
Diagnosa
- Periksa status pod: Gunakan
kubectl get pods --all-namespaces | grep -E 'CrashLoopBackOff|OOMKilled'. - Lihat peristiwa pod:
kubectl describe pod <pod-name> -n <namespace>dan cariReason: OOMKilled. - Periksa sumber nod:
kubectl top nodesdankubectl describe node <node-name>untuk melihat memori di bawah tekanan. - Lihat log kontena:
kubectl logs <pod-name> --previousuntuk mendapatkan log sebelum ranap. - Periksa konfigurasi sumber:
kubectl get deployment <deployment-name> -o yamldan lihatresources.requestsdanlimits.memory.
Perintah (dengan nota keselamatan)
# Senarai semua pod yang gagal
kubectl get pods --all-namespaces --field-selector=status.phase=Failed | grep -v Completed
# Dapatkan butiran untuk pod tertentu
export POD_NAME=$(kubectl get pods -n production -l app=myapp -o jsonpath='{.items[0].metadata.name}')
kubectl describe pod $POD_NAME -n production
# Lihat log dari kontena sebelumnya (penting)
kubectl logs $POD_NAME -n production --previous
# Dapatkan penggunaan sumber nod (memerlukan metrics-server)
kubectl top node
# Tingkatkan had memori untuk deployment (awas: tidak but semula, tetapi elakkan OOM pada but semula seterusnya)
kubectl set resources deployment myapp -n production --limits=memory=512Mi --requests=memory=256Mi
Nota keselamatan: Sebelum menambah had sumber, sahkan kapasiti nod menggunakan kubectl describe node untuk memeriksa memori boleh diperuntukkan.
Kawalan Risiko
- Tindakan segera: Jika perkhidmatan tidak tersedia, pertimbangkan untuk menambah sementara replika (
kubectl scale deployment myapp --replicas=5) untuk menyebarkan beban. - Hadkan keserentakan: Gunakan PodDisruptionBudget untuk mengelakkan gangguan serentak.
- Jeda auto-rollout: Jika isu disebabkan perubahan baru, hentikan saluran paip CI/CD untuk mengelakkan pelepasan selanjutnya.
- Pemantauan penggera: Sediakan penggera Prometheus untuk peristiwa OOMKilled dan tekanan memori nod.
Undur
- Kenal pasti pelepasan bermasalah: Periksa sejarah pelepasan terkini.
kubectl rollout history deployment/myapp -n production. - Undur ke versi stabil sebelumnya:
kubectl rollout undo deployment/myapp -n production --to-revision=<previous-revision>. - Sahkan undur: Pantau status pod dan kadar ralat.
- Jika undur pantas tidak boleh dilaksanakan, ubah had sumber (seperti di atas) sebagai langkah sementara.
Pengesahan
- Pod harus berjalan tanpa gelung ranap:
kubectl get pods --field-selector=status.phase=Running. - Penggunaan memori nod berkurang (cth.,
kubectl top nodemenunjukkan <80%). - Titik akhir aplikasi mengembalikan 200:
curl -I https://myapp.example.com/health. - Peristiwa berhenti menunjukkan OOM:
kubectl get events --all-namespaces | grep -i OOM.
Bila Menghantar Tiket OpsGlobal
Hantar tiket OpsGlobal jika: - Punca akar tidak jelas (cth., kebocoran memori dalam kod yang memerlukan analisis pembangunan). - Isu berterusan selepas menyesuaikan sumber, menunjukkan keperluan peningkatan skala atau perubahan seni bina. - Anda memerlukan penalaan prestasi peringkat kluster atau tindak balas insiden automatik. - Kegagalan nod atau isu satah kawalan berlaku dan memerlukan kepakaran luaran.
Jurutera OpsGlobal boleh membantu dengan analisis mendalam, melaksanakan corak kebolehpercayaan, dan strategi penskalaan automatik untuk meningkatkan ketahanan kluster.
Senario Penggunaan
Sesuai untuk pasukan yang menyelesaikan isu Kubernetes dan memerlukan aliran kerja yang jelas.
Latar Belakang Masalah
Pelajari cara mengesan, mendiagnosis, dan menyelesaikan pod OOMKilled dalam kluster Kubernetes. Panduan ini merangkumi gejala sebenar, perintah kubectl, kawalan risiko, strategi undur, 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.