Menggunakan streaming Image untuk mengambil image container


Halaman ini menunjukkan cara menggunakan Streaming image di Google Kubernetes Engine (GKE) untuk mengambil image container dengan melakukan streaming data image sesuai kebutuhan aplikasi Anda.

Cluster Autopilot baru yang menjalankan GKE versi 1.25.5-gke.1000 dan yang lebih baru secara otomatis menggunakan streaming Image untuk mengambil image yang memenuhi syarat. Petunjuk di halaman ini hanya berlaku untuk cluster Standard.

Ringkasan

Streaming image adalah metode pengambilan image container di tempat GKE melakukan streaming data dari image yang memenuhi syarat sesuai permintaan aplikasi Anda. Anda dapat menggunakan streaming Image agar workload dapat diinisialisasi tanpa menunggu seluruh image didownload, yang dapat mempersingkat waktu inisialisasi dengan signifikan. Waktu pengambilan yang disingkat memberi Anda manfaat berikut:

  • Penskalaan otomatis yang lebih cepat
  • Mengurangi latensi saat mengambil image berukuran besar
  • Startup Pod yang lebih cepat

Dengan streaming Image, GKE menggunakan sistem file jarak jauh sebagai sistem file root untuk setiap container yang menggunakan image container yang memenuhi syarat. GKE melakukan streaming data image dari sistem file jarak jauh sesuai kebutuhan workload Anda. Tanpa streaming Image, GKE mendownload seluruh image container ke setiap node dan menggunakannya sebagai sistem file root untuk workload Anda.

Saat melakukan streaming data image, GKE mendownload seluruh image container ke disk lokal di latar belakang dan men-cache-nya. GKE kemudian menyajikan permintaan pembacaan data di masa mendatang dari image yang di-cache.

Saat Anda men-deploy workload yang perlu membaca file tertentu di image container, backend streaming Image hanya menyajikan file yang diminta tersebut.

Persyaratan

Anda harus memenuhi persyaratan berikut untuk menggunakan streaming Image di cluster GKE Autopilot dan Standard:

  • Anda harus mengaktifkan Container File System API.

    Aktifkan Container File System API

  • Cluster Autopilot baru harus menjalankan GKE versi 1.25.5-gke.1000 atau yang lebih baru agar streaming Image dapat diaktifkan secara otomatis. Untuk mengetahui petunjuknya, lihat Menetapkan versi dan saluran rilis cluster Autopilot baru.

  • Cluster GKE Standard yang baru dan yang sudah ada harus menjalankan versi 1.18.6-gke.4801 atau yang lebih baru.

  • Anda harus menggunakan Container-Optimized OS dengan image node containerd. Node Autopilot selalu menggunakan image node ini.

  • Image container Anda harus disimpan di Artifact Registry.

  • Jika mengaktifkan node pribadi di cluster, Anda harus mengaktifkan Akses Google Pribadi di subnet agar node dapat mengakses Layanan streaming Image.

  • Jika Kontrol Layanan VPC melindungi image container dan Anda menggunakan streaming Image, Anda juga harus menyertakan Image streaming API (containerfilesystem.googleapis.com) di perimeter layanan.

  • Jika node GKE dalam cluster tidak menggunakan akun layanan default, Anda harus memastikan bahwa akun layanan kustom Anda memiliki peran IAM Service Usage Consumer (roles/serviceusage.serviceUsageConsumer) dalam project yang menghosting image penampung.

