Dokumen ini menjelaskan ringkasan image, termasuk apa yang dimaksud dengan ringkasan image, cara menemukannya, dan cara menerapkan penggunaannya dalam cluster Kubernetes. Dokumen ini ditujukan bagi developer dan operator yang membangun dan men-deploy image container.
Ringkasan image container secara unik dan tetap mengidentifikasi image container. Dengan men-deploy image berdasarkan ringkasan, Anda telah menghindari kelemahan deployment menggunakan tag image.
Perintah dalam dokumen ini mengasumsikan bahwa Anda memiliki akses ke lingkungan shell Linux atau macOS
melalui alat seperti
Google Cloud CLI,
Docker, cURL,
jq
,
dan
pack
sudah diinstal. Anda juga dapat menggunakan
Cloud Shell
yang telah
menginstal alat-alat ini.
Image container dan tag image
Saat menangani image container, Anda memerlukan cara untuk merujuk ke image yang
Anda gunakan.
Tag image
adalah cara umum untuk merujuk ke berbagai revisi image. Pendekatan
umumnya adalah memberi tag pada image dengan ID versi pada waktu build. Misalnya,
v1.0.1
dapat merujuk ke versi yang Anda panggil 1.0.1
.
Dengan tag, revisi image bisa dengan mudah dicari dengan string yang dapat dibaca manusia. Namun, tag adalah referensi yang dapat diubah, yang berarti image yang dirujuk oleh tag dapat berubah, seperti yang ditunjukkan dalam diagram berikut:
Seperti yang ditunjukkan diagram sebelumnya, jika Anda memublikasikan image baru menggunakan tag yang sama seperti image yang ada, tag akan berhenti mengarah ke image yang ada dan mulai menunjuk ke image baru.
Kekurangan tag image
Karena dapat diubah, tag memiliki beberapa kekurangan berikut saat Anda menggunakannya untuk men-deploy image:
Di Kubernetes, men-deploy berdasarkan tag dapat mengakibatkan hasil yang tidak diharapkan. Misalnya, anggap saja Anda sudah memiliki resource Deployment yang merujuk ke image container dengan tag
v1.0.1
. Untuk memperbaiki bug atau membuat perubahan kecil, proses build Anda akan membuat image baru dengan tagv1.0.1
yang sama. Pod baru yang dibuat dari resource Deployment bisa jadi pada akhirnya akan menggunakan image lama atau baru meskipun Anda tidak mengubah spesifikasi resource Deployment. Masalah ini juga berlaku untuk resource Kubernetes lainnya seperti StatefulSets, DaemonSets, ReplicaSets, dan Jobs.Jika Anda menggunakan alat untuk memindai atau menganalisis image, hasil dari alat ini hanya valid untuk image yang dipindai. Untuk memastikan bahwa Anda men-deploy image yang telah dipindai, Anda tidak dapat mengandalkan tag karena image yang dirujuk oleh tag mungkin telah berubah.
Jika Anda menggunakan Otorisasi Biner dengan Google Kubernetes Engine (GKE), deployment berbasis tag tidak diizinkan karena tidak dapat menentukan image pasti yang digunakan saat Pod dibuat.
Saat men-deploy image, Anda dapat menggunakan ringkasan image untuk menghindari kerugian akibat penggunaan tag. Anda masih dapat menambahkan tag ke image jika mau, tetapi tidak perlu melakukannya.
Struktur image
Image terdiri atas komponen berikut:
- Manifes image
- Objek konfigurasi
- Array dari satu atau beberapa lapisan sistem file
- Indeks image opsional
Komponen ini diilustrasikan dalam diagram berikut:
Image sebelumnya menampilkan detail tambahan terkait komponen image:
- Manifes image adalah dokumen JSON yang berisi referensi ke objek konfigurasi, lapisan sistem file, dan metadata opsional.
- Manifes image merujuk ke objek konfigurasi dan setiap
lapisan sistem file menggunakan atribut
digest
-nya. Nilai atributdigest
adalah hash kriptografis dari konten yang dirujuk oleh ringkasan, biasanya dihitung menggunakan algoritma SHA-256. - Nilai ringkasan digunakan untuk membuat alamat yang tidak dapat diubah oleh objek. Proses ini disebut penyimpanan alamat konten, dan artinya Anda dapat mengambil manifes image, indeks image, objek konfigurasi, dan lapisan berdasarkan ringkasannya.
- Ringkasan image adalah hash indeks image atau dokumen JSON manifes image.
- Objek konfigurasi adalah dokumen JSON yang menentukan properti image, seperti arsitektur CPU, titik entri, port yang diekspos, dan variabel lingkungan.
- Array lapisan sistem file menentukan urutan yang digunakan runtime
container untuk menumpuk lapisan. Lapisan didistribusikan sebagai
file tar,
biasanya dikompresi menggunakan
utilitas
gzip
. - Indeks image opsional, yang terkadang disebut sebagai
daftar manifes,
mengacu pada satu atau beberapa manifes image. Referensinya adalah ringkasan
manifes image. Indeks image berguna ketika Anda menghasilkan beberapa
image yang terkait untuk berbagai
platform,
seperti arsitektur
amd64
danarm64
.
Untuk mengetahui informasi selengkapnya, lihat bagian Mempelajari manifes, ringkasan, dan tag image.
Mencari ringkasan image
Agar dapat menggunakan ringkasan image untuk deployment, Anda harus mencari ringkasan terlebih dahulu. Kemudian, Anda dapat menggunakan ringkasan dengan perintah deployment atau menyertakannya dalam manifes Kubernetes.
Anda dapat memperoleh ringkasan image dengan berbagai cara, bergantung pada situasi Anda saat ini. Bagian berikut berisi contoh untuk berbagai produk dan alat.
Di bagian berikut, jalankan perintah di Cloud Shell atau di
lingkungan shell dengan alat seperti gcloud CLI, Docker, cURL, dan jq
yang sudah terinstal.
Artifact Registry
Untuk image yang disimpan di Artifact Registry, Anda dapat menggunakan perintah
gcloud artifacts docker images describe
.gcloud artifacts docker images describe \ LOCATION-docker.pkg.dev/PROJECT/REPOSITORY/IMAGE:TAG \ --format 'value(image_summary.digest)'
Ganti kode berikut:
LOCATION
: lokasi regional atau multi-regional dari repositori AndaPROJECT
: project ID Google Cloud AndaREPOSITORY
: nama repositori AndaIMAGE
: nama image AndaTAG
: tag image Anda
Container Registry
Untuk image yang disimpan di Container Registry, Anda dapat menggunakan perintah
gcloud container images describe
untuk mendapatkan ringkasan image dengan memberikan nama dan tag. Gunakan flag--format
hanya untuk menampilkan ringkasan:gcloud container images describe \ gcr.io/google-containers/pause-amd64:3.2 \ --format 'value(image_summary.digest)'
Output-nya akan terlihat mirip dengan berikut ini meskipun nilai ringkasan Anda mungkin berbeda:
sha256:4a1c4b21597c1b4415bdbecb28a3296c6b5e23ca4f9feeb599860a1dac6a0108
Cloud Build
Untuk image yang dibangun menggunakan
Cloud Build,
Anda bisa mendapatkan ringkasan image menggunakan
perintah gcloud builds describe
dengan flag --format
. Pendekatan ini tetap dapat berfungsi meskipun Anda menggunakan registry
apa pun untuk memublikasikan image.
Untuk build yang sudah selesai, lakukan langkah berikut:
Dapatkan daftar build untuk project Anda:
gcloud builds list
Catat
BUILD_ID
.Dapatkan ringkasan image:
gcloud builds describe BUILD_ID \ --format 'value(results.images[0].digest)'
Ganti
BUILD_ID
dengan ID unik yang ditetapkan Cloud Build untuk build Anda.
Dapatkan nama image dan ringkasan build terbaru dari Cloud Build project Anda saat ini:
gcloud builds describe \ $(gcloud builds list --limit 1 --format 'value(id)') \ --format 'value[separator="@"](results.images[0].name,results.images[0].digest)'
Jika build Anda menghasilkan beberapa image, filter output dan dapatkan ringkasan salah satu image:
gcloud builds describe BUILD_ID --format json \ | jq -r '.results.images[] | select(.name=="YOUR_IMAGE_NAME") | .digest'
Ganti
YOUR_IMAGE_NAME
dengan nama salah satu image dari filecloudbuild.yaml
.Jika mengirimkan build ke Cloud Build menggunakan perintah
gcloud builds submit
, Anda dapat mengambil ringkasan image dari output dalam variabel lingkungan:IMAGE_DIGEST=$(gcloud builds submit \ --format 'value(results.images[0].digest)' | tail -n1)
Buildpack Berbasis Cloud
Jika menggunakan Buildpack Berbasis Cloud dan builder Google Cloud untuk membuat dan memublikasikan image, Anda dapat mengambil nama dan ringkasan image menggunakan flag
--quiet
dengan perintahpack
:pack build --builder gcr.io/buildpacks/builder:v1 --publish --quiet \ LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE \ > image-with-digest.txt
Ganti kode berikut:
LOCATION
: lokasi regional atau multi-regional dari repositori AndaPROJECT_ID
: project ID Google Cloud AndaREPOSITORY
: nama repositori AndaIMAGE
: nama image Anda
File
image-with-digest.txt
berisi nama image dan ringkasan.Gunakan flag
--tag
jika Anda ingin menambahkan tag ke image.
Klien Docker
Subperintah
manifest
pada klien command linedocker
dapat mengambil manifes image dan daftar manifes dari registry image container.Dapatkan ringkasan dari daftar manifes image
registry.k8s.io/pause:3.9
untuk arsitektur CPUamd64
dan sistem operasilinux
:docker manifest inspect --verbose registry.k8s.io/pause:3.9 | \ jq -r 'if type=="object" then .Descriptor.digest else .[] | select(.Descriptor.platform.architecture=="amd64" and .Descriptor.platform.os=="linux") | .Descriptor.digest end'
Output-nya terlihat mirip dengan yang berikut ini:
sha256:8d4106c88ec0bd28001e34c975d65175d994072d65341f62a8ab0754b0fafe10
Untuk image yang disimpan di daemon Docker lokal, dan yang telah diambil dari atau dikirim ke registry image, Anda dapat menggunakan alat command line Docker untuk mendapatkan ringkasan image:
Tarik image ke daemon Docker lokal Anda:
docker pull docker.io/library/debian:bookworm
Dapatkan ringkasan image:
docker inspect docker.io/library/debian:bookworm \ | jq -r '.[0].RepoDigests[0]' \ | cut -d'@' -f2
Output-nya terlihat mirip dengan yang berikut ini meskipun nilai ringkasan Anda mungkin berbeda:
sha256:3d868b5eb908155f3784317b3dda2941df87bbbbaa4608f84881de66d9bb297b
Cantumkan semua image dan ringkasan di daemon Docker lokal Anda:
docker images --digests
Output-nya menunjukkan ringkasan untuk image yang memiliki nilai ringkasan. Image hanya memiliki nilai ringkasan jika diambil dari atau dikirim ke registry image.
crane
dan gcrane
Anda dapat menggunakan alat command line
crane
dan
gcrane
open source untuk
mendapatkan ringkasan image tanpa harus menarik image ke daemon Docker lokal.
Download
crane
dangcrane
ke direktori Anda saat ini:VERSION=$(curl -sL https://api.github.com/repos/google/go-containerregistry/releases/latest | jq -r .tag_name) curl -L "https://github.com/google/go-containerregistry/releases/download/${VERSION}/go-containerregistry_$(uname -s)_$(uname -m).tar.gz" | tar -zxf - crane gcrane
Dapatkan ringkasan image:
./gcrane digest gcr.io/distroless/static-debian11:nonroot
crane
dangcrane
memiliki fitur lain yang berada di luar cakupan dokumen ini. Untuk mengetahui informasi selengkapnya, lihat dokumentasi untukcrane
dangcrane
.
Menerapkan penggunaan ringkasan image dalam deployment Kubernetes
Jika Anda ingin menerapkan penerapan menggunakan ringkasan untuk image yang di-deploy ke cluster Kubernetes, Anda dapat menggunakan Pengontrol Kebijakan atau Pemilah Komunikasi Open Policy Agent (OPA). Pengontrol Kebijakan dibangun dari project open source Pemilah Komunikasi OPA.
Pengontrol Kebijakan dan Pemilah Komunikasi OPA dibuat di mesin kebijakan OPA. Pengontrol Kebijakan dan Pemilah Komunikasi OPA memberikan Webhook penerimaan validasi Kubernetes untuk menegakkan kebijakan, dan definisi resource kustom (CRD) untuk template batasan dan batasan.
Template batasan berisi logika kebijakan yang dinyatakan menggunakan bahasa deklaratif tingkat tinggi yang disebut Rego. Berikut ini adalah template batasan yang memvalidasi bahwa container, container init, dan container sementara dalam spesifikasi resource Kubernetes menggunakan image dengan ringkasan:
Kebijakan sebelumnya berisi ekspresi reguler sebagai input untuk
fungsi re_match
.
Ekspresi reguler ini cocok dengan ringkasan image container, dan didasarkan
pada
format ringkasan di Spesifikasi Image Open Container Initiative.
Batasan menerapkan kebijakan pada resource Kubernetes melalui pencocokan dengan
atribut seperti kind
dan namespace
. Contoh batasan berikut
menerapkan kebijakan dari template batasan ke semua resource Pod
di
namespace default
.
Setelah Anda membuat template batasan dan batasan, setiap pod baru di
namespace default
harus menggunakan ringkasan image untuk mereferensikan image container.
Untuk mengetahui contoh lengkapnya, lihat
kebijakan imagedigests
di library kebijakan Pemilah komunikasi.
Tentang manifes, ringkasan, dan tag image
Di bagian ini, Anda akan mempelajari cara menjelajahi image yang sudah ada di registry menggunakan
alat command
line seperti curl
dan docker
. Jalankan perintah di Cloud Shell atau
di lingkungan shell dengan alat seperti gcloud CLI, Docker,
cURL, dan jq
yang sudah terinstal. Perintah berikut menggunakan image publik di Artifact Registry.
Dapatkan manifes
gcr.io/google-containers/pause-amd64:3.2
image menggunakan cURL dan URL manifes:curl -s https://gcr.io/v2/google-containers/pause-amd64/manifests/3.2
Outputnya mirip dengan hal berikut ini:
{ "schemaVersion": 2, "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "config": { "mediaType": "application/vnd.docker.container.image.v1+json", "size": 759, "digest": "sha256:80d28bedfe5dec59da9ebf8e6260224ac9008ab5c11dbbe16ee3ba3e4439ac2c" }, "layers": [ { "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "size": 296534, "digest": "sha256:c74f8866df097496217c9f15efe8f8d3db05d19d678a02d01cc7eaed520bb136" } ] }
Bagian
config
memiliki atribut ringkasan, dan Anda dapat menggunakan nilai ini untuk mengambil objek konfigurasi. Demikian pula, setiap lapisan memiliki atributdigest
yang dapat Anda gunakan untuk mengambil file tar untuk lapisan tersebut.Jika image menyertakan indeks image opsional, permintaan
GET
HTTP ke URL manifes yang menggunakan tag akan menampilkan indeks image, bukan manifes image.Dapatkan indeks image dari
gcr.io/google-containers/pause:3.2
:curl -s https://gcr.io/v2/google-containers/pause/manifests/3.2
Outputnya mirip dengan hal berikut ini:
{ "schemaVersion": 2, "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json", "manifests": [ { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 526, "digest": "sha256:4a1c4b21597c1b4415bdbecb28a3296c6b5e23ca4f9feeb599860a1dac6a0108", "platform": { "architecture": "amd64", "os": "linux" } }, { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 526, "digest": "sha256:bbb7780ca6592cfc98e601f2a5e94bbf748a232f9116518643905aa30fc01642", "platform": { "architecture": "arm", "os": "linux", "variant": "v7" } }, { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 526, "digest": "sha256:31d3efd12022ffeffb3146bc10ae8beb890c80ed2f07363515580add7ed47636", "platform": { "architecture": "arm64", "os": "linux" } }, { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 526, "digest": "sha256:7f82fecd72730a6aeb70713476fb6f7545ed1bbf32cadd7414a77d25e235aaca", "platform": { "architecture": "ppc64le", "os": "linux" } }, { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 526, "digest": "sha256:1175fd4d728641115e2802be80abab108b8d9306442ce35425a4e8707ca60521", "platform": { "architecture": "s390x", "os": "linux" } } ] }
Filter hasilnya untuk mengekstrak ringkasan image untuk platform yang Anda inginkan. Dapatkan ringkasan manifes image untuk arsitektur CPU
amd64
dan sistem operasilinux
:curl -s https://gcr.io/v2/google-containers/pause/manifests/3.2 | \ jq -r '.manifests[] | select(.platform.architecture=="amd64" and .platform.os=="linux") | .digest'
Pemfilteran dalam perintah ini meniru cara runtime container, misalnya containerd, memilih image yang cocok dengan platform target dari indeks image.
Outputnya mirip dengan hal berikut ini:
sha256:4a1c4b21597c1b4415bdbecb28a3296c6b5e23ca4f9feeb599860a1dac6a0108
Aplikasi ringkasan image adalah hasil penerapan hash yang tahan bentrok ke indeks image atau manifes image, biasanya algoritma SHA-256.
Dapatkan ringkasan image
gcr.io/google-containers/pause-amd64:3.2
:curl -s https://gcr.io/v2/google-containers/pause-amd64/manifests/3.2 \ | shasum -a 256 \ | cut -d' ' -f1
Outputnya mirip dengan hal berikut ini:
4a1c4b21597c1b4415bdbecb28a3296c6b5e23ca4f9feeb599860a1dac6a0108
Anda dapat mereferensikan image ini menggunakan nilai ringkasan image sebagai berikut:
gcr.io/google-containers/pause-amd64@sha256:4a1c4b21597c1b4415bdbecb28a3296c6b5e23ca4f9feeb599860a1dac6a0108
Dengan konsep penyimpanan alamat konten yang dapat diakses, dapatkan manifes image menggunakan ringkasan sebagai referensi:
curl -s https://gcr.io/v2/google-containers/pause-amd64/manifests/sha256:4a1c4b21597c1b4415bdbecb28a3296c6b5e23ca4f9feeb599860a1dac6a0108
Banyak registry image container yang menampilkan ringkasan manifes, indeks image, objek konfigurasi, dan lapisan sistem file dalam header
Docker-Content-Digest
sebagai respons terhadap permintaanHEAD
HTTP. Dapatkan ringkasan indeks imagegcr.io/google-containers/pause-amd64:3.2
:curl -s --head https://gcr.io/v2/google-containers/pause/manifests/3.2 \ | grep -i Docker-Content-Digest \ | cut -d' ' -f2
Outputnya mirip dengan hal berikut ini:
sha256:927d98197ec1141a368550822d18fa1c60bdae27b78b0c004f705f548c07814f
Header
Docker-Content-Digest
tidak dimandatkan oleh spesifikasi Open Container Initiative Distribution sehingga pendekatan ini mungkin tidak berfungsi di semua registry image container. Anda dapat menggunakannya dengan Artifact Registry dan Container Registry.Untuk mengambil objek konfigurasi image menggunakan nilai digest dari manifes image, lakukan langkah berikut:
Dapatkan ringkasan konfigurasi:
CONFIG_DIGEST=$(curl -s https://gcr.io/v2/google-containers/pause-amd64/manifests/3.2 \ | jq -r '.config.digest')
Gunakan ringkasan konfigurasi untuk mengambil objek konfigurasi, dan gunakan
jq
untuk memformat output agar lebih mudah dibaca:curl -sL https://gcr.io/v2/google-containers/pause-amd64/blobs/$CONFIG_DIGEST \ | jq
Outputnya mirip dengan hal berikut ini:
{ "architecture": "amd64", "config": { "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Entrypoint": [ "/pause" ], "WorkingDir": "/", "OnBuild": null }, "created": "2020-02-14T10:51:50.60182885-08:00", "history": [ { "created": "2020-02-14T10:51:50.60182885-08:00", "created_by": "ARG ARCH", "comment": "buildkit.dockerfile.v0", "empty_layer": true }, { "created": "2020-02-14T10:51:50.60182885-08:00", "created_by": "ADD bin/pause-amd64 /pause # buildkit", "comment": "buildkit.dockerfile.v0" }, { "created": "2020-02-14T10:51:50.60182885-08:00", "created_by": "ENTRYPOINT [\"/pause\"]", "comment": "buildkit.dockerfile.v0", "empty_layer": true } ], "os": "linux", "rootfs": { "type": "layers", "diff_ids": [ "sha256:ba0dae6243cc9fa2890df40a625721fdbea5c94ca6da897acdd814d710149770" ] } }
Untuk mengambil lapisan sistem file menggunakan nilai ringkasan dari manifes image, lakukan langkah berikut:
Dapatkan ringkasan lapisan yang ingin Anda ambil:
LAYER_DIGEST=$(curl -s https://gcr.io/v2/google-containers/pause-amd64/manifests/3.2 \ | jq -r '.layers[0].digest')
Gunakan ringkasan lapisan untuk mengambil file tar lapisan, lalu cantumkan kontennya:
curl -sL https://gcr.io/v2/google-containers/pause-amd64/blobs/$LAYER_DIGEST \ | tar --list
Lapisan ini hanya memiliki satu file, bernama
pause
.
Untuk mencari tag yang terkait dengan ringkasan image, lakukan langkah berikut:
Tentukan ringkasan yang ingin Anda cari:
IMAGE_DIGEST=$(curl -s https://gcr.io/v2/google-containers/pause-amd64/manifests/3.2 \ | shasum -a 256 \ | cut -d' ' -f1)
Variabel lingkungan
IMAGE_DIGEST
berisi ringkasan image yang direferensikan oleh tag3.2
.Gunakan endpoint daftar tag image,
/tags/list
, untuk mencantumkan informasi tag, dan mengekstrak tag untuk nilai ringkasan:curl -s "https://gcr.io/v2/google-containers/pause-amd64/tags/list?n=1" \ | jq ".manifest.\"sha256:$IMAGE_DIGEST\".tag"
Outputnya mirip dengan hal berikut ini:
[ "3.2" ]
Untuk mendapatkan manifes image dari repositori image container Artifact Registry menggunakan cURL, sertakan token akses di header permintaan
Authorization
:curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" \ https://LOCATION-docker.pkg.dev/v2/PROJECT_ID/REPOSITORY/IMAGE/manifests/DIGEST
Ganti kode berikut:
LOCATION
: lokasi regional atau multi-regional dari repositori AndaPROJECT_ID
: project ID Google Cloud AndaREPOSITORY
: nama repositori AndaIMAGE
: nama image AndaDIGEST
: ringkasan image Anda dalam formatsha256:DIGEST_VALUE
Langkah selanjutnya
- Pelajari praktik terbaik untuk membangun container.
- Pelajari praktik terbaik untuk mengoperasikan container.
- Untuk mempelajari image lebih lanjut, lihat spesifikasi Format Image dan Distribusi Open Container Initiative.