Memecahkan masalah pengambilan gambar


Halaman ini membantu Anda menyelesaikan masalah terkait proses penarikan image di Google Kubernetes Engine (GKE). Jika Anda menggunakan streaming Image, lihat Memecahkan masalah streaming Image untuk mendapatkan saran. Halaman ini berfokus pada penarikan gambar standar.

Halaman ini ditujukan bagi developer Aplikasi yang ingin memastikan aplikasi mereka berhasil di-deploy, serta bagi admin dan operator Platform yang ingin memahami penyebab utama kegagalan penarikan image dan memverifikasi konfigurasi platform. Untuk mempelajari lebih lanjut peran umum dan contoh tugas yang kami rujuk dalam Trusted Cloud by S3NS konten, lihat Peran dan tugas pengguna GKE umum.

Proses penarikan image adalah cara Kubernetes, dan oleh karena itu GKE, mengambil image container dari registry. Jika penarikan gambar gagal, Anda mungkin melihat aplikasi Anda berjalan lambat, atau aplikasi Anda tidak berfungsi sama sekali.

Untuk menentukan apakah penarikan image adalah penyebab aplikasi Anda tidak berfungsi, halaman ini membantu Anda mendiagnosis kegagalan penarikan image dengan menemukan dan memahami pesan error yang relevan. Kemudian, Anda akan mempelajari cara mengatasi penyebab umum kegagalan penarikan gambar berikut:

  • Setelan autentikasi: cluster Anda tidak memiliki izin yang diperlukan untuk mengakses registry image container.
  • Konektivitas jaringan: cluster Anda tidak dapat terhubung ke registry karena masalah DNS, aturan firewall, atau kurangnya akses internet di cluster yang menggunakan isolasi jaringan.
  • Gambar tidak ditemukan di registry: nama atau tag gambar yang ditentukan salah, gambar telah dihapus, atau registry tidak tersedia.
  • Batasan performa: ukuran gambar yang besar, I/O disk yang lambat, atau kemacetan jaringan dapat menyebabkan penarikan yang lambat atau waktu tunggu habis.
  • Arsitektur image tidak kompatibel: image dibuat untuk arsitektur CPU yang berbeda dengan kumpulan node GKE Anda.
  • Versi skema yang tidak kompatibel: Anda mungkin menggunakan containerd 2.0 atau yang lebih baru dengan skema Docker v1, yang tidak didukung.

Jika Anda sudah melihat pesan peristiwa tertentu, telusuri pesan tersebut di halaman ini dan ikuti langkah-langkah pemecahan masalah yang tercantum. Jika Anda belum melihat pesan, lakukan langkah-langkah di bagian berikut secara berurutan. Jika masalah berlanjut, hubungi Cloud Customer Care.

Memahami penarikan image

Sebelum Anda mulai memecahkan masalah, sebaiknya pahami sedikit lebih banyak tentang siklus proses gambar dan tempat Anda dapat menghosting gambar.

Siklus proses gambar

Saat Anda membuat Pod, kubelet menerima definisi Pod, yang mencakup spesifikasi untuk image. Kubelet memerlukan image ini agar dapat menjalankan container berdasarkan image tersebut. Sebelum menarik image, kubelet memeriksa runtime container untuk melihat apakah image ada. Kubelet juga memeriksa kebijakan penarikan image Pod. Jika image tidak ada di cache runtime container, atau jika kebijakan pull image mewajibkannya, kubelet akan mengarahkan runtime container (containerd) untuk menarik image yang ditentukan dari registry. Penarikan image yang gagal mencegah container di Pod dimulai.

Setelah pull image berhasil, runtime container akan mengekstrak image untuk membuat sistem file dasar hanya baca untuk container. Runtime container menyimpan image ini dan image tetap ada selama container yang berjalan mereferensikannya. Jika tidak ada container yang sedang berjalan yang mereferensikan image, image tersebut akan memenuhi syarat untuk pengumpulan sampah dan kubelet akan menghapusnya.

Opsi hosting gambar

Sebaiknya gunakan salah satu opsi berikut untuk menghosting gambar Anda:

  • Artifact Registry: Artifact Registry adalah pengelola paket yang terkelola sepenuhnya dari Google. Artifact Registry terintegrasi erat dengan layanan Trusted Cloud by S3NS lainnya dan menawarkan kontrol akses terperinci. Untuk mempelajari lebih lanjut, lihat Bekerja dengan image container dalam dokumentasi Artifact Registry.

  • Registry yang dihosting sendiri: registry yang dihosting sendiri memberi Anda lebih banyak kontrol, tetapi Anda juga harus mengelola registry tersebut. Pertimbangkan opsi ini jika Anda memiliki kebutuhan kepatuhan atau keamanan tertentu yang tidak dapat dipenuhi oleh Artifact Registry.

Mendiagnosis kegagalan penarikan image

Untuk mendiagnosis kegagalan penarikan image, lakukan penyelidikan yang dijelaskan di bagian berikut:

  1. Melihat status dan peristiwa Pod.
  2. Memahami arti status.
  3. Gunakan pesan peristiwa untuk menemukan penyebab kegagalan penarikan gambar.
  4. Melihat log Logs Explorer.