Batasan

  • Anda tidak dapat menggunakan Secret untuk mengambil image container di versi GKE sebelum 1.23.5-gke.1900.
  • Image container yang menggunakan Manifes Image V2, skema versi 1 tidak memenuhi syarat.
  • Image container yang dienkripsi dengan kunci enkripsi yang dikelola pelanggan (CMEK) memenuhi syarat untuk streaming Image di GKE versi 1.25.3-gke.1000 atau yang lebih baru. Di versi sebelumnya, GKE mendownload image ini tanpa melakukan streaming data. Anda masih dapat menggunakan CMEK untuk melindungi persistent disk yang terpasang dan boot disk kustom di cluster yang menggunakan streaming Image.
  • Image container dengan lapisan duplikat tidak didukung. GKE mendownload image ini tanpa melakukan streaming data. Periksa apakah ada lapisan kosong atau lapisan duplikat pada image penampung Anda.
  • Repositori Artifact Registry harus berada di region yang sama dengan node GKE Anda, atau di multi-region yang sesuai dengan region tempat node Anda berjalan. Contoh:
    • Jika node Anda berada di us-east1, streaming Image tersedia untuk repositori di region us-east1 atau multi-region us karena GKE dan Artifact Registry berjalan di lokasi pusat data di Amerika Serikat.
    • Jika node Anda berada di region northamerica-northeast1, node tersebut berjalan di Kanada. Dalam situasi ini, streaming Image hanya tersedia untuk repositori di region yang sama.
  • Jika workload Anda membaca banyak file di sebuah image selama inisialisasi, Anda mungkin melihat peningkatan waktu inisialisasi karena latensi yang ditambahkan oleh pembacaan file jarak jauh.
  • Anda mungkin tidak melihat manfaat streaming Image saat pengambilan pertama image yang memenuhi syarat. Namun, setelah streaming Image men-cache image, image di masa mendatang akan mendapatkan manfaat cluster dari streaming Image.
  • Cluster GKE Standard menggunakan konfigurasi level cluster untuk menentukan apakah akan mengaktifkan streaming Image di node pool baru yang dibuat menggunakan penyediaan otomatis node. Namun, Anda tidak dapat menggunakan pemisahan workload untuk membuat node pool dengan streaming Image yang diaktifkan saat streaming Image dinonaktifkan di level cluster.
  • Kemampuan file Linux seperti CAP_NET_RAW didukung dengan streaming Image di GKE versi 1.22.6-gke.300 dan yang lebih baru. Untuk versi GKE sebelumnya, kemampuan ini tidak tersedia saat file image di-streaming, atau saat image disimpan ke disk lokal. Untuk menghindari potensi gangguan, jangan gunakan streaming Image untuk container dengan kemampuan ini di versi GKE sebelum 1.22.6-gke.300. Jika container Anda bergantung pada kemampuan file Linux, container mungkin gagal memulai dengan error izin ditolak saat berjalan dengan streaming Image yang diaktifkan.

Sebelum memulai

Sebelum memulai, pastikan Anda telah menjalankan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Aktifkan Google Kubernetes Engine API
  • Jika ingin menggunakan Google Cloud CLI untuk tugas ini, instal lalu lakukan inisialisasi gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan gcloud components update.

Mengaktifkan streaming Image di cluster

Anda dapat mengaktifkan streaming Image di cluster Standard baru atau yang sudah ada menggunakan flag --enable-image-streaming gcloud CLI, atau konsol Google Cloud. Secara default, node pool di cluster mewarisi setelan streaming Image di level cluster. Anda dapat mengubah perilaku ini dengan mengaktifkan atau menonaktifkan streaming Image di node pool cluster.

Semua cluster Autopilot baru yang menjalankan GKE versi 1.25.5-gke.1000 dan yang lebih baru menggunakan streaming Image untuk mengambil image yang memenuhi syarat. Untuk mengetahui petunjuknya, lihat Menetapkan versi dan saluran rilis cluster Autopilot baru. Petunjuk berikut hanya berlaku untuk cluster GKE Standard.

Di cluster baru

Anda dapat mengaktifkan streaming Image di cluster baru menggunakan gcloud CLI atau konsol Google Cloud.

gcloud

Untuk membuat cluster baru dengan streaming Image yang diaktifkan, jalankan perintah berikut:

gcloud container clusters create CLUSTER_NAME \
    --zone=COMPUTE_ZONE \
    --image-type="COS_CONTAINERD" \
    --enable-image-streaming

Ganti kode berikut:

  • CLUSTER_NAME: nama cluster baru.
  • COMPUTE_ZONE: zona Compute Engine untuk cluster baru Anda. Untuk cluster regional, gunakan flag --region=COMPUTE_REGION. Pastikan zona atau region adalah region yang sama atau berada di multi-region repositori Artifact Registry yang berisi image.

Konsol

  1. Buka halaman Google Kubernetes Engine di konsol Google Cloud.

    Buka Google Kubernetes Engine

  2. Klik Buat.

  3. Di bagian GKE Standard, klik Konfigurasikan.

  4. Dari panel navigasi, pada bagian Cluster, klik Fitur.

  5. Di bagian Lainnya, pilih kotak centang Aktifkan streaming Image.

  6. Konfigurasikan cluster sesuai kebutuhan, lalu klik Buat.

