All Products
Search
Document Center

Container Service for Kubernetes:Pemecahan Masalah Pod

Last Updated:Mar 27, 2026

Topik ini menjelaskan cara memecahkan masalah pod, termasuk prosedur diagnostik dan solusi untuk masalah umum.

Catatan

Untuk melakukan tugas pemecahan masalah pod umum di Konsol, seperti melihat status pod, informasi dasar, konfigurasi, event, dan log, mengakses kontainer menggunakan terminal, serta mengaktifkan diagnostik pod, lihat Prosedur Pemecahan Masalah Umum.

Prosedur diagnostik cepat

Untuk mendiagnosis pod workload yang tidak normal, buka halaman detail Pods yang dituju. Klik tab Events untuk meninjau deskripsi event tidak normal. Kemudian, klik tab Logs untuk memeriksa log tidak normal terbaru.

Pod dalam status Pending

Jika sebuah Pod memiliki status Unschedulable di bagian Status Details-nya atau muncul event FailedScheduling di Events, buka Nodes > Nodes untuk memeriksa status kesehatan dan tingkat sumber daya (CPU dan memori) node target. Selain itu, periksa apakah kebijakan afinitas Pod terlalu ketat, termasuk konfigurasi nodeSelector, nodeAffinity, serta Taint dan Toleration-nya. Untuk pemecahan masalah lebih lanjut, lihat Masalah penjadwalan.

Gagal menarik gambar (ImagePullBackOff/ErrImagePull)

Di halaman detail Pods, buka tab Container dan periksa alamat Image. Login ke node pod tersebut dan jalankan crictl pull <image-address> atau curl -v https://<image-address> untuk memverifikasi konektivitas jaringan ke repositori gambar. Di pojok kanan atas, klik Edit YAML dan pastikan Secret yang ditentukan di field spec.imagePullSecrets workload ada dan valid. Untuk pemecahan masalah lebih lanjut, lihat masalah penarikan gambar.

Pod gagal dimulai (CrashLoopBackOff)

Kesalahan ini terjadi ketika aplikasi berulang kali crash dan restart. Di halaman detail Pods, klik tab Logs dan pilih Show the log of the last container exit untuk melihat penyebab kegagalan. Untuk pemecahan masalah lebih lanjut, lihat Memecahkan masalah kegagalan startup pod.

Pod Berjalan tetapi tidak siap

Status ini terjadi ketika pemeriksaan kesiapan (readiness probe) pod gagal. Di halaman Edit Workloads yang dituju, verifikasi bahwa path permintaan pemeriksaan kesehatan (misalnya, /healthz) dan port sesuai dengan yang disediakan oleh aplikasi. Untuk pemecahan masalah lebih lanjut, lihat Pod Berjalan tetapi tidak siap (Ready: False).

Anda dapat sementara menonaktifkan pemeriksaan kesehatan. Kemudian, akses terminal pod atau node host-nya dan gunakan perintah seperti curl untuk memverifikasi bahwa pemeriksaan kesehatan berhasil.

Pod mengalami OOMKilled

Di halaman detail Pods, klik tab Logs dan pilih Show the log of the last container exit untuk melihat log OOM. Periksa apakah aplikasi mengalami kebocoran memori atau error kehabisan memori (OOM). Untuk aplikasi Java, Anda dapat mengoptimalkan parameter -Xmx. Sesuaikan batas sumber daya memori aplikasi (resources.limits.memory) sesuai kebutuhan. Untuk pemecahan masalah lebih lanjut, lihat OOMKilled.

Jika pemeriksaan kelangsungan hidup (liveness probe) dikonfigurasi, pod hanya akan berada dalam status OOMKilled sebentar sebelum secara otomatis restart.

Alur kerja diagnostik

Untuk mendiagnosis pod yang tidak normal, periksa event, log, dan konfigurasinya.

Alur kerja pemecahan masalah

Fase 1: Masalah penjadwalan

Pod belum dijadwalkan ke node

Jika pod tetap dalam status Pending dalam waktu lama, artinya pod tersebut belum dijadwalkan ke node. Bagian ini menjelaskan penyebab umum dan solusinya.

Pesan error

Deskripsi

Solusi

no nodes available to schedule pods.

Kluster tidak memiliki node yang tersedia untuk penjadwalan pod.

  1. Periksa apakah ada node di kluster yang berstatus NotReady. Jika ada node NotReady, periksa dan perbaiki node tersebut.

  2. Periksa apakah pod mendefinisikan nodeSelector, nodeAffinity, atau toleransi taint. Jika tidak ada kendala penjadwalan semacam itu, pertimbangkan untuk menambahkan lebih banyak node ke kelompok node.

  • 0/x nodes are available: x Insufficient cpu.

  • 0/x nodes are available: x Insufficient memory.

Tidak ada node yang tersedia di kluster yang dapat memenuhi permintaan sumber daya CPU atau memori pod.

Node dianggap tidak dapat dijadwalkan jika jumlah alokasi sumber daya requests-nya telah mencapai kapasitasnya, meskipun penggunaan CPU atau memori aktualnya rendah.

Di halaman detail kluster target, buka Nodes > Nodes dan periksa tingkat alokasi requests CPU atau memori untuk node target. Anda dapat mengarahkan kursor ke tingkat alokasi untuk melihat nilai alokasi sumber daya spesifik.

request中

Untuk melihat penggunaan sumber daya node secara rinci, lihat Gunakan kubectl untuk melihat penggunaan sumber daya node.

  • Optimalkan konfigurasi sumber daya:

    • Jika penggunaan sumber daya node secara konsisten lebih rendah daripada requests-nya, berarti sumber daya terbuang sia-sia. Anda dapat menurunkan konfigurasi requests untuk workload. Untuk informasi lebih lanjut, lihat Atur batas sumber daya CPU dan memori untuk kontainer.

      Anda dapat mengaktifkan profil sumber daya untuk mendapatkan rekomendasi konfigurasi requests.
    • Aktifkan Horizontal Pod Autoscaler (HPA) untuk kontainer bisnis Anda agar mengurangi jumlah replika selama jam sepi, sehingga menurunkan konsumsi sumber daya secara keseluruhan.

  • Bersihkan workload yang tidak diperlukan: Nonaktifkan atau kurangi skala pod yang tidak penting.

  • Perluas kelompok node: Jika penggunaan sumber daya pada node target secara konsisten tinggi, berarti node sudah jenuh. Anda dapat memperluas kelompok node.

x node(s) didn't match pod's node affinity/selector.