Melihat status dan peristiwa Pod

Untuk membantu Anda memverifikasi bahwa penarikan image gagal, GKE mencatat status berikut untuk Pod:

  • ImagePullBackOff
  • ErrImagePull
  • ImageInspectError
  • InvalidImageName
  • RegistryUnavailable
  • SignatureValidationFailed

ImagePullBackOff dan ErrImagePull adalah status yang paling umum.

Selain status ini, peristiwa Kubernetes membantu Anda menemukan penyebab kegagalan pengambilan image.

Untuk mengonfirmasi apakah penarikan image Anda gagal, periksa pesan status, lalu baca pesan peristiwa dengan memilih salah satu opsi berikut:

Konsol

Selesaikan langkah-langkah berikut:

  1. Di konsol Trusted Cloud , buka halaman Workloads.

    Buka Workloads

  2. Pilih beban kerja yang ingin Anda selidiki. Jika Anda tidak yakin beban kerja mana yang perlu diperiksa, tinjau kolom Status. Kolom ini menunjukkan beban kerja mana yang mengalami masalah.

  3. Di halaman Details untuk workload, temukan bagian Managed pods, lalu klik nama Pod dengan status yang menunjukkan kegagalan penarikan image.

  4. Di halaman Details untuk Pod, klik tab Events.

  5. Tinjau informasi dalam tabel. Kolom Message mencantumkan peristiwa Kubernetes, yang menampilkan informasi selengkapnya tentang kegagalan penarikan image. Kolom Alasan mencantumkan status Pod.

kubectl

Selesaikan langkah-langkah berikut:

  1. Melihat status Pod Anda:

    kubectl get pods -n NAMESPACE
    

    Ganti NAMESPACE dengan namespace tempat Pod Anda berjalan.

    Outputnya mirip dengan hal berikut ini:

    NAME         READY   STATUS       RESTARTS      AGE
    POD_NAME_1   2/2     Running      0             7d5h
    POD_NAME_2   0/1     ErrImagePull 0             7d5h
    

    Kolom Status menunjukkan Pod mana yang mengalami kegagalan penarikan gambar.

  2. Melihat peristiwa untuk Pod dengan kegagalan pengambilan image:

    kubectl describe POD_NAME -n NAMESPACE
    

    Ganti POD_NAME dengan nama Pod yang Anda identifikasi di langkah sebelumnya.

    Bagian Events menampilkan informasi selengkapnya tentang apa yang terjadi selama penarikan gambar yang gagal.

    Outputnya mirip dengan hal berikut ini:

    ...
    Events:
      Type    Reason    Age               From           Message
      ----    ------    ----              ----           -------
      Warning  Failed   5m (x4 over 7m)   kubelet, NODE  Failed to pull image "IMAGE_ADDRESS": rpc error: code = Unknown desc = Error response from daemon: repository IMAGE_ADDRESS not found
      Warning  Failed   5m (x4 over 7m)   kubelet, NODE  Error: ErrImagePull
      Normal   BackOff  5m (x6 over 7m)   kubelet, NODE  Back-off pulling image "IMAGE_ADDRESS"
      Warning  Failed   2m (x20 over 7m)  kubelet, NODE  Error: ImagePullBackOff
    

    Dalam output ini, IMAGE_ADDRESS adalah alamat lengkap gambar. Contoh, us-west1-docker.pkg.dev/my-project/my-repo/test:staging.

Memahami arti status

Untuk lebih memahami arti berbagai status, lihat deskripsi berikut:

  • ImagePullBackOff: kubelet gagal menarik image, tetapi akan terus mencoba lagi dengan penundaan (atau backoff) yang meningkat hingga lima menit.
  • ErrImagePull: error umum yang tidak dapat dipulihkan selama proses penarikan image.
  • ImageInspectError: runtime container mengalami masalah saat mencoba memeriksa image container.
  • InvalidImageName: nama image container yang ditentukan dalam definisi Pod Anda tidak valid.
  • RegistryUnavailable: registri tidak dapat diakses. Masalah ini biasanya adalah masalah konektivitas jaringan.
  • SignatureValidationFailed: tanda tangan digital gambar penampung tidak dapat diverifikasi.

Menggunakan pesan peristiwa untuk menemukan penyebab kegagalan penarikan image

Tabel berikut mencantumkan pesan peristiwa yang terkait dengan kegagalan penarikan image dan langkah-langkah pemecahan masalah yang harus Anda ikuti jika menemukan salah satu pesan ini.

Pesan yang terkait dengan kegagalan penarikan gambar sering kali memiliki awalan berikut:

Failed to pull image "IMAGE_ADDRESS": rpc error: code = CODE = failed to pull and unpack image "IMAGE_ADDRESS": failed to resolve reference "IMAGE_ADDRESS":

Pesan ini mencakup nilai-nilai berikut:

  • IMAGE_ADDRESS: alamat lengkap gambar. Contoh, us-west1-docker.pkg.dev/my-project/my-repo/test:staging.
  • CODE: kode error yang terkait dengan pesan log. Misalnya, NotFound atau Unknown.