Di cluster yang sudah ada

Anda dapat mengaktifkan streaming Image di cluster yang sudah ada dan memenuhi persyaratan menggunakan gcloud CLI atau konsol Google Cloud.

gcloud

Guna memperbarui cluster yang sudah ada untuk menggunakan streaming Image, jalankan perintah berikut menggunakan gcloud CLI:

gcloud container clusters update CLUSTER_NAME \
    --enable-image-streaming

Konsol

  1. Buka halaman Google Kubernetes Engine di konsol Google Cloud.

    Buka Google Kubernetes Engine

  2. Klik nama cluster yang ingin diubah.

  3. Di halaman Cluster, pada bagian Fitur, klik di samping streaming Image.

  4. Di kotak dialog Edit streaming Image, pilih kotak centang Aktifkan streaming Image.

  5. Klik Simpan perubahan.

Setelah Anda mengubah cluster, GKEakan mengaktifkan streaming Image di node pool yang sudah ada otomatis secara default. Jika Anda secara eksplisit mengaktifkan atau menonaktifkan streaming Image di setiap node pool, node pool tersebut tidak mewarisi perubahan setelan level cluster.

Mengubah setelan streaming Image akan mematuhi ketersediaan pemeliharaan saat diupdate di level cluster, tetapi tidak di level node pool.

Perubahan ini memerlukan pembuatan ulang node, yang dapat menyebabkan gangguan pada workload yang sedang berjalan. Untuk mengetahui detail tentang perubahan khusus ini, temukan baris yang sesuai dalam tabel perubahan manual yang membuat ulang node menggunakan strategi upgrade node dan mematuhi kebijakan pemeliharaan. Untuk mempelajari update node lebih lanjut, lihat Merencanakan gangguan update node.

Memastikan streaming Image diaktifkan di cluster

Anda dapat memeriksa apakah streaming Image diaktifkan di level cluster menggunakan gcloud CLI atau konsol Google Cloud.

gcloud

Jalankan perintah berikut:

gcloud container clusters describe CLUSTER_NAME \
    --flatten "nodePoolDefaults.nodeConfigDefaults"

Setelan ini diaktifkan jika outputnya mirip dengan yang berikut ini:

gcfsConfig:
  enabled: true
...

Setelan ini dinonaktifkan jika outputnya mirip dengan yang berikut ini:

gcfsConfig: {}
...

Konsol

  1. Buka halaman Google Kubernetes Engine di konsol Google Cloud.

    Buka Google Kubernetes Engine

  2. Klik nama cluster yang ingin diperiksa.

  3. Di halaman Cluster, pada bagian Fitur, di samping streaming Image, Anda akan melihat apakah setelan diaktifkan atau tidak.

Mengaktifkan streaming Image di node pool

Secara default, node pool mewarisi setelan streaming Image di level cluster. Anda dapat mengaktifkan atau menonaktifkan streaming Image di node pool tertentu menggunakan gcloud CLI.

Di node pool baru

Untuk membuat node pool baru dengan streaming Image yang diaktifkan, jalankan perintah berikut:

gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --zone=COMPUTE_ZONE \
    --image-type="COS_CONTAINERD" \
    --enable-image-streaming

Ganti kode berikut:

  • NODE_POOL_NAME: nama node pool baru.
  • CLUSTER_NAME: nama cluster untuk node pool.
  • COMPUTE_ZONE: zona Compute Engine cluster Anda. Untuk cluster regional, gunakan flag --region=COMPUTE_REGION.

Di node pool yang sudah ada

Anda dapat mengaktifkan streaming Image di node pool yang sudah ada dan memenuhi persyaratan.

Guna memperbarui node pool yang sudah ada untuk menggunakan streaming Image, jalankan perintah berikut:

gcloud container node-pools update POOL_NAME \
    --cluster=CLUSTER_NAME \
    --enable-image-streaming

Mengubah setelan streaming Image akan mematuhi ketersediaan pemeliharaan saat diupdate di level cluster, tetapi tidak di level node pool.