Node yang ada di kluster tidak sesuai dengan kebijakan afinitas node (nodeAffinity/nodeSelector) yang dideklarasikan untuk Pod. Untuk informasi lebih lanjut, lihat Menetapkan Pod ke Node.

  1. Lihat semua label pada node.

    Konsol

    1. Di halaman detail kluster target, buka Nodes > Nodes.

    2. Di halaman Nodes, temukan node target, lalu di kolom Actions, klik More > Manage Labels and Taints untuk melihat label-nya.

    Kubectl

    Ganti <YOUR_NODE_NAME> dengan nama node aktual Anda.

    kubectl get node <YOUR_NODE_NAME> --show-labels
  2. Periksa dan sesuaikan aturan afinitas node untuk workload (deployment).

    Konsol

    Saat membuat workload baru:

    1. Di halaman Advanced untuk membuat Create Deployment, temukan Node Affinity di bagian Scheduling, lalu klik Add.

    2. Konfigurasikan Required (afinitas keras) atau Optional (afinitas lunak) sesuai kebutuhan bisnis Anda. Beberapa Selector memiliki hubungan logika AND, sedangkan beberapa Rule memiliki hubungan logika OR.

    Untuk workload yang sudah ada:

    1. Di halaman Nodes > Nodes, klik image > Node Affinity di kolom Actions Deployment target.

    2. Metode konfigurasinya sama seperti yang dijelaskan di atas.

    Contoh YAML

    NodeAffinity

    Kebijakan afinitas dibagi menjadi afinitas keras (requiredDuringSchedulingIgnoredDuringExecution) dan afinitas lunak (preferredDuringSchedulingIgnoredDuringExecution). Afinitas keras menentukan aturan yang harus dipenuhi, sedangkan afinitas lunak menentukan preferensi. Contoh berikut menggunakan afinitas keras.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: app-demo-node-affinity-deploy
      labels:
        app: demo-node-affinity
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: demo-node-affinity
      template:
        metadata:
          labels:
            app: demo-node-affinity
        spec:
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
          affinity:
            nodeAffinity:
              # Afinitas keras: Aturan ini harus dipenuhi.
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: disktype
                    operator: In
                    values:
                    - ssd
                    - nvme  # Logika: Label 'disktype' node harus 'ssd' atau 'nvme'.

    NodeSelector

    Ini menyediakan pencocokan eksak sederhana. Pod hanya dijadwalkan jika label node memenuhi kondisi.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: app-demo-node-selector-deploy
      labels:
        app: demo-node-selector
    spec:
      replicas: 2  
      selector:
        matchLabels:
          app: demo-node-selector  
      template:
        metadata:
          labels:
            app: demo-node-selector
        spec:
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
          # Pod hanya dijadwalkan jika node memiliki label disktype=ssd.
          nodeSelector:
            disktype: ssd
  • x node(s) didn't match pod affinity rules.

  • x node(s) didn't match pod anti-affinity rules.

  • Ketidakcocokan aturan afinitas. Pod memiliki aturan pod affinity (misalnya, memerlukan label tertentu), tetapi tidak ada node yang meng-host pod dengan label yang cocok, sehingga mencegah penjadwalan.

  • Konflik anti-afinitas. Pod memiliki aturan pod anti-affinity (misalnya, tidak boleh berada bersama aplikasi lain), tetapi semua node yang tersedia sudah meng-host pod yang bertentangan, sehingga mencegah penjadwalan.

  1. Lihat label pod pada node.

    Konsol

    1. Di halaman detail kluster target, buka Nodes > Nodes.

    2. Di halaman Nodes, klik nama node target untuk membuka halaman detailnya. Gulir ke bawah ke bagian Pods untuk melihat nilai label berbagai pod di kolom Label.

    Kubectl

    • Lihat pod dan label-nya pada node tertentu: Ganti <YOUR_NAMESPACE> dengan nama namespace Anda dan <YOUR_NODE_NAME> dengan nama node aktual Anda.

      kubectl get pods -n <YOUR_NAMESPACE> --field-selector spec.nodeName=<YOUR_NODE_NAME> -o custom-columns=NAME:.metadata.name,LABELS:.metadata.labels
    • Kueri pod berdasarkan label: Ganti <LABEL> dengan pasangan kunci-nilai label aktual, seperti app=nginx.

      kubectl get pods -A -l <LABEL> -o wide
  2. Periksa dan sesuaikan aturan afinitas pod untuk workload (deployment).

    Konsol

    1. Saat membuat workload baru, di halaman Create Deployment, buka halaman Advanced, temukan Pod Affinity/Pod Anti-affinity di bagian Scheduling, lalu klik Add.

    2. Konfigurasikan Required (afinitas keras) atau Optional (afinitas lunak) sesuai kebutuhan bisnis Anda. Beberapa Selector memiliki hubungan logika AND, sedangkan beberapa Add Rule memiliki hubungan logika OR.

    Contoh YAML

    Kebijakan afinitas diklasifikasikan menjadi afinitas keras (requiredDuringSchedulingIgnoredDuringExecution) dan afinitas lunak (preferredDuringSchedulingIgnoredDuringExecution). Aturan afinitas keras harus dipenuhi, sedangkan aturan afinitas lunak merupakan preferensi. Contoh berikut menunjukkan konfigurasi untuk pod affinity yang wajib.

    Untuk mengonfigurasi pod anti-affinity, cukup ganti podAffinity dengan podAntiAffinity.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: app-demo-podaffinity-deploy
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: demo-podaffinity
      template:
        metadata:
          labels:
            app: demo-podaffinity
        spec:
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
          affinity:
            podAffinity:
              # Afinitas keras: Pod harus berada di node yang sama dengan pod yang memiliki label 'app: nginx'.
              requiredDuringSchedulingIgnoredDuringExecution:
              - labelSelector:
                  matchExpressions:
                  - key: app
                    operator: In
                    values:
                    - nginx
                # Cakupan domain topologi: isolasi tingkat host.
                topologyKey: kubernetes.io/hostname

0/x nodes are available: x node(s) had volume node affinity conflict.

Penjadwalan gagal karena konflik afinitas node volume. Ini biasanya terjadi karena disk cloud tidak dapat dipasang lintas zona berbeda.

  • Untuk PV yang disediakan secara statis, konfigurasikan afinitas node pod untuk memastikan pod dijadwalkan ke node di zona yang sama dengan PV.

  • Untuk PV yang disediakan secara dinamis, atur volumeBindingMode StorageClass ke WaitForFirstConsumer. Ini memastikan PV dibuat hanya setelah pod dijadwalkan ke node, sehingga disk cloud dibuat di zona yang sama dengan node pod.

InvalidInstanceType.NotSupportDiskCategory

Instans ECS tidak mendukung tipe disk cloud yang ditentukan.

Lihat Famili instans untuk mengonfirmasi tipe disk cloud yang didukung oleh instans ECS Anda. Saat memasang, perbarui tipe disk cloud ke tipe yang didukung oleh instans ECS.

0/x nodes are available: x node(s) had taints that the pod didn't tolerate.

Pod tidak dapat dijadwalkan ke node karena tidak memiliki toleransi terhadap salah satu taint node tersebut.

  • Jika taint ditambahkan secara manual, Anda dapat menghapus taint yang tidak diinginkan. Jika taint tidak dapat dihapus, Anda dapat mengonfigurasi toleransi yang sesuai untuk pod. Untuk informasi lebih lanjut, lihat Taints and Tolerations dan Mengelola label dan taint node.

  • Jika taint ditambahkan secara otomatis oleh sistem, selesaikan masalah mendasarnya seperti dijelaskan di bawah ini dan tunggu pod dijadwalkan ulang.

    Lihat taint yang ditambahkan oleh sistem

    • node.kubernetes.io/not-ready: Node berada dalam status NotReady.

    • node.kubernetes.io/unreachable: Node tidak dapat dijangkau dari node controller. Ini setara dengan status Ready node menjadi Unknown.

    • node.kubernetes.io/memory-pressure: Node mengalami tekanan memori.

    • node.kubernetes.io/disk-pressure: Node mengalami tekanan disk.

    • node.kubernetes.io/pid-pressure: Node mengalami tekanan PID.

    • node.kubernetes.io/network-unavailable: Jaringan node tidak tersedia.

    • node.kubernetes.io/unschedulable: Node ditandai sebagai tidak dapat dijadwalkan.