Beberapa penyebab kegagalan penarikan image tidak memiliki pesan peristiwa terkait. Jika Anda tidak melihat pesan peristiwa apa pun dalam tabel berikut, tetapi masih mengalami masalah penarikan gambar, sebaiknya lanjutkan membaca bagian halaman lainnya.

Pesan peristiwa Pemecahan masalah mendetail
Autentikasi
  • Failed to authorize: failed to fetch oauth token: unexpected status: 403 Forbidden
  • Pulling from host HOST_NAME failed with status code: 403 Forbidden
  • Failed to authorize: failed to fetch oauth token: unexpected status: 401 Unauthorized
  • Unexpected status code [manifests 1.0]: 401 Unauthorized

Konektivitas jaringan
  • Failed to do request: Head "IMAGE_ADDRESS": dial tcp: lookup gcr.io on REGISTRY_IP_ADDRESS: server misbehaving
  • Failed to start Download and install k8s binaries and configurations
  • Failed to do request: Head "IMAGE_ADDRESS": dial tcp REGISTRY_IP_ADDRESS: i/o timeout
Gambar tidak ditemukan
  • "IMAGE_ADDRESS": not found
  • Failed to copy: httpReadSeeker: failed open: could not fetch content descriptor sha256:SHA_HASH (application/vnd.docker.container.image.v1+json) from remote: not found
Waktu tunggu gambar
  • Unknown desc = context canceled
Skema tidak kompatibel
  • Failed to get converter for "IMAGE_ADDRESS": Pulling Schema 1 images have been deprecated and disabled by default since containerd v2.0. As a workaround you may set an environment variable `CONTAINERD_ENABLE_DEPRECATED_PULL_SCHEMA_1_IMAGE=1`, but this will be completely removed in containerd v2.1.

Melihat log Logs Explorer

Untuk memeriksa peristiwa penarikan image historis atau mengorelasikan kegagalan penarikan image dengan aktivitas komponen lain, lihat log dengan Logs Explorer:

  1. Di konsol Trusted Cloud , buka halaman Logs Explorer.

    Buka Logs Explorer

  2. Di panel kueri, masukkan kueri berikut:

    log_id("events")
    resource.type="k8s_pod"
    resource.labels.cluster_name="CLUSTER_NAME"
    jsonPayload.message=~"Failed to pull image"
    

    Ganti CLUSTER_NAME dengan nama cluster tempat Pod dengan error penarikan image berjalan.

  3. Klik Jalankan kueri dan tinjau hasilnya.

Menyelidiki setelan autentikasi

Bagian berikut membantu Anda memverifikasi bahwa lingkungan GKE Anda memiliki setelan autentikasi yang tepat untuk menarik image dari repositori.

Untuk memeriksa apakah Anda mengalami masalah autentikasi yang menyebabkan masalah penarikan gambar, lakukan penyelidikan yang dijelaskan di bagian berikut:

  1. Verifikasi akses ke gambar.
  2. Verifikasi konfigurasi imagePullSecret dan spesifikasi Deployment.
  3. Verifikasi status aktif akun layanan node.
  4. Memverifikasi cakupan akses node untuk repositori Artifact Registry pribadi
  5. Verifikasi setelan Kontrol Layanan VPC untuk mengakses Artifact Registry.

Memverifikasi akses ke gambar

Jika Anda mengalami error penarikan image 403 Forbidden, pastikan komponen yang diperlukan dapat mengakses image container.

Metode untuk memverifikasi dan menerapkan peran yang diperlukan untuk memberikan akses yang diperlukan berbeda-beda, bergantung pada jenis repositori yang menyimpan gambar Anda. Untuk memverifikasi dan memberikan akses, pilih salah satu opsi berikut:

Artifact Registry

Jika Anda menggunakan imagePullSecret, akun layanan yang ditautkan dengan Secret memerlukan izin baca ke repositori. Jika tidak, akun layanan node pool memerlukan izin.

  1. Ikuti petunjuk dalam dokumentasi IAM untuk melihat peran yang ditetapkan ke akun layanan Anda.
  2. Jika akun layanan Anda tidak memiliki peran IAM Pembaca Artifact Registry (roles/artifactregistry.reader), berikan peran tersebut:

    gcloud artifacts repositories add-iam-policy-binding REPOSITORY_NAME \
        --location=REPOSITORY_LOCATION \
        --member=serviceAccount:SERVICE_ACCOUNT_EMAIL \
        --role="roles/artifactregistry.reader"
    

    Ganti kode berikut:

    • REPOSITORY_NAME: nama repositori Artifact Registry Anda.
    • REPOSITORY_LOCATION: region repositori Artifact Registry Anda.
    • SERVICE_ACCOUNT_EMAIL: alamat email akun layanan yang diperlukan. Jika Anda tidak mengetahui alamatnya, cantumkan semua alamat email akun layanan di project Anda menggunakan perintah gcloud iam service-accounts list.

Container Registry