Perubahan ini memerlukan pembuatan ulang node, yang dapat menyebabkan gangguan pada workload yang sedang berjalan. Untuk mengetahui detail tentang perubahan spesifik ini, temukan baris yang sesuai dalam tabel perubahan manual yang membuat ulang node menggunakan strategi upgrade node tanpa mematuhi kebijakan pemeliharaan. Untuk mempelajari update node lebih lanjut, lihat Merencanakan gangguan update node.

Memastikan streaming Image diaktifkan di node pool

Periksa apakah streaming Image diaktifkan untuk node pool:

gcloud container node-pools describe POOL_NAME \
    --cluster=CLUSTER_NAME \

Setelan ini diaktifkan jika outputnya mirip dengan yang berikut ini:

gcfsConfig:
  enabled: true
...

Setelan ini dinonaktifkan jika outputnya mirip dengan yang berikut ini:

gcfsConfig: {}
...

Menjadwalkan workload menggunakan streaming Image

Setelah Anda mengaktifkan streaming Image di cluster, GKE secara otomatis menggunakan streaming Image saat mengambil image container yang memenuhi syarat dari Artifact Registry tanpa memerlukan konfigurasi lebih lanjut.

GKE menambahkan label cloud.google.com/gke-image-streaming: "true" ke node di node pool dengan streaming Image yang diaktifkan. Di GKE Standard, jika Anda mengaktifkan atau menonaktifkan streaming Image di node pool tertentu sehingga cluster Anda memiliki campuran node yang menggunakan streaming Image dan node yang tidak, Anda dapat menggunakan pemilih node dalam deployment untuk mengontrol apakah GKE menjadwalkan beban kerja Anda di node yang menggunakan streaming Image.

Pada contoh berikut, Anda menjadwalkan Deployment yang menggunakan image container besar di cluster dengan streaming Image diaktifkan. Kemudian, Anda dapat membandingkan performanya dengan image yang diambil tanpa mengaktifkan streaming Image.

  1. Buat cluster baru dengan streaming Image yang diaktifkan:

    gcloud container clusters create CLUSTER_NAME \
        --zone=COMPUTE_ZONE \
        --enable-image-streaming \
        --image-type="COS_CONTAINERD"
    
  2. Dapatkan kredensial untuk cluster:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --zone=COMPUTE_ZONE
    
  3. Simpan manifes berikut sebagai frontend-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: frontend
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: guestbook
          tier: frontend
      template:
        metadata:
          labels:
            app: guestbook
            tier: frontend
        spec:
          containers:
          - name: php-redis
            image: us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5
            env:
            - name: GET_HOSTS_FROM
              value: "dns"
            resources:
              requests:
                cpu: 100m
                memory: 100Mi
            ports:
            - containerPort: 80
    

    Image container gb-frontend berukuran 327 MB.

  4. Terapkan manifes ke cluster Anda:

    kubectl apply -f frontend-deployment.yaml
    
  5. Pastikan GKE membuat Deployment:

    kubectl get pods -l app=guestbook
    

    Outputnya mirip dengan yang berikut ini:

    NAMESPACE    NAME                          READY    STATUS       RESTARTS    AGE
    default      frontend-64bcc69c4b-pgzgm     1/1      Completed    0           3s
    
  6. Dapatkan log aktivitas Kubernetes untuk melihat aktivitas pengambilan image:

    kubectl get events --all-namespaces
    

    Outputnya mirip dengan yang berikut ini:

    NAMESPACE  LAST SEEN  TYPE    REASON          OBJECT                                                 MESSAGE
    default    11m        Normal  Pulling         pod/frontend-64bcc69c4b-pgzgm                          Pulling image "us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5"
    default    11m        Normal  Pulled          pod/frontend-64bcc69c4b-pgzgm                          Successfully pulled image "us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5" in 1.536908032s
    default    11m        Normal  ImageStreaming  node/gke-riptide-cluster-default-pool-f1552ec4-0pjv    Image us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5 is backed by image streaming.
    ...
    

    Dalam output ini:

    • Peristiwa Pulled menunjukkan waktu yang dibutuhkan bagi streaming Image untuk mengambil image.
    • Peristiwa ImageStreaming menunjukkan bahwa node menggunakan streaming Image untuk menyajikan image container.

Membandingkan performa dengan pengambilan image standar