0/x nodes are available: x Insufficient ephemeral-storage.

Node memiliki penyimpanan sementara yang tidak mencukupi.

  1. Periksa permintaan penyimpanan sementara Pod, yaitu nilai spec.containers.resources.requests.ephemeral-storage di YAML Pod. Jika nilainya terlalu tinggi dan melebihi kapasitas aktual node, Pod akan gagal dijadwalkan.

  2. Jalankan perintah kubectl describe node | grep -A10 Capacity untuk melihat total kapasitas penyimpanan sementara di setiap node. Jika kapasitas tidak mencukupi, perluas disk node atau tambahkan lebih banyak node.

0/x nodes are available: pod has unbound immediate persistent volume claims.

Pod gagal mengikat klaim volume persisten (PVC).

Periksa apakah PVC atau PV yang ditentukan oleh pod telah dibuat. Jalankan kubectl describe pvc <pvc-name> atau kubectl describe pv <pv-name> untuk melihat event PVC dan PV guna diagnosis lebih lanjut. Untuk informasi lebih lanjut, lihat FAQ Penyimpanan - CSI.

Pod telah dijadwalkan tetapi tetap dalam status Pending

Jika pod telah dijadwalkan ke node tetapi tetap dalam status Pending, ikuti langkah-langkah berikut untuk menyelesaikan masalah.

  1. Tentukan apakah Pod dikonfigurasi dengan hostPort: Jika Pod dikonfigurasi dengan hostPort, hanya satu instance Pod yang menggunakan hostPort tersebut yang dapat berjalan di setiap node. Oleh karena itu, nilai Replicas dalam Deployment atau ReplicationController tidak boleh melebihi jumlah node di kluster. Jika port ini sedang digunakan oleh aplikasi lain, penjadwalan Pod gagal.

    hostPort menimbulkan beberapa kompleksitas manajemen dan penjadwalan. Kami menyarankan Anda menggunakan Service untuk mengakses Pod. Untuk informasi lebih lanjut, lihat Service.

  2. Jika Pod tidak dikonfigurasi dengan hostPort, ikuti langkah-langkah berikut untuk pemecahan masalah.

    1. Jalankan kubectl describe pod <pod-name> untuk melihat event pod dan selesaikan masalah yang ditemukan. Event dapat menjelaskan mengapa pod gagal dimulai, dengan alasan umum termasuk kegagalan penarikan gambar, sumber daya tidak mencukupi, pembatasan kebijakan keamanan, atau kesalahan konfigurasi.

    2. Jika objek Event tidak berisi informasi berguna, periksa log kubelet di node untuk memecahkan masalah selama proses startup Pod. Anda dapat menggunakan perintah grep -i <pod name> /var/log/messages* | less untuk mencari file log sistem (/var/log/messages*) guna menemukan entri log yang berisi nama Pod tertentu.

Fase 2: Masalah penarikan gambar

ImagePullBackOff atau ErrImagePull

Status pod ImagePullBackOff atau ErrImagePull menunjukkan bahwa penarikan gambar gagal. Dalam kasus ini, periksa event pod dan gunakan informasi di bawah ini untuk memecahkan masalah.

Pesan error

Deskripsi

Solusi yang disarankan

Failed to pull image "xxx": rpc error: code = Unknown desc = Error response from daemon: Get xxx: denied:

Akses ke repositori gambar ditolak karena imagePullSecret tidak ditentukan saat pod dibuat.

Verifikasi bahwa Secret yang ditentukan di field spec.imagePullSecrets file YAML workload ada.

Saat menggunakan Container Registry (ACR), Anda dapat menggunakan credential helper untuk menarik gambar tanpa kata sandi. Untuk informasi lebih lanjut, lihat Menarik gambar dari akun yang sama.

Failed to pull image "xxxx:xxx": rpc error: code = Unknown desc = Error response from daemon: Get https://xxxxxx/xxxxx/: dial tcp: lookup xxxxxxx.xxxxx: no such host

Alamat repositori gambar tidak dapat diselesaikan saat menarik gambar melalui HTTPS.

  1. Verifikasi bahwa alamat repositori gambar di spec.containers.image file YAML pod benar. Jika salah, perbarui.

  2. Jika alamatnya benar, verifikasi konektivitas jaringan dari node tempat pod berjalan ke repositori gambar. Login ke node (untuk informasi lebih lanjut, lihat Memilih metode koneksi jarak jauh ECS) dan jalankan perintah curl -kv https://xxxxxx/xxxxx/ untuk memeriksa apakah alamat dapat diakses. Jika terjadi error, selidiki kemungkinan masalah jaringan, seperti konfigurasi jaringan salah, aturan firewall, atau masalah resolusi DNS.

Failed create pod sandbox: rpc error: code = Unknown desc = failed to create a sandbox for pod "xxxxxxxxx": Error response from daemon: mkdir xxxxx: no space left on device

Node memiliki ruang disk yang tidak mencukupi.

Login ke node tempat pod berjalan (untuk informasi lebih lanjut, lihat Memilih metode koneksi jarak jauh ECS) dan jalankan df -h untuk memeriksa ruang disk. Jika disk penuh, ubah ukuran disk cloud. Untuk informasi lebih lanjut, lihat Langkah 1: Mengubah ukuran disk cloud.

Failed to pull image "xxx": rpc error: code = Unknown desc = error pulling image configuration: xxx x509: certificate signed by unknown authority

Repositori gambar pihak ketiga menggunakan sertifikat yang ditandatangani oleh Certificate Authority (CA) yang tidak dikenal atau tidak aman.

  1. Repositori pihak ketiga sebaiknya menggunakan sertifikat yang dikeluarkan oleh CA tepercaya.

  2. Jika Anda menggunakan repositori gambar pribadi, lihat Membuat aplikasi dari repositori gambar pribadi.

  3. Jika Anda tidak dapat mengubah sertifikat, Anda dapat mengonfigurasi node untuk mengizinkan penarikan dan pendorongan gambar dari repositori yang menggunakan sertifikat tidak aman. Kami menyarankan menggunakan metode ini hanya di lingkungan pengujian, karena dapat memengaruhi pod lain di node tersebut.

Lihat langkah-langkah terperinci

Konsol

Mengonfigurasi parameter containerd menggunakan konsol

Penting

Perubahan ini tidak memengaruhi kontainer yang sudah ada. Untuk menjaga stabilitas kluster, lakukan operasi ini selama jam sepi.

  1. Login ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

  2. Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Nodes > Node Pools.

  3. Di halaman daftar kelompok node, klik image > Containerd Configuration di kolom Actions kelompok node target.

  4. Baca catatan penting di halaman ini. Tambahkan parameter yang Anda butuhkan, pilih node target, dan atur kebijakan konfigurasi batch. Lalu klik Submit. > Lihat contoh konfigurasi di bawah ini.

    • Menghapus parameter konfigurasi runtime kontainer akan mengembalikannya ke nilai default secara otomatis.

    • Setelah Anda mengklik Submit, konfigurasi diterapkan ke node secara bertahap. Anda dapat melacak progres dan mengontrol eksekusi di bagian Events — jeda, lanjutkan, atau batalkan sesuai kebutuhan. Jika tugas node gagal, pecahkan masalah node tersebut dan klik Continue untuk mencoba lagi. Saat Anda menjeda, node yang sedang dikonfigurasi akan menyelesaikan penerapan perubahan sebelum berhenti. Node yang belum dimulai akan menunggu hingga Anda melanjutkan. Selesaikan tugas sesegera mungkin — tugas yang dijeda lebih dari 7 hari akan dibatalkan secara otomatis, dan event serta log terkait akan dibersihkan.