Jika Anda menggunakan imagePullSecret, akun layanan yang ditautkan dengan Secret memerlukan izin baca ke repositori. Jika tidak, akun layanan node pool memerlukan izin.

  1. Ikuti petunjuk dalam dokumentasi IAM untuk melihat peran yang ditetapkan ke akun layanan Anda.
  2. Jika akun layanan Anda tidak memiliki peran IAM Storage Object Viewer (roles/storage.objectViewer), berikan peran tersebut agar akun layanan dapat membaca dari bucket:

    gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
        --member=serviceAccount:SERVICE_ACCOUNT_EMAIL \
        --role=roles/storage.objectViewer
    

    Ganti kode berikut:

    • SERVICE_ACCOUNT_EMAIL: email akun layanan yang diperlukan. Anda dapat mencantumkan semua akun layanan di project Anda dengan menggunakan perintah gcloud iam service-accounts list.
    • BUCKET_NAME: nama bucket Cloud Storage yang berisi image Anda. Anda dapat mencantumkan semua bucket di project Anda dengan menggunakan perintah gcloud storage ls.

Jika administrator registry Anda menyiapkan repositori gcr.io di Artifact Registry untuk menyimpan image bagi domain gcr.io, dan bukan di Container Registry, Anda harus memberikan akses baca ke Artifact Registry, bukan Container Registry.

Registry yang dihosting sendiri

Bergantung pada cara Anda mengonfigurasi registry yang dihosting sendiri, Anda mungkin memerlukan kunci, sertifikat, atau keduanya untuk mengakses image.

Jika Anda menggunakan kunci, gunakan imagePullSecret. imagePullSecret adalah cara aman untuk memberikan kredensial yang diperlukan cluster Anda untuk mengakses registry yang dihosting sendiri. Untuk contoh yang menunjukkan cara mengonfigurasi imagePullSecret, lihat Menarik Image dari Registry Pribadi dalam dokumentasi Kubernetes.

Untuk mengamankan koneksi HTTPS ke registry Anda, Anda mungkin juga memerlukan sertifikat, yang memverifikasi integritas koneksi ke server jarak jauh. Sebaiknya gunakan Secret Manager untuk mengelola Otoritas Sertifikat yang ditandatangani sendiri. Untuk mempelajari lebih lanjut, lihat Mengakses registry pribadi dengan sertifikat CA pribadi.

Verifikasi konfigurasi imagePullSecret dan spesifikasi Deployment

Jika Anda menggunakan imagePullSecret, pastikan Anda telah membuat Secret yang menyimpan kredensial autentikasi untuk menarik image dan semua Deployment menentukan Secret yang Anda tentukan. Untuk mengetahui informasi selengkapnya, lihat Menentukan imagePullSecrets di Pod dalam dokumentasi Kubernetes.

Memverifikasi status aktif akun layanan node

Jika Anda mengalami error penarikan gambar 401 Unauthorized, pastikan akun layanan node aktif. Meskipun izin dikonfigurasi dengan benar, akun yang dinonaktifkan akan memunculkan error ini. Untuk memverifikasi status aktif akun layanan node, pilih salah satu opsi berikut:

Konsol

  1. Temukan nama akun layanan yang digunakan node Anda:

    1. Di konsol Trusted Cloud , buka halaman Clusters.

      Buka Cluster

    2. Di daftar cluster, klik nama cluster yang ingin Anda periksa.

    3. Temukan nama akun layanan node.

      • Untuk cluster mode Autopilot, di bagian Security, temukan kolom Service account.
      • Untuk cluster mode Standard, lakukan hal berikut:
      1. Klik tab Nodes.
      2. Di tabel Node pool, klik nama node pool. Halaman Node pool details akan terbuka.
      3. Di bagian Security, temukan kolom Service account.

      Jika nilai di kolom Service account adalah default, node Anda akan menggunakan akun layanan default Compute Engine. Jika nilai di kolom ini bukan default, node Anda menggunakan akun layanan kustom.

  2. Periksa apakah akun layanan node dinonaktifkan:

    1. Di konsol Trusted Cloud , buka halaman Service accounts.

      Buka halaman Service accounts

    2. Pilih project.

    3. Cari nama akun layanan yang Anda identifikasi di langkah sebelumnya.

    4. Periksa kolom Status untuk akun tersebut. Jika akun layanan dinonaktifkan, akun tersebut memiliki status Disabled.

gcloud

  1. Temukan nama akun layanan yang digunakan node Anda:

    • Untuk cluster mode Autopilot, jalankan perintah berikut:
    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --flatten=autoscaling.autoprovisioningNodePoolDefaults.serviceAccount
    
    • Untuk cluster mode Standard, jalankan perintah berikut:
    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --format="table(nodePools.name,nodePools.config.serviceAccount)"
    

    Jika outputnya adalah default, node Anda menggunakan akun layanan default Compute Engine. Jika outputnya bukan default, node Anda menggunakan akun layanan kustom.

  2. Periksa apakah akun layanan node dinonaktifkan:

    gcloud iam service-accounts list --filter="email:SERVICE_ACCOUNT_NAME AND disabled:true" \
    --project=PROJECT_ID
    

    Jika perintah menampilkan output, akun layanan dinonaktifkan.