Pada contoh opsional ini, Anda membuat cluster baru dengan streaming Image yang dinonaktifkan dan men-deploy Deployment frontend untuk membandingkan performa dengan streaming Image.

  1. Buat cluster baru dengan streaming Image yang dinonaktifkan:

    gcloud container clusters create CLUSTER2_NAME\
        --zone=COMPUTE_ZONE \
        --image-type="COS_CONTAINERD"
    
  2. Dapatkan kredensial untuk cluster:

    gcloud container clusters get-credentials CLUSTER2_NAME \
        --zone=COMPUTE_ZONE
    
  3. Deploy Deployment frontend dari contoh sebelumnya:

    kubectl apply -f frontend-deployment.yaml
    
  4. Dapatkan log aktivitas Kubernetes:

    kubectl get events --all-namespaces
    

    Outputnya mirip dengan yang berikut ini:

     NAMESPACE  LAST SEEN  TYPE    REASON     OBJECT                             MESSAGE
     default    87s        Normal  Pulled     pod/frontend-64bcc69c4b-qwmfp      Successfully pulled image "us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5" in 23.929723476s
    

    Perhatikan waktu yang dibutuhkan GKE untuk mengambil keseluruhan image. Pada contoh output ini, GKE memerlukan waktu hampir 24 detik. Dengan streaming Image yang diaktifkan, GKE hanya perlu waktu 1,5 detik untuk mengambil data image yang diperlukan oleh workload untuk memulai.

Pembersihan

Agar tidak ditagih, hapus cluster yang Anda buat di contoh sebelumnya:

gcloud container clusters delete CLUSTER_NAME CLUSTER2_NAME

Menonaktifkan streaming Image

Jika menggunakan GKE Autopilot, Anda tidak dapat menonaktifkan streaming Image di masing-masing cluster. Anda dapat menonaktifkan Container File System API yang menonaktifkan streaming Image untuk seluruh project.

Jika menggunakan cluster GKE Standard, Anda dapat menonaktifkan streaming Image di masing-masing cluster atau node pool tertentu, seperti yang dijelaskan di bagian berikut.

Menonaktifkan streaming Image di cluster GKE Standard

Anda dapat menonaktifkan streaming Image di cluster GKE Standard yang sudah ada menggunakan gcloud CLI atau konsol Google Cloud.

gcloud

Untuk menonaktifkan streaming Image di cluster yang sudah ada, jalankan perintah berikut:

gcloud container clusters update CLUSTER_NAME \
    --no-enable-image-streaming

Konsol

  1. Buka halaman Google Kubernetes Engine di konsol Google Cloud.

    Buka Google Kubernetes Engine

  2. Klik nama cluster yang ingin diubah.

  3. Di halaman Cluster, pada bagian Fitur, klik di samping streaming Image.

  4. Di kotak dialog Edit streaming Image, hapus kotak centang Aktifkan streaming Image.

  5. Klik Simpan perubahan.

Mengubah setelan streaming Image akan mematuhi ketersediaan pemeliharaan saat diupdate di level cluster, tetapi tidak di level node pool.

Perubahan ini memerlukan pembuatan ulang node, yang dapat menyebabkan gangguan pada workload yang sedang berjalan. Untuk mengetahui detail tentang perubahan khusus ini, temukan baris yang sesuai dalam tabel perubahan manual yang membuat ulang node menggunakan strategi upgrade node dan mematuhi kebijakan pemeliharaan. Untuk mempelajari update node lebih lanjut, lihat Merencanakan gangguan update node.

Di node pool baru

Untuk menonaktifkan streaming Image saat membuat node pool baru, tentukan flag --no-enable-image-streaming, seperti dalam perintah berikut:

gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --zone=COMPUTE_ZONE \
    --no-enable-image-streaming

Di node pool yang sudah ada

Untuk menonaktifkan streaming Image di node pool yang sudah ada, jalankan perintah berikut:

gcloud container node-pools update NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --no-enable-image-streaming

Mengubah setelan streaming Image akan mematuhi ketersediaan pemeliharaan saat diupdate di level cluster, tetapi tidak di level node pool.

Perubahan ini memerlukan pembuatan ulang node, yang dapat menyebabkan gangguan pada workload yang sedang berjalan. Untuk mengetahui detail tentang perubahan spesifik ini, temukan baris yang sesuai dalam tabel perubahan manual yang membuat ulang node menggunakan strategi upgrade node tanpa mematuhi kebijakan pemeliharaan. Untuk mempelajari update node lebih lanjut, lihat Merencanakan gangguan update node.