Contoh konfigurasi

Mengonfigurasi repositori gambar pengganti untuk docker.io

Melewati verifikasi sertifikat untuk repositori pribadi

Mengonfigurasi repositori gambar pribadi HTTP

image

image

image

CLI

  1. Buat direktori sertifikat untuk containerd guna menyimpan file konfigurasi sertifikat untuk repositori gambar tertentu.

    mkdir -p /etc/containerd/cert.d/xxxxx
  2. Konfigurasikan containerd untuk memercayai repositori gambar tidak aman tertentu.

    cat << EOF > /etc/containerd/cert.d/xxxxx/hosts.toml
       server = "https://harbor.test-cri.com"
       [host."https://harbor.test-cri.com"]
         capabilities = ["pull", "resolve", "push"]
         skip_verify = true
         # ca = "/opt/ssl/ca.crt"  # Atau unggah sertifikat CA
       EOF
  3. Modifikasi konfigurasi daemon Docker untuk menambahkan repositori tidak aman.

    vi /etc/docker/daemon.json

    Tambahkan konten berikut. Ganti your-insecure-registry dengan alamat repositori pribadi Anda.

       {
         "insecure-registries": ["your-insecure-registry"]
       }
  4. Restart layanan containerd agar perubahan berlaku.

    systemctl restart containerd

Failed to pull image "XXX": rpc error: code = Unknown desc = context canceled

Operasi dibatalkan, kemungkinan karena file gambar terlalu besar. Kubernetes memiliki timeout default untuk menarik gambar. Jika penarikan tidak menunjukkan progres selama periode tertentu, Kubernetes menganggap operasi gagal atau tidak merespons dan membatalkan tugas.

  1. Verifikasi bahwa imagePullPolicy diatur ke IfNotPresent di file YAML pod.

  2. Login ke node tempat pod berjalan (untuk informasi lebih lanjut, lihat Memilih metode koneksi jarak jauh ECS) dan jalankan docker pull atau crictl pull untuk memeriksa apakah gambar dapat ditarik.

Failed to pull image "xxxxx": rpc error: code = Unknown desc = Error response from daemon: Get https://xxxxxxx: xxxxx/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

Tidak dapat terhubung ke repositori gambar karena masalah jaringan.

  1. Login ke node tempat pod berjalan (untuk informasi lebih lanjut, lihat Memilih metode koneksi jarak jauh ECS) dan jalankan perintah curl https://xxxxxx/xxxxx/ untuk memeriksa apakah alamat dapat diakses. Jika terjadi error, selidiki kemungkinan masalah jaringan, seperti konfigurasi jaringan salah, aturan firewall, atau masalah resolusi DNS.

  2. Verifikasi kebijakan jaringan publik node, termasuk konfigurasi untuk entri SNAT dan Alamat IP Elastis (EIP) yang terikat.

Failed to pull image "xxxx:xxx": failed to pull and unpack image "xxxx:xxx": failed to resolve reference "xxxx:xxx": failed to do request: Head "xxxx:xxx": dial tcp xxx.xxx.xx.x:xxx: i/o timeout

Koneksi timeout karena masalah jaringan saat menarik gambar dari repositori luar negeri.

Menarik gambar dari repositori luar negeri, seperti Docker Hub, mungkin gagal di kluster ACK karena jaringan penyedia layanan tidak stabil. Untuk mengatasi hal ini, pertimbangkan solusi berikut:

Too Many Requests.

Docker Hub memberlakukan pembatasan laju pada permintaan penarikan gambar.

Unggah gambar ke Container Registry (ACR) dan tarik dari repositori gambar ACR.

Status Pulling image terus-menerus ditampilkan

Mekanisme pembatasan laju penarikan gambar kubelet mungkin telah dipicu.

Sesuaikan registryPullQPS (QPS maksimum untuk repositori gambar) dan registryBurst (jumlah maksimum penarikan gambar burst) menggunakan fitur Menyesuaikan konfigurasi kubelet untuk kelompok node.

Fase 3: Masalah startup

Pod dalam status Init

Pesan error

Deskripsi

Solusi

Terkunci dalam status Init:N/M

Pod berisi M init container. N di antaranya telah selesai, tetapi M-N init container yang tersisa gagal dimulai.

  1. Jalankan perintah kubectl describe pod -n <ns> <pod name> untuk melihat event pod dan memeriksa masalah pada init container yang belum dimulai.

  2. Jalankan perintah kubectl logs -n <ns> <pod name> -c <container name> untuk melihat log init container yang belum dimulai dan gunakan untuk memecahkan masalah.

  3. Tinjau konfigurasi pod, seperti pengaturan pemeriksaan kesehatan, untuk memastikan init container dikonfigurasi dengan benar.

Untuk informasi lebih lanjut tentang init container, lihat Debug init containers.

Terkunci dalam status Init:Error

Init container di pod gagal dimulai.

Terkunci dalam status Init:CrashLoopBackOff

Init container di pod gagal dimulai dan berada dalam loop restart.

Pod dalam status Creating

Pesan error

Deskripsi

Solusi

failed to allocate for range 0: no IP addresses available in range set: xx.xxx.xx.xx-xx.xx.xx.xx

Ini adalah perilaku yang diharapkan karena desain plugin jaringan Flannel.

Tingkatkan komponen Flannel ke v0.15.1.11-7e95fe23-aliyun atau yang lebih baru. Untuk informasi lebih lanjut, lihat Flannel.

Di kluster yang menjalankan versi Kubernetes sebelum 1.20, kebocoran alamat IP dapat terjadi jika pod restart berulang kali atau jika pod dari CronJob menyelesaikan tugasnya dan keluar dengan cepat.

Tingkatkan kluster ke Kubernetes 1.20 atau yang lebih baru. Kami menyarankan menggunakan versi kluster terbaru. Untuk informasi lebih lanjut, lihat Meningkatkan kluster secara manual.

Cacat pada containerd dan runC menyebabkan masalah ini.

Untuk perbaikan darurat, lihat Mengapa pod saya gagal dimulai dengan error "no IP addresses available in range"?

error parse config, can't found dev by mac 00:16:3e:01:c2:e8: not found

Plugin jaringan Terway memelihara basis data internal di node untuk melacak dan mengelola elastic network interfaces (ENIs). Error ini terjadi ketika status basis data tidak konsisten dengan konfigurasi perangkat jaringan aktual, menyebabkan alokasi ENI gagal.

  1. Antarmuka jaringan dimuat secara asinkron. Antarmuka mungkin masih dimuat selama konfigurasi CNI, yang memicu percobaan ulang CNI otomatis. Proses ini tidak memengaruhi alokasi ENI akhir. Periksa status akhir pod untuk mengonfirmasi keberhasilan.

  2. Jika pembuatan pod masih gagal setelah waktu lama dan error ini tetap ada, driver kemungkinan gagal memuat ENI karena memori orde tinggi tidak mencukupi. Restart instans ECS untuk mengatasi masalah ini. Untuk informasi lebih lanjut, lihat Restart instans.

  • cmdAdd: error alloc ip rpc error: code = DeadlineExceeded desc = context deadline exceeded

  • cmdAdd: error alloc ip rpc error: code = Unknown desc = error wait pod eni info, timed out waiting for the condition