Jika akun layanan dinonaktifkan, aktifkan akun layanan node.

Memverifikasi cakupan akses node untuk repositori Artifact Registry pribadi

Jika Anda menyimpan image container di repositori Artifact Registry pribadi, node Anda mungkin tidak memiliki cakupan akses yang benar. Jika hal ini terjadi, Anda mungkin melihat error penarikan image 401 Unauthorized.

Untuk memverifikasi cakupan akses dan memberikan akses jika diperlukan, ikuti langkah-langkah berikut:

  1. Identifikasi node yang menjalankan Pod:

    kubectl describe pod POD_NAME | grep "Node:"
    

    Ganti POD_NAME dengan nama Pod yang mengalami kegagalan penarikan image.

  2. Pastikan node yang Anda identifikasi pada langkah sebelumnya memiliki cakupan penyimpanan yang benar:

    gcloud compute instances describe NODE_NAME \
        --zone="COMPUTE_ZONE" \
        --format="flattened(serviceAccounts[].scopes)"
    

    Ganti kode berikut:

    • NODE_NAME: nama node yang Anda identifikasi pada langkah sebelumnya.
    • COMPUTE_ZONE: zona Compute Engine tempat node berada.

    Output harus berisi setidaknya salah satu cakupan akses berikut:

    • serviceAccounts[0].scopes[0]: https://www.googleapis.com/auth/devstorage.read_only
    • serviceAccounts[0].scopes[0]: https://www.googleapis.com/auth/cloud-platform

    Jika node tidak berisi salah satu cakupan ini, penarikan image akan gagal.

  3. Buat ulang node pool tempat node tersebut berada dengan cakupan yang memadai. Karena Anda tidak dapat mengubah node yang sudah ada, Anda harus membuat ulang node dengan cakupan yang benar.

    Sebaiknya buat node pool dengan cakupan gke-default. Cakupan ini memberikan akses ke cakupan berikut:

    • https://www.googleapis.com/auth/devstorage.read_only
    • https://www.googleapis.com/auth/logging.write
    • https://www.googleapis.com/auth/monitoring
    • https://www.googleapis.com/auth/service.management.readonly
    • https://www.googleapis.com/auth/servicecontrol
    • https://www.googleapis.com/auth/trace.append

    Jika cakupan gke-default tidak sesuai, berikan cakupan devstorage.read_only ke kumpulan node, yang memungkinkan akses hanya untuk membaca data.

    gke-default

    Buat node pool dengan cakupan gke-default:

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --scopes="gke-default"
    

    Ganti kode berikut:

    • NODE_POOL_NAME: nama node pool baru.
    • CLUSTER_NAME: nama cluster yang ada.
    • CONTROL_PLANE_LOCATION: lokasi Compute Engine bidang kontrol cluster Anda. Berikan region untuk cluster regional, atau zona untuk cluster zona.

    devstorage.read_only

    Buat node pool dengan cakupan devstorage.read_only:

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --scopes="https://www.googleapis.com/auth/devstorage.read_only"
    

    Ganti kode berikut:

    • NODE_POOL_NAME: nama node pool baru.
    • CLUSTER_NAME: nama cluster yang ada.
    • CONTROL_PLANE_LOCATION: lokasi Compute Engine bidang kontrol cluster Anda. Berikan region untuk cluster regional, atau zona untuk cluster zona.

Verifikasi setelan Kontrol Layanan VPC untuk mengakses Artifact Registry

Jika Anda menggunakan Kontrol Layanan VPC, pastikan perimeter layanan mengizinkan akses ke Artifact Registry. Untuk mempelajari lebih lanjut, lihat Melindungi repositori di perimeter layanan dalam dokumentasi Artifact Registry.

Menyelidiki konektivitas jaringan

Selama penarikan image, konektivitas jaringan dapat mencegah proses selesai.

Untuk memeriksa apakah masalah konektivitas jaringan menyebabkan masalah penarikan gambar, lakukan penyelidikan yang dijelaskan di bagian berikut:

  1. Selidiki resolusi DNS.
  2. Periksa konfigurasi firewall Anda.
  3. Menyelidiki konektivitas internet endpoint registry eksternal.
  4. Selidiki apakah koneksi ke Google API mengalami waktu tunggu habis.

Menyelidiki resolusi DNS

Jika Anda melihat error penarikan image server misbehaving, resolusi DNS mungkin menjadi penyebab kegagalan penarikan image.