Pencadangan memori untuk streaming Image

GKE mencadangkan resource memori untuk streaming Image selain memori yang dicadangkan untuk menjalankan komponen sistem node. GKE tidak mencadangkan resource CPU tambahan untuk streaming Image. Di cluster GKE Standard, pencadangan ini mengubah resource memori yang tersedia untuk Anda minta di Pod. Di Autopilot GKE, GKE mengelola alokasi sistem, sehingga penjadwalan workload Anda tidak terpengaruh.

Untuk mengetahui detail pencadangan memori yang dibuat GKE untuk komponen node, lihat arsitektur cluster Standard.

Di node yang menggunakan streaming Image, GKE membuat pencadangan memori tambahan berikut untuk reservasi baru:

  • Tidak ada memori tambahan untuk mesin dengan memori kurang dari 1 GiB
  • 1% dari 4 GiB pertama memori
  • 0,8% dari 4 GiB berikutnya memori (hingga 8 GiB)
  • 0,4% dari 8 GiB berikutnya memori (hingga 16 GiB)
  • 0,24% dari 112 GiB berikutnya memori (hingga 128 GiB)
  • 0,08% dari memori apa pun di atas 128 GiB

Pemecahan masalah

GKE tidak menggunakan sistem file streaming Image

Jika log aktivitas GKE Anda tidak menampilkan aktivitas streaming Image, image Anda tidak didukung oleh sistem file jarak jauh. Jika sebelumnya GKE mengambil image di node, ini adalah perilaku yang wajar karena GKE menggunakan cache lokal image untuk pengambilan berikutnya, bukan menggunakan streaming Image. Anda dapat memastikannya dengan mencari Container image IMAGE_NAME already present on machine di kolom Message untuk peristiwa Pod Pulled.

Jika Anda tidak melihat aktivitas streaming Image saat pengambilan image pertama di node, pastikan Anda memenuhi persyaratan untuk streaming Image. Jika memenuhi persyaratan, Anda dapat mendiagnosis masalah dengan memeriksa log Layanan streaming Image (bernama gcfsd):

  1. Buka halaman Logs Explorer di konsol Google Cloud:

    Buka Logs Explorer

  2. Di kolom Kueri, tentukan kueri berikut:

    logName="projects/PROJECT_ID/logs/gcfsd"
    resource.labels.cluster_name="CLUSTER_NAME"
    

    Ganti kode berikut:

    • PROJECT_ID: Nama project Anda.
    • CLUSTER_NAME: Nama cluster Anda.
  3. Klik Jalankan kueri.

Anda juga dapat memeriksa log gcfsd menggunakan Logs Explorer:

  1. Buka Logs Explorer di konsol Google Cloud:

    Buka Logs Explorer

  2. Di kolom Kueri, tentukan kueri berikut:

    logName="projects/PROJECT_ID/logs/gcfsd"
    

    Ganti PROJECT_ID dengan ID project Google Cloud Anda.

PermissionDenied

Jika log gcfsd menampilkan pesan error yang mirip dengan yang berikut ini, node tidak memiliki cakupan API yang benar. GKE mengambil image container untuk workload tanpa menggunakan streaming Image.

level=fatal msg="Failed to create a Container File System client: rpc error:
code = PermissionDenied desc = failed to probe endpoint: rpc error: code = PermissionDenied
desc = Request had insufficient authentication scopes."

Anda dapat memperbaikinya dengan memberikan cakupan yang tepat ke node untuk memungkinkannya menggunakan streaming Image. Tambahkan cakupan devstorage.read_only ke cluster atau node pool, mirip dengan perintah berikut:

gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --zone=COMPUTE_ZONE \
    --image-type="COS_CONTAINERD" \
    --enable-image-streaming \
    --scope="https://www.googleapis.com/auth/devstorage.read_only"

FailedPrecondition

Jika Anda melihat pesan error dengan code = FailedPrecondition, berarti image tidak diimpor ke sistem file jarak jauh streaming Image.

Anda mungkin melihat error ini jika mencoba menggunakan streaming Image dengan node pool yang sudah ada. Jika node di node pool sudah memiliki image container di disk, GKE menggunakan image lokal, bukan menggunakan streaming Image untuk mendapatkan image tersebut.