Plugin jaringan Terway mungkin gagal meminta alamat IP dari vSwitch.

  1. Lihat log kontainer Terway dalam pod komponen Terway di node untuk memeriksa proses alokasi ENI.

  2. Jalankan perintah kubectl logs -n kube-system  <terwayPodName > -c terway | grep <podName> untuk melihat informasi ENI untuk pod Terway. Dapatkan ID Permintaan untuk permintaan alamat IP dan pesan error OpenAPI.

  3. Gunakan ID Permintaan dan pesan error untuk menyelidiki kegagalan.

Pod gagal dimulai (CrashLoopBackOff)

Pesan error

Deskripsi

Solusi

Log berisi exit(0).

  1. Login ke node tempat workload tidak normal ditempatkan.

  2. Jalankan perintah docker ps -a | grep $podName. Jika kontainer tidak memiliki proses persisten, ia akan keluar dengan kode status 0.

Event pod menunjukkan Liveness probe failed: ....

Pemeriksaan kelangsungan hidup (liveness probe) gagal, menyebabkan aplikasi restart.

  • Konfigurasi pemeriksaan kelangsungan hidup: Di halaman Edit Workloads target, verifikasi bahwa path permintaan pemeriksaan kesehatan (misalnya, /healthz) dan port sesuai dengan yang disediakan oleh aplikasi. Tingkatkan Initial Delay (s) untuk memastikan pemeriksaan kelangsungan hidup dimulai hanya setelah aplikasi sepenuhnya diluncurkan.

    Anda dapat sementara menonaktifkan Liveness. Kemudian, akses terminal pod atau node host-nya dan gunakan perintah seperti curl untuk memverifikasi bahwa metode pemeriksaan kesehatan berfungsi dengan benar.
  • Pecahkan masalah aplikasi: Selidiki masalah dengan memeriksa Events dan Log pod. Pilih Show the log of the last container exit.

Event pod menunjukkan Startup probe failed: ....

Pemeriksaan startup gagal, menyebabkan aplikasi restart.

  • Konfigurasi pemeriksaan startup: Di halaman Edit Workloads target, verifikasi bahwa path permintaan pemeriksaan kesehatan (misalnya, /healthz) dan port sesuai dengan yang disediakan oleh aplikasi. Jika aplikasi membutuhkan waktu lama untuk memulai, tingkatkan Unhealthy Threshold untuk mencegah restart prematur.

    Anda dapat sementara menonaktifkan Startup. Kemudian, akses terminal pod atau node host-nya dan gunakan perintah seperti curl untuk memverifikasi bahwa metode pemeriksaan kesehatan berfungsi dengan benar.
  • Pecahkan masalah aplikasi: Selidiki masalah dengan memeriksa Events dan Logs pod. Pilih Show the log of the last container exit.

Log pod berisi no space left on device.

Ruang disk cloud tidak mencukupi.

  • Ubah ukuran disk cloud. Untuk informasi lebih lanjut, lihat Langkah 1: Mengubah ukuran disk cloud.

  • Bersihkan gambar yang tidak diperlukan untuk mengosongkan ruang disk, dan konfigurasikan imageGCHighThresholdPercent untuk mengatur ambang batas pengumpulan sampah gambar di node.

Startup gagal tanpa informasi event.

Masalah ini terjadi ketika kontainer memerlukan lebih banyak sumber daya daripada batas yang dideklarasikan, menyebabkan kegagalan.

Periksa apakah konfigurasi sumber daya pod benar. Anda dapat mengaktifkan profil sumber daya untuk mendapatkan rekomendasi konfigurasi Request dan Limit untuk kontainer.

Log pod menunjukkan Address already in use.

Terjadi konflik port antara kontainer dalam pod yang sama.

  1. Periksa apakah pod dikonfigurasi dengan hostNetwork: true. Pengaturan ini menyebabkan kontainer dalam pod berbagi namespace jaringan dan ruang port host. Jika ini tidak diperlukan, ubah menjadi hostNetwork: false.

  2. Jika pod memerlukan hostNetwork: true, konfigurasikan anti-afinitas pod untuk memastikan pod dari set replika yang sama dijadwalkan ke node berbeda.

  3. Verifikasi bahwa tidak ada pod lain di node yang sama yang menggunakan port tersebut.

Log pod menunjukkan container init caused "setenv: invalid argument": unknown.

Workload memasang Secret, tetapi nilai dalam Secret tidak di-encode Base64.

  • Buat Secret di konsol, di mana nilai secara otomatis di-encode Base64. Untuk informasi lebih lanjut, lihat Mengelola Secrets.

  • Buat Secret dari file YAML dan encode Base64 nilai secara manual dengan menjalankan perintah echo -n "xxxxx" | base64.

Masalah spesifik aplikasi.

Periksa log pod untuk memecahkan masalah.

Pod Berjalan tetapi tidak siap (Ready: False)

Pesan error

Deskripsi

Solusi

image Event pod menunjukkan Readiness probe failed: ....

Pemeriksaan kesiapan (readiness probe) gagal, mencegah pod target menerima trafik.

  • Konfigurasi pemeriksaan kesiapan: Di halaman Edit Workloads target, verifikasi bahwa path permintaan pemeriksaan kesehatan (misalnya, /healthz) dan port sesuai dengan yang disediakan oleh aplikasi. Jika aplikasi memiliki waktu startup yang lama, tingkatkan Unhealthy Threshold untuk menghindari kegagalan prematur.

    Anda dapat sementara menonaktifkan Readiness, login ke terminal Pod atau host-nya, dan gunakan perintah seperti curl untuk memverifikasi bahwa metode pemeriksaan kesehatan merespons dengan benar.
  • Pecahkan masalah aplikasi: Selidiki masalah dengan memeriksa Events dan Logs pod. Pilih Show the log of the last container exit.

Status pod sama seperti di atas. Event pod menunjukkan Startup probe failed: ....

Pemeriksaan startup yang gagal menyebabkan kontainer restart. Error ini seharusnya tidak menghasilkan status Running/NotReady yang persisten, melainkan status 'CrashLoopBackOff'.

Pecahkan masalah ini seperti yang dijelaskan di bagian "Pod gagal dimulai (CrashLoopBackOff)" untuk Startup.

Fase 4: Masalah runtime Pod

OOMKilled

Ketika kontainer di kluster Anda menggunakan lebih banyak memori daripada batas yang ditentukan, kontainer tersebut mungkin dihentikan karena event kehabisan memori (OOM), menyebabkan kontainer keluar secara tak terduga. Untuk informasi lebih lanjut tentang event OOM, lihat Menetapkan Sumber Daya Memori untuk Kontainer dan Pod.

  • Jika proses yang dihentikan adalah proses utama kontainer, kontainer mungkin restart secara tak terduga.

  • Saat event OOM terjadi, muncul di tab Events halaman detail pod di konsol, seperti pod was OOM killed. node:XXX pod:XXX namespace:XXX.

  • Jika Anda mengonfigurasi alert untuk pengecualian replika kontainer untuk kluster, Anda akan menerima notifikasi saat event OOM terjadi. Untuk informasi lebih lanjut, lihat Aturan set alert pengecualian replika kontainer.