Untuk menyelidiki masalah pada resolusi DNS, coba solusi berikut:

  1. Memecahkan masalah server metadata. Server metadata node menyelesaikan semua kueri DNS. Masalah apa pun yang melibatkan server ini dapat mengganggu resolusi nama, mencegah koneksi ke repositori, dan menyebabkan penarikan image gagal.
  2. Jika Anda menggunakan Cloud DNS untuk resolusi DNS, pastikan zona pribadi terkelola, zona penerusan, zona peering, dan kebijakan respons Cloud DNS Anda dikonfigurasi dengan benar. Kesalahan konfigurasi di area ini dapat mengganggu resolusi DNS. Untuk mempelajari Cloud DNS lebih lanjut, lihat Menggunakan Cloud DNS untuk GKE. Untuk mengetahui saran tentang cara memecahkan masalah Cloud DNS di GKE, lihat Memecahkan masalah Cloud DNS di GKE.
  3. Jika Anda menggunakan kube-dns untuk resolusi DNS, pastikan kube-dns berfungsi dengan benar. Untuk mengetahui saran tentang cara memecahkan masalah kube-dns, lihat Memecahkan masalah kube-dns di GKE.
  4. Jika node cluster tidak memiliki alamat IP eksternal (yang umum terjadi jika Anda menggunakan isolasi jaringan), aktifkan Akses Google Pribadi di subnetwork yang digunakan oleh cluster dan pastikan Anda memenuhi persyaratan jaringan. Jika Anda menggunakan Cloud NAT, Trusted Cloud by S3NS Akses Google Pribadi akan diaktifkan secara otomatis.

Menyelidiki konfigurasi firewall Anda

Jika masalah pada firewall menyebabkan penarikan image gagal, Anda mungkin melihat pesan error berikut:

Failed to start Download and install k8s binaries and configurations

Mendiagnosis masalah pada firewall

Jika Anda menggunakan cluster Standar dan ingin mengonfirmasi apakah masalah pada firewall menyebabkan masalah pada penarikan image, ikuti langkah-langkah berikut:

  1. Gunakan SSH untuk terhubung ke node yang mengalami masalah:

    gcloud compute ssh NODE_NAME --zone=ZONE_NAME
    

    Ganti kode berikut:

  2. Kirim log terbaru untuk Layanan kube-node-installation.service dan kube-node-configuration.service ke file teks bernama kube-node-installation_status.txt dan kube-node-configuration_status.txt:

    systemctl status kube-node-installation.service > kube-node-installation_status.txt
    systemctl status kube-node-configuration.service > kube-node-configuration_status.txt
    

    Jika log ini tidak menyertakan informasi dari saat penarikan gambar Anda gagal, buat salinan lengkap log:

    sudo journalctl -u kube-node-installation.service > kube-node-installation_logs.txt
    sudo journalctl -u kube-node-configuration.service > kube-node-configuration_logs.txt
    
  3. Tinjau konten kube-node-installation_status.txt dan kube-node-configuration_status.txt serta file. Jika Anda melihat i/o timeout dalam output, kemungkinan masalahnya ada pada firewall Anda.

Menyelesaikan masalah konfigurasi firewall

Untuk mengatasi masalah dengan firewall Anda, coba solusi berikut:

  1. Identifikasi dan selesaikan aturan firewall yang memblokir traffic jaringan. Misalnya, Anda mungkin memiliki aturan yang memblokir traffic ke registry yang menyimpan image Anda.

    1. Mengakses Log Aliran VPC:

      1. Di konsol Trusted Cloud , buka halaman Logs Explorer.

        Buka Logs Explorer

      2. Di panel kueri, masukkan kueri berikut:

        resource.type="gce_subnetwork"
        logName="projects/PROJECT_ID/logs/[compute.googleapis.com%2Fvpc_flows](http://compute.googleapis.com%2Fvpc_flows)"
        resource.labels.subnetwork_name="SUBNET_NAME",
        

        Ganti kode berikut:

        • PROJECT_ID: ID Trusted Cloud project Anda.
        • SUBNET_NAME: nama subnetwork Anda.

        Untuk mempelajari lebih lanjut, lihat Mengakses log alur menggunakan kueri dalam dokumentasi VPC.

    2. Jika Anda menemukan aturan firewall yang memblokir traffic yang diperlukan, perbarui aturan tersebut.

  2. Jika node cluster tidak memiliki alamat IP eksternal (yang umum terjadi jika Anda menggunakan isolasi jaringan), aktifkan Akses Google Pribadi di subnetwork yang digunakan oleh cluster dan pastikan Anda memenuhi persyaratan jaringan. Jika Anda menggunakan Cloud NAT, Trusted Cloud by S3NS Akses Google Pribadi akan diaktifkan secara otomatis.

Menyelidiki konektivitas internet endpoint registry eksternal

Jika konfigurasi jaringan Anda mengarahkan traffic melalui endpoint registry eksternal, endpoint tersebut mungkin tidak memiliki konektivitas internet. Jika endpoint tidak memiliki akses, penarikan image mungkin gagal dan Anda akan melihat error penarikan image i/o timeout.

Untuk memeriksa konektivitas jaringan dari endpoint registry eksternal ke registry, gunakan ping atau traceroute:

ping REGISTRY_ENDPOINT

Atau

traceroute REGISTRY_ENDPOINT

Ganti REGISTRY_ENDPOINT dengan endpoint registry. Nilai ini dapat berupa nama host atau alamat IP.

Jika Anda menemukan error pada konektivitas, tinjau rute VPC:

  1. Di konsol Trusted Cloud , buka Routes.

    Buka Rute

  2. Tinjau kolom Prioritas dan pastikan rute dengan prioritas tertinggi menuju ke sumber yang memiliki akses ke registri. Rute dengan nilai yang lebih rendah akan diutamakan.