Untuk memperbaikinya, coba langkah berikut:

  • Tunggu beberapa menit dan coba deploy lagi workload Anda.
  • Tambahkan node atau node pool baru dan jadwalkan workload di node tersebut.

InvalidArgument

Jika Anda melihat pesan error dengan code=InvalidArgument, image container yang digunakan workload Anda tidak memenuhi syarat untuk streaming Image. Pastikan image memenuhi persyaratan. Jika image Anda tidak ada di Artifact Registry, coba migrasikan ke Artifact Registry.

backend.FileContent failed

Error berikut mungkin muncul saat membaca file container dengan streaming Image yang diaktifkan:

level=error msg="backend.FileContent failed" error="rpc error: code = ResourceExhausted desc = Quota exceeded for quota metric 'Content requests per project per region' and limit 'Content requests per project per region per minute per region' of service 'containerfilesystem.googleapis.com' for consumer 'project_number:PROJECT_NUMBER'." layer_id="sha256:1234567890" module=gcfs_backend offset=0 path=etc/passwd size=4096

Error ini menunjukkan bahwa project telah melampaui kuota yang diperlukan untuk membaca file dari layanan sistem file container jarak jauh. Untuk mengatasi masalah ini, tingkatkan kuota berikut:

  • Permintaan konten per project per region per menit per region
  • Permintaan konten per project per region

GKE mendownload image tanpa melakukan streaming data

Image container yang menggunakan kunci enkripsi yang dikelola pelanggan (CMEK) hanya memenuhi syarat untuk streaming Image di GKE versi 1.25.3-gke.1000 atau yang lebih baru. Image container dengan lapisan duplikat tidak memenuhi syarat untuk streaming Image. Lihat Batasan untuk mengetahui informasi selengkapnya.

Memeriksa lapisan kosong atau lapisan duplikat

Untuk memeriksa apakah ada lapisan kosong atau lapisan duplikat pada image container, jalankan perintah berikut:

docker inspect IMAGE_NAME

Ganti IMAGE_NAME dengan nama image container.

Di output perintah, periksa entri pada "Layers".

Jika salah satu entri sama persis dengan output "sha256" berikut, image container memiliki lapisan kosong dan tidak memenuhi syarat untuk streaming Image.

"Layers": [
  ...
  "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4",
  ...
]

Jika ada entri duplikat seperti dalam contoh berikut, image container memiliki lapisan duplikat dan tidak memenuhi syarat untuk streaming Image.

"Layers": [
  "sha256:28699c71935fe3ffa56533db44ad93e5a30322639f7be70d5d614e06a1ae6d9b",
  ...
  "sha256:28699c71935fe3ffa56533db44ad93e5a30322639f7be70d5d614e06a1ae6d9b",
  ...
]

Perintah mv dan panggilan sistem renameat2 gagal pada file symlink

Untuk node GKE yang menjalankan versi 1.25 dan yang lebih baru, saat streaming Image diaktifkan, perintah mv dan panggilan sistem renameat2 mungkin gagal pada file symlink di image container dengan pesan error "Tidak ada perangkat atau alamat tersebut". Masalah ini disebabkan oleh regresi di kernel Linux terbaru.

Panggilan sistem ini tidak umum, sehingga sebagian besar image tidak terpengaruh oleh masalah ini. Masalah ini biasanya terjadi pada tahap inisialisasi container saat aplikasi sedang disiapkan untuk menjalankan dan memindahkan file. Anda tidak dapat menguji image secara lokal, sehingga GKE merekomendasikan penggunaan streaming Image di lingkungan pengujian untuk menemukan masalah sebelum image digunakan dalam produksi.

Perbaikan tersedia di versi patch GKE berikut:

  • 1.25: 1.25.14-gke.1351000 dan yang lebih baru
  • 1.26: 1.26.9-gke.1345000 dan yang lebih baru
  • 1.27: 1.27.6-gke.100 dan yang lebih baru
  • 1.28: 1.28.1-gke.1157000 dan yang lebih baru

Atau, untuk mengatasi masalah ini di workload yang terpengaruh, Anda dapat mencoba mengganti kode yang mengarah ke panggilan sistem renameat2. Jika tidak dapat mengubah kode, Anda harus menonaktifkan streaming Image di node pool untuk mengatasi masalah.