Topik ini menjelaskan prosedur diagnostik untuk pod serta cara memecahkan masalah kesalahan pod. Topik ini juga memberikan jawaban atas beberapa pertanyaan umum terkait pod.
Untuk mempelajari cara memecahkan masalah pod di konsol, lihat Memecahkan Masalah di Konsol. Di konsol, Anda dapat melihat status, informasi dasar, konfigurasi, peristiwa, dan log pod, menggunakan terminal untuk mengakses kontainer, serta mengaktifkan diagnostik pod.
Prosedur Diagnostik
Jika pod tidak berjalan secara normal, Anda dapat mengidentifikasi penyebabnya dengan memeriksa peristiwa, log, dan konfigurasi pod. Gambar berikut menunjukkan prosedurnya.
Fase 1: Masalah Penjadwalan
Pod gagal dijadwalkan
Jika pod tetap dalam keadaan Pending untuk waktu yang lama, itu berarti pod gagal dijadwalkan. Tabel berikut menjelaskan kemungkinan penyebabnya.
Pesan Kesalahan | Deskripsi | Solusi yang Disarankan |
| Kluster tidak memiliki node yang tersedia untuk penjadwalan pod. |
|
| Kluster tidak memiliki node yang dapat memenuhi permintaan CPU atau memori pod. | Di halaman Nodes, lihat penggunaan pod, CPU, dan memory serta periksa pemanfaatan sumber daya kluster. Catatan Ketika pemanfaatan CPU dan memori node dipertahankan pada tingkat rendah, menjadwalkan pod baru ke node tidak akan menghabiskan sumber daya node. Namun, penjadwal masih memeriksa apakah pod baru akan menyebabkan kekurangan sumber daya selama jam sibuk dan mencoba menghindari penjadwalan sumber daya yang tidak tepat. Ketika sumber daya CPU atau memori dalam kluster habis, gunakan metode berikut:
|
| Kluster tidak memiliki node yang sesuai dengan aturan afinitas node (nodeSelector) atau aturan afinitas dan anti-afinitas (podAffinity dan podAntiAffinity) dari pod. |
|
| Volume yang digunakan oleh pod mengalami konflik afinitas node karena volume disk tidak dapat dipasang lintas zona. Akibatnya, pod gagal dijadwalkan. |
|
| Jenis disk tidak didukung oleh Instance Elastic Compute Service (ECS). | Lihat Ikhtisar Keluarga Instance dan periksa jenis disk yang didukung oleh instance ECS. Pasang disk yang didukung oleh instance ECS ke pod. |
| Pod gagal dijadwalkan ke node yang diinginkan karena node memiliki taint. |
|
| Node tidak memiliki ruang penyimpanan sementara yang cukup. |
|
| Persistent Volume Claim (PVC) gagal terikat ke pod. | Periksa apakah PVC atau PV yang ditentukan untuk pod telah dibuat. Anda dapat menjalankan perintah |
Pod sudah dijadwalkan ke node
Jika pod sudah dijadwalkan ke node tetapi tetap dalam keadaan Pending, lihat solusi berikut.
Periksa apakah pod dikonfigurasikan dengan
hostPort: Jika pod dikonfigurasikan denganhostPort, hanya satu pod yang menggunakanhostPortyang dapat berjalan di setiap node. Oleh karena itu, nilaiReplicasdalam Deployment atau ReplicationController tidak boleh melebihi jumlah node dalam kluster. Jika port host node digunakan oleh aplikasi lain, pod gagal dijadwalkan ke node.Pengaturan
hostPortmeningkatkan kompleksitas manajemen dan penjadwalan pod. Kami merekomendasikan agar Anda menggunakan Services untuk mengakses pod. Untuk informasi lebih lanjut, lihat Services.Jika pod tidak dikonfigurasikan dengan
hostPort, lakukan langkah-langkah berikut.Jalankan perintah
kubectl describe pod <pod-name>untuk melihat peristiwa pod dan memecahkan masalah. Peristiwa mungkin menampilkan penyebab kegagalan startup pod, seperti kegagalan penarikan gambar, sumber daya tidak mencukupi, batasan karena kebijakan keamanan, atau kesalahan konfigurasi.Jika Anda gagal menemukan penyebab dalam peristiwa, periksa log kubelet di node. Anda dapat menjalankan perintah
grep -i <pod name> /var/log/messages* | lessuntuk memeriksa entri log yang berisi nama pod dalam file log sistem (/var/log/messages*).
Fase 2: Masalah Penarikan Gambar
Pesan Kesalahan | Deskripsi | Solusi yang Disarankan |
| Akses ke repositori gambar ditolak karena | Periksa apakah Secret yang ditentukan dalam parameter Jika Container Registry digunakan, Anda dapat menggunakan komponen aliyun-acr-credential-helper untuk menarik gambar tanpa kata sandi. Untuk informasi lebih lanjut, lihat Gunakan komponen aliyun-acr-credential-helper untuk menarik gambar tanpa menggunakan secret. |
| Gagal mengurai alamat gambar saat menarik gambar dari repositori gambar yang ditentukan melalui HTTP. |
|
| Node tidak memiliki ruang disk yang cukup. | Lihat Metode untuk terhubung ke instance ECS dan masuk ke node pod, dan jalankan perintah |
| Repositori gambar pihak ketiga menggunakan sertifikat yang ditandatangani dan diterbitkan oleh otoritas sertifikat yang tidak dikenal atau tidak tepercaya. |
|
| Operasi dibatalkan karena file gambar terlalu besar. Kubernetes memiliki batas waktu default untuk penarikan gambar. Jika kemajuan penarikan gambar tidak diperbarui dalam periode waktu tertentu, Kubernetes menganggap terjadi kesalahan atau tidak ada respons yang dikembalikan dan kemudian membatalkan operasi. |
|
| Gagal terhubung ke repositori gambar. |
|
| DockerHub menetapkan batas laju pada permintaan penarikan gambar. | Unggah gambar ke Container Registry dan tarik gambar dari Container Registry. |
| Batas atas penarikan gambar menggunakan kubelet mungkin telah tercapai. | Lihat Sesuaikan parameter kubelet dari pool node dan ubah QPS maksimum repositori gambar (registryPullQPS) dan ukuran maksimum burst penarikan gambar (registryBurst). |
Fase 3: Masalah Startup
Pod dalam keadaan Init
Pesan Kesalahan | Deskripsi | Solusi yang Disarankan |
Pod tetap dalam keadaan | Pod berisi M kontainer Init. N kontainer telah dimulai. M-N kontainer Init belum dimulai. |
Untuk informasi lebih lanjut tentang kontainer init, lihat Debug kontainer init. |
Pod tetap dalam keadaan | Kontainer Init dalam pod gagal dimulai. | |
Pod tetap dalam keadaan | Kontainer Init dalam pod gagal dimulai dan terus-menerus restart. |
Pod sedang dibuat (Creating)
Pesan Kesalahan | Deskripsi | Solusi yang Disarankan |
| Kesalahan ini diharapkan karena desain plugin jaringan Flannel. | Perbarui Flannel ke v0.15.1.11-7e95fe23-aliyun atau versi lebih baru. Untuk informasi lebih lanjut, lihat Flannel. |
Jika kluster menjalankan versi Kubernetes lebih lama dari 1.20 dan pod terus-menerus restart atau pod yang dibuat oleh CronJob menyelesaikan tugas dan keluar setelah periode waktu singkat, kebocoran IP mungkin terjadi. | Perbarui versi Kubernetes kluster ke 1.20 atau lebih baru. Kami merekomendasikan agar Anda memperbarui ke versi terbaru. Untuk informasi lebih lanjut, lihat Tingkatkan Kluster ACK secara Manual. | |
containerd dan runC memiliki cacat. | Untuk informasi lebih lanjut, lihat Apa yang harus saya lakukan jika pod gagal dimulai dan muncul pesan kesalahan "no IP addresses available in range"? | |
| Status basis data internal yang dikelola oleh Terway dan digunakan untuk melacak dan mengelola elastic network interfaces (ENI) pada node pod tidak konsisten dengan konfigurasi perangkat jaringan aktual. Akibatnya, ENI gagal dialokasikan. |
|
| Terway gagal meminta alamat IP dari vSwitch. |
|
Pod gagal memulai (CrashLoopBackOff)
Pesan Kesalahan | Deskripsi | Solusi yang Disarankan |
Log menampilkan |
| |
Informasi peristiwa menampilkan | Kegagalan pemeriksaan kesehatan terjadi. | Periksa kebijakan pemeriksaan liveness pod. Pastikan hasil pemeriksaan liveness dapat menunjukkan status aktual aplikasi yang berjalan di kontainer pod. |
Log pod menampilkan | Ruang disk tidak mencukupi. |
|
Pod gagal memulai dan tidak ada peristiwa yang dihasilkan | Batas sumber daya pod lebih rendah daripada sumber daya yang diminta oleh pod. Akibatnya, kontainer dalam pod gagal memulai. | Periksa konfigurasi sumber daya pod. Anda dapat mengaktifkan profil sumber daya untuk mendapatkan permintaan sumber daya yang disarankan dan batas sumber daya. |
Log pod menampilkan | Kontainer dalam pod mengalami konflik port. |
|
Log pod menampilkan | Beban kerja dipasang dengan Secret. Nilai kunci Secret tidak dienkripsi menggunakan Base64. |
|
Masalah bisnis ada. | Tentukan penyebab berdasarkan log pod. | |
Fase 4: Masalah Operasi Pod
OOM
Jika penggunaan memori kontainer dalam kluster melebihi batas memori yang ditentukan, kontainer mungkin dihentikan dan memicu peristiwa OOM, yang menyebabkan kontainer keluar. Untuk informasi lebih lanjut tentang peristiwa OOM, lihat Alokasikan sumber daya memori ke kontainer dan pod.
Jika proses yang dihentikan menyebabkan kontainer macet, kontainer mungkin restart.
Jika terjadi kesalahan OOM, masuk ke konsol dan navigasikan ke halaman detail pod. Di tab Events, Anda dapat melihat peristiwa OOM berikut: pod was OOM killed.
Jika kluster dikonfigurasikan dengan aturan peringatan untuk pengecualian replika kontainer, Anda akan menerima peringatan saat peristiwa OOM terjadi. Untuk informasi lebih lanjut, lihat Manajemen Peringatan.
Level OOM | Deskripsi | Solusi yang Disarankan |
Level OS | Log kernel ( | Penyebab yang mungkin adalah kekurangan memori global sistem, kekurangan memori node, atau kekurangan memori sistem buddy selama fragmentasi memori. Untuk informasi lebih lanjut tentang penyebab kekurangan memori, lihat Kemungkinan Penyebab. Untuk informasi lebih lanjut tentang solusi, lihat Solusi. |
Level cgroup | Log kernel ( | Jika proses berjalan normal, tingkatkan batas memori pod sesuai. Pastikan penggunaan memori aktual pod tidak melebihi 80% dari batas memori. Untuk informasi lebih lanjut, lihat Ubah batas atas dan bawah sumber daya CPU dan memori untuk pod. Anda dapat mengaktifkan profil sumber daya untuk mendapatkan permintaan sumber daya yang disarankan dan batas sumber daya untuk kontainer. |
Terminating
Penyebab yang Mungkin | Deskripsi | Solusi yang Disarankan |
Node tidak normal dan dalam keadaan NotReady. | Node NotReady secara otomatis dihapus setelah pulih. | |
Finalizers dikonfigurasikan untuk pod. | Jika finalizers dikonfigurasikan untuk pod, Kubernetes melakukan operasi pembersihan yang ditentukan oleh finalizers sebelum menghapus pod. Jika tidak ada respons yang dikembalikan untuk operasi pembersihan, pod tetap dalam keadaan Terminating. | Jalankan perintah |
Hooks preStop pod tidak valid. | Jika hooks preStop dikonfigurasikan untuk pod, Kubernetes melakukan operasi yang ditentukan oleh hooks preStop sebelum menghentikan pod. Pod berada pada tahap preStop dan akan memasuki keadaan Terminating. | Jalankan perintah |
Pod dikonfigurasikan dengan periode shutdown yang aman. | Jika pod dikonfigurasikan dengan periode shutdown yang aman ( | Setelah kontainer keluar dengan aman, Kubernetes menghapus pod. |
Kontainer tidak merespons. | Setelah Anda memulai permintaan untuk menghentikan atau menghapus pod, Kubernetes mengirim sinyal |
|
Evicted
Penyebab yang Mungkin | Deskripsi | Solusi yang Disarankan |
Node tidak memiliki sumber daya yang cukup, seperti memori atau ruang disk. Akibatnya, kubelet mengusir satu atau lebih pod di node untuk mereklaim sumber daya. | Node mungkin tidak memiliki memori, ruang disk, atau PIDs yang cukup. Jalankan perintah
|
|
Pengusiran yang tidak terduga terjadi. | Node yang menampung pod memiliki taint NoExecute. Akibatnya, pengusiran yang tidak terduga terjadi. | Jalankan perintah |
Pod tidak diusir sesuai harapan. |
| Dalam kluster kecil yang berisi tidak lebih dari 50 node, jika lebih dari 55% node mati, pengusiran pod dihentikan. Untuk informasi lebih lanjut, lihat Batas Laju pada Pengusiran. |
Dalam kluster besar yang berisi lebih dari 50 node, jika rasio node tidak sehat terhadap total node melebihi nilai | ||
Pod masih sering dijadwalkan ke node aslinya setelah diusir. | Pod diusir dari node berdasarkan penggunaan sumber daya node. Aturan penjadwalan pod bergantung pada sumber daya yang dialokasikan pada node. Pod yang diusir mungkin dijadwalkan kembali ke node aslinya. | Periksa apakah permintaan sumber daya pod dikonfigurasikan dengan benar berdasarkan sumber daya yang dapat dialokasikan pada node. Untuk informasi lebih lanjut, lihat Ubah batas atas dan bawah sumber daya CPU dan memori untuk pod. Anda dapat mengaktifkan profil sumber daya untuk mendapatkan permintaan sumber daya yang disarankan dan batas sumber daya untuk kontainer. |
Completed
Ketika pod dalam keadaan Completed, semua kontainer dalam pod telah dimulai dan semua proses dalam kontainer telah berhasil keluar. Keadaan Completed biasanya cocok untuk Job dan kontainer Init.
Pertanyaan yang Sering Diajukan Lainnya
Pod tetap dalam keadaan Running tetapi tidak berjalan normal
Jika file YAML pod mengandung kesalahan, pod mungkin tetap dalam keadaan Running tetapi tidak berjalan normal. Untuk mengatasi masalah ini, lakukan langkah-langkah berikut.
Periksa konfigurasi pod dan periksa apakah kontainer dalam pod dikonfigurasikan sesuai harapan.
Gunakan metode berikut untuk memeriksa apakah kunci variabel lingkungan mengandung kesalahan ejaan.
Jika kunci variabel lingkungan mengandung kesalahan ejaan, misalnya,
commanddieja sebagaicommnd, kluster dapat mengabaikan kesalahan ejaan dan membuat pod berdasarkan file YAML. Namun, kontainer tidak dapat menjalankan perintah yang ditentukan dalam file YAML.Contoh berikut menjelaskan cara mengidentifikasi kesalahan ejaan jika Anda mengeja
commandsebagaicommnd.Tambahkan
--validatesebelum perintahkubectl apply -fdan jalankan perintahkubectl apply --validate -f XXX.yaml.Jika ada kesalahan ejaan, pesan
XXX] unknown field: commnd XXX] this may be a false alarm, see https://gXXXb.XXX/6842pods/testakan ditampilkan.Jalankan perintah berikut untuk membandingkan file pod.yaml yang Anda periksa dengan file YAML yang digunakan untuk membuat pod.
CatatanGanti
[$Pod]dengan nama pod abnormal. Anda dapat menjalankan perintahkubectl get podsuntuk mendapatkan nama.kubectl get pods [$Pod] -o yaml > pod.yamlJika file pod.yaml berisi lebih banyak baris daripada file YAML asli yang digunakan untuk membuat pod, ini berarti pod dibuat sesuai harapan.
Jika baris perintah YAML untuk membuat pod tidak ditemukan dalam file pod.yaml, ini berarti file YAML asli mengandung kesalahan ejaan.
Periksa log pod dan pecahkan masalah berdasarkan data log.
Anda dapat masuk ke kontainer pod menggunakan terminal dan periksa file lokal dalam kontainer.
Masalah pemutusan jaringan kadang-kadang terjadi ketika pod mengakses database
Jika masalah pemutusan jaringan kadang-kadang terjadi ketika pod dalam kluster ACK mengakses database, Anda dapat melakukan operasi berikut untuk memecahkan masalah.
1. Periksa pod
Lihat peristiwa pod dan periksa peristiwa koneksi tidak stabil, seperti peristiwa terkait pengecualian jaringan, restart, dan sumber daya tidak mencukupi.
Lihat log pod dan periksa kesalahan koneksi database, seperti waktu habis koneksi, kegagalan autentikasi, atau rekoneksi.
Lihat penggunaan CPU dan memori pod. Pastikan aplikasi atau driver database tidak keluar secara tidak normal karena sumber daya tidak mencukupi.
Lihat permintaan sumber daya dan batas pod. Pastikan pod memiliki sumber daya CPU dan memori yang cukup.
2. Periksa node
Periksa penggunaan sumber daya node dan pastikan sumber daya seperti memori dan ruang disk mencukupi. Untuk informasi lebih lanjut, lihat Pantau node.
Uji apakah pemutusan jaringan kadang-kadang terjadi antara node dan database.
3. Periksa database
Periksa status dan metrik performa database untuk memastikan tidak ada restart atau hambatan performa.
Lihat jumlah koneksi abnormal dan periksa pengaturan periode timeout, serta ubah pengaturan berdasarkan kebutuhan bisnis Anda.
Analisis log database terkait pemutusan dari database.
4. Periksa status komponen kluster
Penyimpangan komponen kluster memengaruhi komunikasi antara pod dan komponen lain dalam kluster. Jalankan perintah berikut untuk memeriksa status komponen dalam kluster ACK:
kubectl get pod -n kube-system # Lihat status komponen.
Periksa komponen jaringan:
CoreDNS: Periksa status dan log komponen. Pastikan pod dapat mengurai alamat layanan database.
Flannel: Periksa status dan log kube-flannel.
Terway: Periksa status dan log terway-eniip.
5. Analisis lalu lintas jaringan
Anda dapat menggunakan tcpdump untuk menangkap paket dan menganalisis lalu lintas jaringan untuk membantu menemukan penyebabnya.
Jalankan perintah berikut untuk mengidentifikasi pod dan node tempat masalah pemutusan database terjadi.
kubectl get pod -n [namespace] -o wideMasuk ke node. Untuk informasi lebih lanjut, lihat Metode untuk terhubung ke instance ECS.
Jalankan perintah berikut untuk menanyakan PID kontainer berdasarkan versi Kubernetes yang berbeda.
containerd (Versi Kubernetes lebih baru dari 1.22)
Jalankan perintah berikut untuk melihat
CONTAINER:crictl ps |grep <Nama Pod atau kata kunci>Output yang Diharapkan:
CONTAINER IMAGE CREATED STATE a1a214d2***** 35d28df4***** 2 days ago RunningTentukan parameter
CONTAINER IDdan jalankan perintah berikut untuk melihat PID kontainer:crictl inspect a1a214d2***** |grep -i PIDOutput yang Diharapkan:
"pid": 2309838, # PID kontainer. "pid": 1 "type": "pid"
Docker (Kubernetes 1.22 dan sebelumnya)
Jalankan perintah berikut untuk melihat
CONTAINER ID:docker ps | grep <Nama Pod atau kata kunci>Output yang Diharapkan:
CONTAINER ID IMAGE COMMAND a1a214d2***** 35d28df4***** "/nginxTentukan parameter
CONTAINER IDdan jalankan perintah berikut untuk melihat PID kontainer:docker inspect a1a214d2***** |grep -i PIDOutput yang Diharapkan:
"Pid": 2309838, # PID kontainer. "PidMode": "", "PidsLimit": null,
Jalankan perintah penangkapan paket.
Jalankan perintah berikut berdasarkan PID kontainer untuk menangkap paket yang ditransmisikan antara pod dan database:
nsenter -t <Container PID> tcpdump -i any -n -s 0 tcp and host <Alamat IP database>Jalankan perintah berikut berdasarkan PID kontainer untuk menangkap paket yang ditransmisikan antara pod dan host:
nsenter -t <Container PID> tcpdump -i any -n -s 0 tcp and host <Alamat IP node>Jalankan perintah berikut untuk menangkap paket yang ditransmisikan antara host dan database.
tcpdump -i any -n -s 0 tcp and host <Alamat IP database>
6. Optimalkan aplikasi
Konfigurasikan aplikasi Anda untuk mendukung mekanisme rekoneksi otomatis, memastikan aplikasi dapat memulihkan koneksi secara otomatis tanpa intervensi manual ketika database diubah atau dipindahkan.
Gunakan koneksi persisten alih-alih koneksi singkat untuk berkomunikasi dengan database. Koneksi persisten dapat secara signifikan mengurangi kerugian performa dan konsumsi sumber daya, serta meningkatkan efisiensi sistem secara keseluruhan.
Memecahkan Masalah di Konsol
Anda dapat masuk ke Konsol ACK, navigasikan ke halaman detail kluster, dan kemudian pecahkan masalah pod abnormal.
Operasi | Tata letak konsol |
Periksa status pod |
|
Periksa informasi dasar pod |
|
Periksa konfigurasi pod |
|
Periksa peristiwa pod |
|
Periksa log pod |
Catatan Kluster ACK diintegrasikan dengan Layanan Log Sederhana. Anda dapat mengaktifkan Layanan Log Sederhana untuk kluster Anda untuk dengan cepat mengumpulkan log kontainer. Untuk informasi lebih lanjut, lihat Kumpulkan log kontainer dari kluster ACK. |
Periksa informasi pemantauan pod |
Catatan Kluster ACK diintegrasikan dengan Managed Service for Prometheus. Anda dapat mengaktifkan Managed Service for Prometheus untuk kluster ACK untuk memantau kluster dan kontainer dalam kluster secara real-time. Setelah Anda mengaktifkan Managed Service for Prometheus, Anda dapat melihat metrik yang ditampilkan pada dasbor Grafana. Untuk informasi lebih lanjut, lihat Gunakan Managed Service for Prometheus. |
Masuk ke kontainer pod menggunakan terminal dan lihat file lokal dalam kontainer |
|
Aktifkan diagnostik pod |
Catatan Container Intelligent Service menyediakan fitur diagnostik kluster untuk memungkinkan Anda mendiagnosis pod, Layanan, dan Ingress dengan satu klik dan membantu Anda menemukan penyebabnya. Untuk informasi lebih lanjut, lihat Bekerja dengan diagnostik kluster. |