Menyelidiki apakah koneksi ke Google API mengalami waktu tunggu habis

Jika Anda menggunakan isolasi jaringan, Anda mungkin mengalami error saat koneksi ke Google API dan layanan Google berakhir, sehingga menyebabkan error penarikan image i/o timeout.

Error ini terjadi karena node Anda tidak dapat menjangkau salah satu API berikut saat mencoba menarik image dari registry:

  • containerregistry.googleapis.com
  • artifactregistry.googleapis.com

Untuk memastikan Anda dapat terhubung ke API yang diperlukan, coba solusi berikut:

  1. Aktifkan Akses Google Pribadi. Node tanpa alamat IP eksternal memerlukan Akses Google Pribadi untuk menjangkau alamat IP eksternal Google API dan layanan Google.
  2. Gunakan domain yang didukung.
  3. Tinjau kebijakan firewall Anda:

    1. Di konsol Trusted Cloud , buka Firewall policies.

      Buka Kebijakan firewall

    2. Verifikasi apakah Anda memiliki aturan yang memblokir traffic TCP keluar di port 443 ke 199.36.153.4/30, 199.36.153.8/30, atau rentang alamat IP yang digunakan oleh domain pilihan Anda untuk Google API dan layanan Google. Rentang alamat IP 199.36.153.4/30 dan 199.36.153.8/30 digunakan untuk Akses Google Pribadi dan Akses Google Terbatas. Traffic TCP di port 443 ke rentang ini adalah untuk mengakses Google API dan layanan Google.

      Jika Anda menemukan salah satu aturan ini, buat aturan firewall traffic keluar untuk mengizinkan traffic tersebut.

  4. Jika Anda menggunakan Artifact Registry, pastikan lingkungan Anda memenuhi persyaratan untuk menggunakan Artifact Registry dengan isolasi jaringan.

  5. Pastikan alamat IP virtual (VIP) (199.36.153.4/30 atau 199.36.153.8/30) telah mengonfigurasi rute VPC:

    1. Di konsol Trusted Cloud , buka Jaringan VPC.

      Buka jaringan VPC

    2. Di kolom Nama, klik default.

    3. Di halaman detail jaringan VPC, klik tab Routes.

    4. Tinjau tabel rute.

      Jika jaringan VPC Anda berisi rute default (tujuan 0.0.0.0/0 atau ::0/0) dan next hop untuk rute tersebut adalah gateway internet default (Default jaringan), gunakan rute tersebut untuk VIP guna mengakses Google API dan layanan Google.

      Jika Anda mengganti rute default dengan rute kustom yang hop berikutnya bukan gateway internet default, penuhi persyaratan pemilihan rute untuk Google API dan layanan Google dengan menggunakan pemilihan rute kustom.

Menyelidiki alasan kubelet tidak dapat menemukan image Anda

Jika kubelet tidak dapat menemukan image Anda, Anda mungkin melihat error image not found dan mengalami kegagalan penarikan image.

Untuk membantu kubelet menemukan image Anda, coba solusi berikut:

  1. Tinjau manifes Pod Anda dan pastikan nama image dan tag image Anda dieja dengan benar. Kesalahan ejaan atau format akan menyebabkan penarikan gambar gagal.
  2. Pastikan image masih ada di registry tempat Anda menyimpannya. Jika image memiliki jalur registry lengkap, verifikasi bahwa image tersebut ada di registry Docker yang Anda gunakan. Jika Anda hanya memberikan nama image, periksa registry Docker Hub.
  3. Jika cluster Anda menggunakan isolasi jaringan, coba solusi berikut:
    1. Aktifkan Akses Google Pribadi.
    2. Pastikan perimeter layanan Anda dikonfigurasi dengan benar.

Menyelidiki penyebab waktu tunggu penarikan gambar habis atau penarikan gambar lambat

Jika Anda menggunakan image yang sangat besar untuk workload GKE, penarikan image mungkin kehabisan waktu dan menyebabkan error context cancelled. Meskipun gambar tidak memiliki batas ukuran yang ditentukan, error context cancelled sering menunjukkan bahwa ukuran gambar adalah penyebabnya.

Anda mungkin juga melihat penarikan gambar yang tidak gagal, tetapi memerlukan waktu lebih lama dari biasanya. Jika Anda ingin memiliki tolok ukur waktu penarikan gambar reguler, tinjau entri log Successfully pulled image. Misalnya, pesan log berikut menunjukkan bahwa penarikan image memerlukan waktu 30,313387996 detik:

Successfully pulled image "IMAGE_ADDRESS" in 30.313387996s.