Tingkat OOM

Deskripsi

Solusi yang direkomendasikan

Tingkat OS

Periksa log kernel di /var/log/messages di node pod. Jika log menunjukkan proses yang dihentikan tetapi tidak berisi log cgroup, event OOM terjadi di tingkat OS.

Tingkat cgroup

Periksa log kernel di /var/log/messages di node pod. Jika log berisi pesan error serupa Task in /kubepods.slice/xxxxx killed as a result of limit of /kubepods.slice/xxxx, event OOM terjadi di tingkat cgroup.

  • Tingkatkan batas memori Pod berdasarkan kebutuhan bisnis Anda. Kami menyarankan agar penggunaan aktual tetap di bawah 80% dari batas yang dikonfigurasi. Untuk informasi lebih lanjut, lihat Mengelola Pod dan Memperluas sumber daya node.

  • Aktifkan profil sumber daya untuk mendapatkan rekomendasi konfigurasi requests dan limits kontainer.

Untuk informasi lebih lanjut tentang penyebab dan solusi event OOM, lihat Penyebab dan solusi untuk OOM Killer.

Terminating

Kemungkinan penyebab

Deskripsi

Solusi yang direkomendasikan

Node berada dalam status NotReady.

Pod secara otomatis dihapus setelah node pulih dari status NotReady.

Pod dikonfigurasi dengan finalizer.

Jika pod dikonfigurasi dengan finalizer, Kubernetes melakukan operasi pembersihan yang ditentukan oleh finalizer sebelum menghapus pod. Jika operasi pembersihan gagal merespons, pod tetap dalam status Terminating.

Jalankan perintah kubectl get pod -n <ns> <pod name> -o yaml untuk melihat konfigurasi finalizer pod dan menyelidiki penyebabnya.

Hook preStop pod tidak valid atau macet.

Jika hook preStop dikonfigurasi untuk pod, Kubernetes mengeksekusi hook tersebut sebelum menghentikan kontainer. Pod tetap dalam status Terminating selama hook berjalan.

Jalankan perintah kubectl get pod -n <ns> <pod name> -o yaml untuk melihat konfigurasi hook preStop pod dan menyelidiki penyebabnya.

Periode shutdown yang mulus dikonfigurasi untuk pod.

Jika Pod dikonfigurasi dengan periode shutdown yang mulus (terminationGracePeriodSeconds), Pod memasuki status Terminating setelah menerima perintah penghentian, seperti kubectl delete pod <pod_name>. Kubernetes menganggap Pod berhasil dimatikan hanya setelah waktu yang ditentukan dalam terminationGracePeriodSeconds berlalu atau kontainer keluar.

Kubernetes secara otomatis menghapus pod setelah kontainer menyelesaikan shutdown yang mulus.

Kontainer tidak merespons.

Saat Anda meminta untuk menghentikan atau menghapus pod, Kubernetes mengirim sinyal SIGTERM ke kontainer dalam pod. Jika kontainer tidak menangani sinyal SIGTERM dengan benar selama penghentian, pod mungkin tetap dalam status Terminating.

  1. Jalankan perintah kubectl delete pod <pod-name> --grace-period=0 --force untuk menghapus pod secara paksa dan melepaskan sumber dayanya.

  2. Periksa log containerd atau Docker di node pod untuk menyelidiki lebih lanjut.

Evicted

Kemungkinan penyebab

Deskripsi

Solusi yang direkomendasikan

Node mengalami tekanan sumber daya dari faktor seperti penggunaan memori atau disk.

Node mungkin mengalami tekanan memori, tekanan disk, atau tekanan PID.

  • Jalankan perintah kubectl describe node <node name> | grep Taints. Output mungkin mencakup taint berikut:

    • Tekanan memori: Node memiliki taint node.kubernetes.io/memory-pressure.

    • Tekanan disk: Node memiliki taint node.kubernetes.io/disk-pressure.

    • Tekanan PID: Node memiliki taint node.kubernetes.io/pid-pressure.

  • Status pod adalah salah satu dari berikut:

    • Evicted

    • ContainerStatusUnknown, dan field reason di file YAML pod menunjukkan Evicted.

  • Tekanan memori:

    • Sesuaikan konfigurasi sumber daya pod berdasarkan kebutuhan bisnis Anda. Untuk informasi lebih lanjut, lihat Mengelola pod.

    • Tingkatkan node. Untuk informasi lebih lanjut, lihat Memperluas sumber daya node.

  • Tekanan disk:

  • Tekanan PID: Sesuaikan konfigurasi sumber daya pod berdasarkan kebutuhan bisnis Anda. Untuk informasi lebih lanjut, lihat Batas dan Reservasi ID Proses.

Eviksi tidak terduga terjadi.

Taint NoExecute yang ditambahkan secara manual pada node pod menyebabkan eviksi tidak terduga.

Jalankan perintah kubectl describe node <node name> | grep Taints untuk memeriksa apakah node memiliki taint NoExecute. Jika ya, hapus.

Eviksi tidak berjalan seperti yang diharapkan.

  • --pod-eviction-timeout: Pod di node yang gagal dieviksi setelah periode timeout ini. Defaultnya adalah 5 menit.

  • --node-eviction-rate: Jumlah pod yang dieviksi dari node per detik. Defaultnya adalah 0,1, artinya paling banyak satu pod dieviksi dari node setiap 10 detik.

  • --secondary-node-eviction-rate: Tingkat eviksi node sekunder. Jika terlalu banyak node di kluster gagal, tingkat eviksi dikurangi ke nilai ini. Defaultnya adalah 0,01.

  • --unhealthy-zone-threshold: Ambang batas zona ketersediaan tidak sehat. Defaultnya adalah 0,55. Ketika fraksi node yang gagal di zona ketersediaan melebihi ambang batas ini, zona dianggap tidak sehat.

  • --large-cluster-size-threshold: Ambang batas ukuran kluster besar. Defaultnya adalah 50. Kluster dianggap besar ketika memiliki lebih dari 50 node.

Di kluster kecil (50 node atau kurang), jika lebih dari 55% node gagal, eviksi pod berhenti. Untuk informasi lebih lanjut, lihat Batas laju eviksi.

Di kluster besar (lebih dari 50 node), jika fraksi node tidak sehat melebihi --unhealthy-zone-threshold (default 0,55), tingkat eviksi berkurang ke nilai --secondary-node-eviction-rate (default 0,01 pod per detik). Untuk informasi lebih lanjut, lihat Batas laju eviksi.

Pod sering dijadwalkan ulang ke node asalnya setelah dieviksi.

Kubelet mengeviksi pod berdasarkan penggunaan sumber daya aktual, sedangkan penjadwal menempatkan pod berdasarkan permintaan sumber daya. Karena eviksi membebaskan sumber daya, penjadwal mungkin menjadwalkan ulang pod ke node yang sama jika permintaannya masih sesuai.

Pastikan permintaan sumber daya pod sesuai untuk sumber daya yang dapat dialokasikan node, dan sesuaikan jika perlu. Untuk informasi lebih lanjut, lihat Menetapkan sumber daya CPU dan memori untuk kontainer. Anda juga dapat mengaktifkan profil sumber daya untuk mendapatkan rekomendasi konfigurasi request dan limit untuk kontainer Anda.