Waktu tunggu habis dan penarikan image yang lambat memiliki banyak penyebab yang sama. Untuk mengatasi masalah ini, coba solusi berikut:

  1. Periksa gangguan. Jika Anda hanya melihat masalah ini selama jangka waktu tertentu, periksa apakah ada Trusted Cloud by S3NS gangguan.
  2. Periksa performa disk. I/O disk yang lambat dapat meningkatkan waktu penarikan image. Pertimbangkan untuk mengupgrade ke Persistent Disk dengan SSD (pd-ssd) atau menggunakan disk yang lebih besar untuk meningkatkan performa. Untuk saran lainnya, lihat Memecahkan masalah terkait performa disk.
  3. Kurangi ukuran gambar. Misalnya, Anda dapat memindahkan beberapa data dari image container ke Volume Persisten.
  4. Manfaatkan caching image untuk waktu mulai Pod yang cepat. GKE menyimpan image dalam cache di node. Selama penarikan image, runtime container hanya mendownload lapisan yang belum ada di cache. Untuk memaksimalkan efektivitas mekanisme caching ini dan meminimalkan waktu pull image, susun Dockerfile Anda untuk menempatkan bagian image yang sering berubah (seperti kode aplikasi Anda) di bagian akhir file dan gunakan image dasar yang lebih kecil.
  5. Aktifkan streaming Image. Fitur ini dapat mempercepat startup Pod dan download image. Untuk mempelajari lebih lanjut, lihat bagian Menggunakan streaming Image untuk menarik image container.
  6. Pastikan akun layanan default memiliki izin yang diperlukan. Mengubah peran yang ditetapkan ke akun layanan default dapat mengganggu beban kerja, termasuk penarikan image. Untuk mengetahui saran lainnya, lihat Mengidentifikasi cluster dengan akun layanan node yang tidak memiliki izin penting.
  7. Periksa konfigurasi proxy. Jika ada proxy antara cluster GKE dan repositori yang dikelola non-Google, hal ini dapat menyebabkan latensi.
  8. Periksa software pihak ketiga. Beberapa software pihak ketiga dapat mengganggu penarikan gambar. Selidiki apakah ada alat yang baru saja diinstal yang mungkin menyebabkan konflik.

Pastikan manifes gambar menggunakan arsitektur yang tepat

Jika image yang Anda coba tarik dibuat untuk arsitektur komputer yang berbeda dengan yang digunakan oleh node pool Anda, penarikan image akan gagal.

Untuk mengonfirmasi apakah manifes image Anda menggunakan arsitektur yang tepat, ikuti langkah-langkah berikut:

  1. Untuk mengonfirmasi arsitektur yang digunakan image Anda, lihat manifes untuk image Anda. Misalnya, untuk melihat image Docker, jalankan perintah berikut:

    docker manifest inspect --verbose IMAGE_NAME
    

    Ganti IMAGE_NAME dengan nama image yang ingin Anda lihat.

    Outputnya mirip dengan hal berikut ini:

    ...
    "Platform": {
              "architecture": "amd64",
              "os": "linux"
      }
    ...
    

    Dalam contoh ini, arsitektur yang didukung adalah amd64.

  2. Tinjau jenis mesin yang digunakan oleh node pool Anda:

    gcloud container node-pools list --cluster CLUSTER_NAME --location CONTROL_PLANE_LOCATION
    

    Ganti kode berikut:

    • CLUSTER_NAME: nama cluster tempat Pod dengan error penarikan image berjalan.
    • CONTROL_PLANE_LOCATION: lokasi Compute Engine bidang kontrol cluster Anda. Berikan region untuk cluster regional, atau zona untuk cluster zona.

    Outputnya mirip dengan hal berikut ini:

    NAME: example-node-pool
    MACHINE_TYPE: e2-standard-2
    DISK_SIZE_GB: 100
    NODE_VERSION: 1.30.8-gke.1162000
    

    Dalam contoh ini, jenis mesinnya adalah e2-standard-2.

  3. Bandingkan nilai di kolom architecture dan MACHINE_TYPE, lalu pastikan kedua nilai tersebut kompatibel. Misalnya, jika image memiliki arsitektur amd64, image tersebut akan kompatibel dengan node pool yang menggunakan e2-standard-2 sebagai jenis mesinnya. Namun, jika kumpulan node yang digunakan adalah t2a-standard-1 (jenis mesin berbasis Arm), jenis mesin ini akan menyebabkan kegagalan.

  4. Jika arsitektur image tidak kompatibel dengan jenis mesin kumpulan node, bangun ulang image untuk menargetkan arsitektur yang diperlukan.

Memverifikasi kompatibilitas versi skema gambar

Menggunakan containerd 2.0 dengan image skema Docker v1 menyebabkan penarikan image gagal karena containerd 2.0 menghapus dukungan untuk menarik image Skema 1 Docker di GKE 1.33. Jika masalah ini menjadi penyebab kegagalan penarikan image, Anda mungkin melihat pesan error berikut:

Failed to get converter for "IMAGE_ADDRESS": Pulling Schema 1 images have been deprecated and disabled by default since containerd v2.0. As a workaround you may set an environment variable `CONTAINERD_ENABLE_DEPRECATED_PULL_SCHEMA_1_IMAGE=1`, but this will be completely removed in containerd v2.1.

Untuk mengatasi masalah ini, identifikasi dan migrasikan image tersebut dengan mengikuti petunjuk di Bermigrasi dari image Docker Schema 1.

Langkah berikutnya