Completed

Saat pod berada dalam status Completed, semua kontainernya telah menyelesaikan perintahnya dan keluar dengan sukses. Status ini umum untuk workload seperti job dan init container.

FAQ

Pod berjalan tetapi tidak berfungsi

Kesalahan dalam file YAML aplikasi Anda dapat menyebabkan pod memasuki status Running tetapi gagal berfungsi dengan benar.

  1. Verifikasi pengaturan kontainer dalam konfigurasi pod.

  2. Gunakan metode berikut untuk memeriksa konfigurasi YAML Anda terhadap kesalahan ejaan.

    Saat Anda membuat Pod, jika kunci dalam file YAML salah eja (misalnya, mengeja command sebagai commnd), kluster mengabaikan error tersebut dan berhasil membuat resource. Namun, sistem tidak dapat mengeksekusi perintah yang ditentukan dalam file YAML saat kontainer berjalan.

    Contoh berikut, di mana command salah eja sebagai commnd, menjelaskan cara memecahkan masalah kesalahan ejaan.

    1. Tambahkan flag --validate ke perintah kubectl apply -f, lalu jalankan perintah kubectl apply --validate -f XXX.yaml .

      Jika Anda salah mengeja kata, error dilaporkan: XXX] unknown field: commnd XXX] this may be a false alarm, see https://gXXXb.XXX/6842pods/test.

    2. Jalankan perintah berikut dan bandingkan file pod.yaml output dengan file YAML asli yang digunakan untuk membuat pod.

      Catatan

      [$Pod] adalah nama Pod tidak normal, yang dapat Anda peroleh dengan menjalankan perintah kubectl get pods.

        kubectl get pods [$Pod] -o yaml > pod.yaml
      • Jika file pod.yaml memiliki lebih banyak baris daripada file aslinya, berarti pod dibuat seperti yang diharapkan, dan kluster menambahkan nilai default.

      • Jika baris dari file YAML asli Anda hilang dari pod.yaml, ini menunjukkan kesalahan ejaan dalam file asli Anda.

  3. Periksa log pod untuk memecahkan masalah.

  4. Akses kontainer melalui terminal dan verifikasi bahwa file lokal dalam kontainer sesuai harapan.

Memeriksa penggunaan sumber daya node dengan kubectl

  1. Periksa penggunaan CPU dan memori semua node di kluster.

    kubectl describe nodes | awk '/^Name:/{print "\n"$2} /Resource +Requests +Limits/{print $0} /^[ \t]+cpu.*%/{print $0} /^[ \t]+memory.*%/{print $0}'

    Output yang diharapkan:

    cn-hangzhou.192.168.0.xxx
      Resource           Requests      Limits
      cpu                1725m (44%)   10320m (263%)
      memory             1750Mi (11%)  16044Mi (109%)
    
    cn-hangzhou.192.168.16.xxx
      Resource           Requests      Limits
      cpu                1885m (48%)   16820m (429%)
      memory             2536Mi (17%)  25760Mi (179%)

    Node dengan pemanfaatan request tinggi mungkin tidak dapat memenuhi requests Pod baru, mencegah Pod dijadwalkan.

  2. Ganti YOUR_NODE_NAME dengan nama node aktual untuk melihat penggunaan sumber daya semua Pod di node tersebut.

    kubectl describe node YOUR_NODE_NAME | awk '/Pod yang belum dihentikan/,/Sumber daya yang dialokasikan/{ if ($0 !~ /Sumber daya yang dialokasikan/) print }'

    Output yang diharapkan:

    Non-terminated Pods:          (11 in total)
      Namespace                   Name                                                        CPU Requests  CPU Limits   Memory Requests  Memory Limits  Age
      ---------                   ----                                                        ------------  ----------   ---------------  -------------  ---
      arms-prom                   node-exporter-gp95p                                         20m (0%)      1020m (26%)  160Mi (1%)       1152Mi (7%)    6d21h
      csdr                        csdr-velero-77c8bbc9c7-w46lq                                500m (12%)    1 (25%)      128Mi (0%)       2Gi (13%)      6d19h
      kube-system                 ack-cost-exporter-5b647ffc65-zdrsl                          100m (2%)     1 (25%)      200Mi (1%)       1Gi (6%)       6d21h
      kube-system                 ack-node-local-dns-admission-controller-5dfd74f5f4-9rl6n    100m (2%)     1 (25%)      100Mi (0%)       1Gi (6%)       6d21h
      kube-system                 ack-node-problem-detector-daemonset-6wql2                   200m (5%)     1200m (30%)  300Mi (2%)       1324Mi (9%)    6d21h
      kube-system                 coredns-7784559f6-dr9sn                                     100m (2%)     0 (0%)       100Mi (0%)       2Gi (13%)      6d21h
      kube-system                 csi-plugin-knz7j                                            130m (3%)     2 (51%)      176Mi (1%)       4Gi (27%)      6d21h
      kube-system                 kube-proxy-worker-rkbzv                                     100m (2%)     0 (0%)       100Mi (0%)       0 (0%)         6d21h
      kube-system                 loongcollector-ds-kw7cj                                     100m (2%)     2 (51%)      256Mi (1%)       2Gi (13%)      6d21h
      kube-system                 node-local-dns-pgzcn                                        25m (0%)      0 (0%)       30Mi (0%)        1Gi (6%)       6d21h
      kube-system                 terway-eniip-lnn8n                                          350m (8%)     1100m (28%)  200Mi (1%)       256Mi (1%)     6d21h

    Anda dapat menyesuaikan konfigurasi requests berdasarkan konsumsi sumber daya aktual.

Putus jaringan intermiten dari pod ke database

Jika pod di kluster ACK Anda terputus secara intermiten dari database, ikuti langkah-langkah berikut untuk memecahkan masalah.

1. Periksa pod
  • Periksa event pod untuk tanda-tanda ketidakstabilan koneksi, seperti masalah jaringan, restart, atau sumber daya tidak mencukupi.

  • Periksa log pod untuk pesan error apa pun yang terkait dengan koneksi database, seperti timeout, kegagalan autentikasi, atau pemicu koneksi ulang.

  • Monitor penggunaan CPU dan memori pod untuk memastikan kehabisan sumber daya tidak menyebabkan aplikasi atau driver database crash.

  • Tinjau requests dan limits sumber daya pod untuk memastikan memiliki CPU dan memori yang cukup.

2. Periksa node
  • Periksa penggunaan sumber daya node untuk kekurangan memori, ruang disk, atau sumber daya lainnya. Untuk informasi lebih lanjut, lihat Memantau node.

  • Uji gangguan jaringan intermiten antara node dan database target.

3. Periksa database
  • Periksa status dan metrik kinerja database untuk restart atau bottleneck kinerja apa pun.

  • Tinjau jumlah koneksi tidak normal dan pengaturan timeout koneksi, lalu sesuaikan berdasarkan kebutuhan aplikasi Anda.

  • Periksa log database untuk catatan apa pun yang terkait dengan pemutusan koneksi.

4. Periksa status komponen kluster

Komponen kluster yang rusak dapat mengganggu komunikasi jaringan pod.

kubectl get pod -n kube-system  # Periksa status pod komponen.

Juga, periksa komponen jaringan berikut:

  • CoreDNS: Periksa status dan log komponen untuk memastikan pod dapat menyelesaikan alamat layanan database dengan benar.

  • Flannel: Periksa status dan log komponen kube-flannel.

  • Terway: Periksa status dan log komponen terway-eniip.

5. Analisis trafik jaringan

Anda dapat menggunakan tcpdump untuk mengambil paket dan menganalisis trafik jaringan guna membantu mengidentifikasi penyebab masalah.

  1. Dapatkan informasi Pod dan node:

    Jalankan perintah berikut untuk mendapatkan informasi tentang pod di namespace tertentu dan node tempatnya berjalan:

    kubectl  get pod -n [namespace] -o wide 
  2. Login ke node target dan jalankan perintah berikut untuk menemukan PID kontainer.

    Containerd

    1. Jalankan perintah berikut untuk melihat CONTAINER kontainer.

      crictl ps |grep <Pod name keyword>

      Output yang diharapkan:

      CONTAINER           IMAGE               CREATED             STATE                      
      a1a214d2*****       35d28df4*****       2 days ago          Running
    2. Jalankan perintah berikut dengan parameter CONTAINER ID untuk melihat PID kontainer.

      crictl inspect a1a214d2***** |grep -i PID

      Output yang diharapkan:

          "pid": 2309838,    # PID kontainer target.
                  "pid": 1
                  "type": "pid"

    Docker

    1. Jalankan perintah berikut untuk melihat CONTAINER ID kontainer.

      docker ps |grep <pod name keyword>

      Output yang diharapkan:

      CONTAINER ID        IMAGE                  COMMAND     
      a1a214d2*****       35d28df4*****          "/nginx
    2. Jalankan perintah berikut dengan parameter CONTAINER ID untuk melihat PID kontainer.

      docker inspect  a1a214d2***** |grep -i PID

      Output yang diharapkan:

                  "Pid": 2309838,  # PID kontainer target.
                  "PidMode": "",
                  "PidsLimit": null,
  3. Jalankan perintah pengambilan paket.

    Gunakan PID kontainer untuk menjalankan perintah berikut dan mengambil paket jaringan antara pod dan database target.

    nsenter -t <container PID> tcpdump -i any -n -s 0 tcp and host <database IP address> 

    Gunakan PID kontainer untuk menjalankan perintah berikut dan mengambil paket jaringan antara pod dan host.

    nsenter -t <container PID> tcpdump -i any -n -s 0 tcp and host <node IP address>

    Jalankan perintah berikut untuk mengambil paket jaringan antara host dan database.

    tcpdump -i any -n -s 0 tcp and host <database IP address> 
6. Optimalkan aplikasi
  • Implementasikan mekanisme koneksi ulang otomatis di aplikasi Anda untuk memastikan dapat memulihkan koneksi secara otomatis selama alih bencana atau migrasi database.

  • Gunakan koneksi persisten alih-alih koneksi singkat untuk berkomunikasi dengan database. Koneksi persisten dapat secara signifikan mengurangi overhead kinerja dan konsumsi sumber daya, meningkatkan efisiensi sistem secara keseluruhan.

Pemecahan masalah konsol

Login ke Konsol ACK dan buka halaman detail kluster Anda untuk memecahkan masalah Pod.

Tindakan

Konsol

Periksa status Pod

  1. Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Workloads > Pods.

  2. Di pojok kiri atas halaman Pods, pilih Namespace Pod dan periksa statusnya.

    • Jika statusnya Running, Pod berfungsi seperti yang diharapkan.

    • Jika statusnya bukan Running, Pod berada dalam status tidak normal. Lihat topik ini untuk langkah-langkah pemecahan masalah.

Periksa informasi dasar Pod

  1. Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Workloads > Pods.

  2. Di pojok kiri atas halaman Pods, pilih Namespace Pod target. Lalu, klik nama Pod atau klik Details di kolom Actions untuk melihat detail seperti nama Pod, gambar, alamat IP, dan node tempatnya berjalan.

Periksa konfigurasi Pod

  1. Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Workloads > Pods.

  2. Di pojok kiri atas halaman Pods, pilih Namespace Pod target. Lalu, klik nama Pod atau klik Details di kolom Actions.

  3. Di pojok kanan atas halaman detail Pod, klik Edit YAML untuk melihat file konfigurasi YAML Pod.

Periksa event Pod

  1. Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Workloads > Pods.

  2. Di pojok kiri atas halaman Pods, pilih Namespace Pod target. Lalu, klik nama Pod atau klik Details di kolom Actions.

  3. Di bagian bawah halaman detail Pod, klik tab Events untuk melihat event Pod.

    Catatan

    Secara default, Kubernetes menyimpan event selama satu jam terakhir. Untuk menyimpan event lebih lama, lihat Membuat dan menggunakan Pusat Insiden K8s.

Lihat log Pod

  1. Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Workloads > Pods.

  2. Di pojok kiri atas halaman Pods, pilih Namespaces Pod target. Lalu, klik nama Pod atau klik Details di kolom Actions.

  3. Di bagian bawah halaman detail Pod, klik tab Logs untuk melihat log Pod.

Catatan

Kluster ACK terintegrasi dengan Simple Log Service (SLS). Anda dapat mengaktifkan SLS di kluster Anda untuk mengumpulkan log kontainer dengan cepat. Untuk informasi lebih lanjut, lihat Mengumpulkan log kontainer dari kluster ACK.

Periksa data pemantauan Pod

  1. Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Operations > Prometheus Monitoring.

  2. Di halaman Prometheus Monitoring, klik tab Cluster Overview untuk melihat dasbor pemantauan CPU, memori, dan I/O jaringan Pod.

Catatan

Kluster ACK terintegrasi dengan Managed Service for Prometheus. Anda dapat dengan cepat mengaktifkan Managed Service for Prometheus untuk kluster Anda guna memantau kesehatan kluster dan kontainer secara real-time serta melihat dasbor Grafana. Untuk informasi lebih lanjut, lihat Menghubungkan dan mengonfigurasi Managed Service for Prometheus.

Gunakan terminal untuk mengakses kontainer dan melihat file lokal

  1. Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Workloads > Pods.

  2. Di halaman Pods, temukan Pod target dan klik Terminal di kolom Actions.

Jalankan diagnostik Pod

  1. Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Workloads > Pods.

  2. Di halaman Pods, temukan Pod target dan klik Diagnose di kolom Actions. Selesaikan masalah yang teridentifikasi berdasarkan hasil diagnostik.

Catatan

Container Intelligent Service menyediakan fitur diagnostik satu klik untuk membantu Anda mengidentifikasi masalah di kluster Anda. Untuk informasi lebih lanjut, lihat Menggunakan diagnostik kluster.

Penghapusan Pod tidak terduga

Saat kluster berisi banyak Pod dengan status Completed, kube-controller-manager (KCM) melakukan pengumpulan sampah untuk mencegah degradasi kinerja pengontrolnya. Pembersihan ini terjadi ketika jumlah Pod selesai melebihi ambang batas default 12.500. Parameter --terminated-pod-gc-threshold mengonfigurasi ambang batas ini. Untuk informasi lebih lanjut, lihat dokumentasi parameter KCM komunitas.

Rekomendasi: Bersihkan secara berkala Pod dengan status Completed di kluster Anda untuk mencegahnya memengaruhi efisiensi pengontrol.