Tutorial ini menunjukkan kepada developer dan operator yang men-deploy container ke Kubernetes tentang cara menggunakan ringkasan image container untuk mengidentifikasi image container. Ringkasan image container mengidentifikasi image container secara unik dan tidak dapat diubah.
Men-deploy image container menggunakan ringkasan image memberikan beberapa manfaat dibandingkan dengan menggunakan tag image. Untuk mengetahui informasi selengkapnya tentang ringkasan image, lihat dokumen yang menyertai tentang menggunakan ringkasan image container sebelum melanjutkan tutorial ini.
Argumen image
untuk container dalam spesifikasi Pod Kubernetes menerima
image dengan ringkasan. Argumen ini berlaku di mana pun Anda menggunakan spesifikasi Pod, seperti di bagian template
resource Deployment, StatefulSet,
DaemonSet, ReplicaSet, CronJob, dan Job.
Untuk men-deploy image dengan menggunakan ringkasan, gunakan nama image, diikuti dengan @sha256:
dan nilai ringkasan. Berikut adalah contoh resource Deployment
yang menggunakan image dengan ringkasan:
apiVersion: apps/v1 kind: Deployment metadata: name: echo-deployment spec: selector: matchLabels: app: echo template: metadata: labels: app: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229 ports: - containerPort: 8080
Satu kelemahan penggunaan ringkasan image adalah Anda tidak mengetahui nilai ringkasan sampai memublikasikan image ke registry. Saat membangun image baru, nilai ringkasan akan berubah, dan Anda memerlukan cara untuk memperbarui manifes Kubernetes setiap kali melakukan deployment.
Tutorial ini menunjukkan cara menggunakan alat seperti
Skaffold,
kpt,
digester,
kustomize,
gke-deploy
,
dan
ko
untuk menggunakan ringkasan image di manifes.
Rekomendasi
Dokumen ini menyajikan beberapa cara untuk menggunakan ringkasan image dalam deployment Kubernetes. Alat yang dijelaskan dalam dokumen ini bersifat komplementer.
Misalnya, Anda dapat menggunakan output fungsi kpt dengan kustomize untuk membuat varian bagi lingkungan yang berbeda. Skaffold dapat mem-build image menggunakan ko
dan men-deploy image ke cluster Kubernetes menggunakan kubectl
atau kpt.
Alasan alat ini saling melengkapi adalah karena dapat melakukan pengeditan terstruktur berdasarkan model resource Kubernetes (KRM). Model ini membuat alat tersebut dapat dicocokkan, dan Anda dapat mengembangkan penggunaan alat tersebut untuk membuat proses dan pipeline yang membantu men-deploy aplikasi dan layanan Anda.
Untuk memulai, sebaiknya gunakan pendekatan yang paling sesuai dengan alat dan proses yang ada:
Skaffold dapat menambahkan ringkasan ke referensi image. Anda dapat mengaktifkan fungsi ini dengan sedikit perubahan konfigurasi. Mengadopsi Skaffold memberikan manfaat tambahan, seperti memisahkan cara berbagai alat membangun dan men-deploy image container.
Dengan menggunakan alat digester sebagai webhook penerimaan yang bermutasi di cluster Kubernetes, Anda dapat menambahkan ringkasan ke semua deployment dengan dampak minimal pada proses saat ini untuk membangun dan men-deploy image container. Webhook digester juga menyederhanakan penerapan Otorisasi Biner, karena hanya memerlukan penambahan label ke namespace.
kpt adalah opsi yang bagus jika Anda membutuhkan alat yang fleksibel untuk memanipulasi manifes Kubernetes. Alat digester dapat digunakan sebagai fungsi KRM sisi klien dalam pipeline kpt.
Jika Anda sudah menggunakan kustomize untuk mengelola manifes Kubernetes di seluruh lingkungan, sebaiknya manfaatkan pengubah image-nya untuk men-deploy image melalui ringkasan.
ko
adalah cara terbaik untuk membangun dan memublikasikan image untuk aplikasi Go, serta digunakan oleh project open source seperti Knative, Tekton, dan sigstore.
Jika Anda tidak menggunakan salah satu alat yang dijelaskan dalam dokumen ini, sebaiknya mulai dengan Skaffold dan webhook digester. Skaffold adalah alat umum yang digunakan oleh developer dan tim rilis, serta terintegrasi dengan alat lain yang dijelaskan dalam tutorial ini. Anda bisa memanfaatkan opsi integrasi ini ketika kebutuhan Anda terus berkembang. Webhook Kubernetes digester melengkapi Skaffold dengan mengaktifkan deployment berbasis ringkasan untuk seluruh cluster.
Tujuan
- Gunakan Skaffold untuk membangun dan mengirim image, serta menyisipkan nama image dan ringkasan dalam manifes Kubernetes.
- Gunakan fungsi sisi klien digester dan webhook penerimaan yang bermutasi untuk menambahkan ringkasan ke image di Pod Kubernetes dan template Pod.
- Gunakan penyetel kpt untuk mengganti tag image dalam manifes Kubernetes dengan ringkasan image.
- Gunakan kustomize untuk membuat manifes Kubernetes dengan ringkasan image.
- Gunakan
gke-deploy
untuk me-resolve tag image ke ringkasan dalam manifes Kubernetes. - Gunakan
ko
untuk membangun dan mengirim image, serta menyisipkan nama image dan ringkasan dalam manifes Kubernetes.
Biaya
Dalam dokumen ini, Anda akan menggunakan komponen Google Cloud yang dapat ditagih berikut:
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda,
gunakan kalkulator harga.
Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.
Sebelum memulai
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry API.
-
In the Google Cloud console, activate Cloud Shell.
Di Cloud Shell, tetapkan project default untuk Google Cloud CLI:
gcloud config set project PROJECT_ID
Ganti
PROJECT_ID
dengan [project ID] Anda.Buat repositori image container di Artifact Registry:
gcloud artifacts repositories create REPOSITORY \ --location=LOCATION \ --repository-format=docker
Ganti kode berikut:
REPOSITORY
: nama yang ingin Anda gunakan untuk repositori, misalnyadigest-tutorial
.LOCATION
: lokasi Artifact Registry, misalnyaus-central1
.
Konfigurasikan autentikasi ke lokasi Artifact Registry untuk alat CLI yang digunakan dalam tutorial ini:
gcloud auth configure-docker LOCATION-docker.pkg.dev
Menggunakan Skaffold
Skaffold adalah alat command line untuk pengembangan dan deployment aplikasi yang berkelanjutan ke cluster Kubernetes.
Gunakan Skaffold untuk mem-build image, mengirim image ke Artifact Registry, dan mengganti nilai placeholder image
dalam template manifes Kubernetes dengan nama, tag, dan ringkasan image yang dikirim:
Di Cloud Shell, buat dan buka direktori untuk menyimpan file yang Anda buat di bagian ini:
mkdir -p ~/container-image-digests-tutorial/skaffold cd ~/container-image-digests-tutorial/skaffold
Buat clone repositori Git Skaffold:
git clone https://github.com/GoogleContainerTools/skaffold.git
Buka direktori contoh
getting-started
:cd skaffold/examples/getting-started
Lihat tag Git yang cocok dengan versi Skaffold Anda:
git checkout $(skaffold version)
Lihat file konfigurasi
skaffold.yaml
:cat skaffold.yaml
Filenya terlihat seperti ini:
apiVersion: skaffold/v4beta6 kind: Config build: artifacts: - image: skaffold-example manifests: rawYaml: - k8s-pod.yaml
Bagian
build.artifacts
berisi nama image placeholder. Skaffold mencari placeholder ini dalam file manifes input.Bagian
manifests
memberi tahu Skaffold untuk membaca manifes input dari direktori saat ini dengan namak8s-pod.yaml
.Untuk ringkasan semua opsi yang tersedia, lihat dokumentasi referensi
skaffold.yaml
.Lihat template manifes Kubernetes:
cat k8s-pod.yaml
File tersebut adalah sebagai berikut:
apiVersion: v1 kind: Pod metadata: name: getting-started spec: containers: - name: getting-started image: skaffold-example
Nilai placeholder
skaffold-example
di kolomimage
cocok dengan nilai kolomimage
di fileskaffold.yaml
. Skaffold mengganti nilai placeholder ini dengan nama image lengkap dan ringkasan dalam output yang dirender.Build dan kirim image ke Artifact Registry:
skaffold build \ --default-repo=LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY \ --file-output=artifacts.json \ --interactive=false \ --push=true \ --update-check=false
Perintah ini menggunakan flag berikut:
- Flag
--file-output
menentukan file tempat Skaffold menyimpan informasi tentang image yang dibangun, termasuk nilai ringkasan. - Flag
--push
memerintahkan Skaffold untuk mengirim image yang telah dibangun ke registry image container yang ditentukan oleh flag--default-repo
. - Flag
--interactive
dan--update-check
ditetapkan kefalse
. Tetapkan flag ini kefalse
di lingkungan non-interaktif, seperti pipeline build, tetapi biarkan sebagai nilai default (true
untuk kedua flag) untuk pengembangan lokal.
Jika Anda menggunakan Cloud Deploy untuk men-deploy ke GKE, gunakan file dari flag
--file-output
sebagai nilai flag--build-artifacts
saat membuat rilis.- Flag
Render manifes Kubernetes yang diperluas dengan nama, tag, dan ringkasan image container dari langkah sebelumnya:
skaffold render \ --build-artifacts=artifacts.json \ --digest-source=none \ --interactive=false \ --offline=true \ --output=rendered.yaml \ --update-check=false
Perintah ini menggunakan flag berikut:
- Flag
--build-artifacts
mereferensikan file output dari perintahskaffold build
di langkah sebelumnya. - Flag
--digest-source=none
berarti bahwa Skaffold menggunakan nilai ringkasan dari file yang diberikan dalam flag--build-artifacts
, bukan me-resolve ringkasan dari registry image container. - Flag
--offline=true
berarti Anda dapat menjalankan perintah tanpa memerlukan akses ke cluster Kubernetes. - Flag
--output
menentukan file output untuk manifes yang dirender.
- Flag
Lihat manifes yang dirender:
cat rendered.yaml
Outputnya akan terlihat seperti berikut:
apiVersion: v1 kind: Pod metadata: name: getting-started spec: containers: - image: LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/skaffold-example:TAG@sha256:DIGEST name: getting-started
Dalam output ini, Anda akan melihat nilai berikut:
TAG
: tag yang ditetapkan Skaffold ke image.DIGEST
: nilai ringkasan image
Menggunakan digester
Digester menambahkan ringkasan ke image container dan container init di spesifikasi template Pod dan Pod Kubernetes. Digester menggantikan referensi image container yang menggunakan tag:
spec:
containers:
- image: gcr.io/google-containers/echoserver:1.10
Dengan referensi yang menggunakan ringkasan image:
spec:
containers:
- image: gcr.io/google-containers/echoserver:1.10@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
Digester dapat berjalan sebagai webhook penerimaan yang bermutasi di cluster Kubernetes, atau sebagai fungsi KRM sisi klien dengan alat command line kpt atau kustomize.
Menggunakan fungsi KRM digester
Di Cloud Shell, buat dan buka direktori untuk menyimpan file yang Anda buat di bagian ini:
mkdir -p ~/container-image-digests-tutorial/digester-fn cd ~/container-image-digests-tutorial/digester-fn
Download biner digester:
mkdir -p ${HOME}/bin export PATH=${HOME}/bin:${PATH} DIGESTER_VERSION=$(curl -sL https://api.github.com/repos/google/k8s-digester/releases/latest | jq -r .tag_name) curl -L "https://github.com/google/k8s-digester/releases/download/${DIGESTER_VERSION}/digester_$(uname -s)_$(uname -m)" --output ${HOME}/bin/digester chmod +x ${HOME}/bin/digester
Buat manifes Pod Kubernetes yang merujuk image
gcr.io/google-containers/echoserver
menggunakan tag1.10
:cat << EOF > pod.yaml apiVersion: v1 kind: Pod metadata: name: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver:1.10 ports: - containerPort: 8080 EOF
Jalankan fungsi KRM digester menggunakan kpt dengan manifes dalam direktori saat ini (
.
):kpt fn eval . --exec digester
Saat Anda menjalankan perintah ini, kpt akan melakukan update manifes di tempat dalam direktori saat ini. Jika Anda ingin kpt menampilkan manifes yang diperbarui di konsol dan tidak mengubah file manifes, tambahkan flag
--output unwrap
.Lihat manifes yang diperbarui:
cat pod.yaml
File tersebut adalah sebagai berikut:
apiVersion: v1 kind: Pod metadata: name: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver:1.10@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229 ports: - containerPort: 8080
Menggunakan webhook penerimaan digester
Di Cloud Shell, buat dan buka direktori untuk menyimpan file yang Anda buat di bagian ini:
mkdir -p ~/container-image-digests-tutorial/digester-webhook cd ~/container-image-digests-tutorial/digester-webhook
Buat cluster Kubernetes lokal menggunakan kind:
kind create cluster
kind adalah alat command line untuk menjalankan cluster Kubernetes lokal menggunakan Docker.
Deploy webhook disgester:
DIGESTER_VERSION=$(curl -sL https://api.github.com/repos/google/k8s-digester/releases/latest | jq -r .tag_name) kustomize build "https://github.com/google/k8s-digester.git/manifests?ref=${DIGESTER_VERSION}" | kubectl apply -f -
Buat namespace Kubernetes bernama
digester-demo
di cluster kind:kubectl create namespace digester-demo
Tambahkan label
digest-resolution: enabled
ke namespacedigester-demo
:kubectl label namespace digester-demo digest-resolution=enabled
Webhook digester menambahkan ringkasan ke Pod dalam namespace dengan label ini.
Buat manifes Deployment Kubernetes yang mereferensikan image
gcr.io/google-containers/echoserver
menggunakan tag1.10
:cat << EOF > deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: echo-deployment spec: selector: matchLabels: app: echo template: metadata: labels: app: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver:1.10 ports: - containerPort: 8080 EOF
Terapkan manifes dalam namespace
digester-demo
:kubectl apply --filename deployment.yaml --namespace digester-demo \ --output jsonpath='{.spec.template.spec.containers[].image}{"\n"}'
Flag
--output
menginstruksikankubectl
untuk menghasilkan nama image ke konsol, diikuti dengan karakter newline. Outputnya adalah sebagai berikut:gcr.io/google-containers/echoserver:1.10@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
Output ini menunjukkan bahwa webhook digester menambahkan ringkasan image ke spesifikasi template Pod di resource Deployment.
Hapus cluster kind untuk mengosongkan resource di sesi Cloud Shell Anda:
kind delete cluster
Menggunakan penyetel kpt
kpt adalah alat command line untuk mengelola, memanipulasi, menyesuaikan, dan menerapkan manifes resource Kubernetes.
Anda dapat menggunakan fungsi KRM create-setters
dan apply-setters
dari Katalog Fungsi kpt untuk memperbarui ringkasan image dalam manifes Kubernetes saat mem-build image baru.
Di Cloud Shell, buat dan buka direktori untuk menyimpan file yang Anda buat di bagian ini:
mkdir -p ~/container-image-digests-tutorial/kpt cd ~/container-image-digests-tutorial/kpt
Buat paket kpt di direktori saat ini:
kpt pkg init --description "Container image digest tutorial"
Buat manifes Pod Kubernetes yang merujuk image
gcr.io/google-containers/echoserver
menggunakan tag1.10
:cat << EOF > pod.yaml apiVersion: v1 kind: Pod metadata: name: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver:1.10 ports: - containerPort: 8080 EOF
Gunakan kpt untuk membuat penyetel yang disebut
echoimage
untuk kolom manifes, dengan nilai yang ada adalahgcr.io/google-containers/echoserver:1.10
:kpt fn eval . \ --image gcr.io/kpt-fn/create-setters@sha256:0220cc87f29ff9abfa3a3b5643aa50f18d355d5e9dc9e1f518119633ddc4895c \ -- "echoimage=gcr.io/google-containers/echoserver:1.10"
Lihat manifes:
cat pod.yaml
File tersebut adalah sebagai berikut:
apiVersion: v1 kind: Pod metadata: name: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver:1.10 # kpt-set: ${echoimage} ports: - containerPort: 8080
Dapatkan nilai ringkasan image container:
DIGEST=$(gcloud container images describe \ gcr.io/google-containers/echoserver:1.10 \ --format='value(image_summary.digest)')
Tetapkan nilai kolom baru:
kpt fn eval . \ --image gcr.io/kpt-fn/apply-setters@sha256:4d4295727183396f0c3c6a75d2560254c2f9041a39e95dc1e5beffeb49cc1a12 \ -- "echoimage=gcr.io/google-containers/echoserver:1.10@$DIGEST"
Saat Anda menjalankan perintah ini, kpt akan melakukan penggantian langsung untuk nilai kolom
image
dalam manifes.Lihat manifes yang diperbarui:
cat pod.yaml
File tersebut adalah sebagai berikut:
apiVersion: v1 kind: Pod metadata: name: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver:1.10@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229 # kpt-set: ${echoimage} ports: - containerPort: 8080
Menggunakan transformer image kustomize
kustomize adalah alat command line yang memungkinkan Anda menyesuaikan manifes Kubernetes menggunakan overlay, patch, dan transformer.
Anda dapat menggunakan transformer image kustomize untuk memperbarui nama, tag, dan ringkasan image dalam manifes yang ada.
Cuplikan kustomization.yaml
berikut menunjukkan cara mengonfigurasi transformer
image agar menggunakan nilai digest
transformer untuk image yang mana nilai image
spesifikasi Pod cocok dengan nilai name
transformer:
images: - name: gcr.io/google-containers/echoserver digest: sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
Untuk menggunakan transformer image kustomize dengan ringkasan image, lakukan hal berikut:
Di Cloud Shell, buat dan buka direktori untuk menyimpan file yang Anda buat di bagian ini:
mkdir -p ~/container-image-digests-tutorial/kustomize cd ~/container-image-digests-tutorial/kustomize
Buat file
kustomization.yaml
:kustomize init
Buat manifes Kubernetes dengan spesifikasi Pod yang mereferensikan image
gcr.io/google-containers/echoserver
menggunakan tag1.10
:cat << EOF > pod.yaml apiVersion: v1 kind: Pod metadata: name: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver:1.10 ports: - containerPort: 8080 EOF
Tambahkan manifes sebagai resource dalam file
kustomization.yaml
:kustomize edit add resource pod.yaml
Gunakan transformer image untuk memperbarui ringkasan image:
kustomize edit set image \ gcr.io/google-containers/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
Lihat transformer image dalam file
kustomization.yaml
:cat kustomization.yaml
File tersebut adalah sebagai berikut:
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - pod.yaml images: - digest: sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229 name: gcr.io/google-containers/echoserver
Lihat manifes yang dihasilkan:
kustomize build .
Outputnya adalah sebagai berikut:
apiVersion: v1 kind: Pod metadata: name: echo spec: containers: - image: gcr.io/google-containers/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229 name: echoserver ports: - containerPort: 8080
Untuk menjalankan transformer kustomize dan menerapkan manifes yang dihasilkan ke cluster Kubernetes dalam satu langkah, Anda dapat menggunakan perintah
kubectl apply
dengan flag--kustomize
:kubectl apply --kustomize .
Jika ingin menerapkan output nanti, Anda dapat mengalihkan output perintah
kustomize build
ke file.
Menggunakan gke-deploy
gke-deploy
adalah alat command line yang Anda gunakan dengan Google Kubernetes Engine (GKE).
gke-deploy
menggabungkan alat command line kubectl
dan dapat mengubah
resource yang Anda buat dengan mengikuti praktik yang direkomendasikan Google.
Jika Anda menggunakan sub-perintah gke-deploy
, yakni prepare
atau run
, gke-deploy
akan me-resolve tag image Anda untuk ringkasan dan menyimpan manifes yang diperluas dengan
ringkasan image dalam file output/expanded/aggregated-resources.yaml
secara
default.
Anda dapat menggunakan gke-deploy run
untuk mengganti tag image sebagai ringkasan dan menerapkan manifes yang diperluas ke cluster GKE. Meskipun perintah ini praktis, ada kelemahannya: tag image diganti pada saat deployment. Image yang terkait dengan tag mungkin berubah antara saat Anda memutuskan untuk men-deploy, dan saat men-deploy, sehingga terjadi deployment image yang tidak terduga. Untuk deployment produksi, sebaiknya lakukan langkah terpisah untuk membuat dan menerapkan manifes.
Untuk mengganti tag image dalam manifes deployment Kubernetes dengan ringkasan image, lakukan langkah berikut:
Di Cloud Shell, buat dan buka direktori untuk menyimpan file yang Anda buat di bagian ini:
mkdir -p ~/container-image-digests-tutorial/gke-deploy cd ~/container-image-digests-tutorial/gke-deploy
Instal
gke-deploy
:go install github.com/GoogleCloudPlatform/cloud-builders/gke-deploy@latest
Buat manifes Deployment Kubernetes yang mereferensikan image
gcr.io/google-containers/echoserver
menggunakan tag1.10
:cat << EOF > deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: echo-deployment spec: selector: matchLabels: app: echo template: metadata: labels: app: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver:1.10 ports: - containerPort: 8080 EOF
Buat manifes yang diperluas berdasarkan manifes
deployment.yaml
:gke-deploy prepare \ --filename deployment.yaml \ --image gcr.io/google-containers/echoserver:1.10 \ --version 1.10
Lihat manifes yang diperluas:
cat output/expanded/aggregated-resources.yaml
Outputnya adalah sebagai berikut:
apiVersion: apps/v1 kind: Deployment metadata: labels: app.kubernetes.io/managed-by: gcp-cloud-build-deploy app.kubernetes.io/version: "1.10" name: echo-deployment namespace: default spec: selector: matchLabels: app: echo template: metadata: labels: app: echo app.kubernetes.io/managed-by: gcp-cloud-build-deploy app.kubernetes.io/version: "1.10" spec: containers: - image: gcr.io/google-containers/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229 name: echoserver ports: - containerPort: 8080
Dalam manifes yang diperluas, tag image diganti dengan ringkasan.
Argumen
--version
yang Anda gunakan dengan perintahgke-deploy
menetapkan nilai labelapp.kubernetes.io/version
dalam deployment dan metadata template Pod manifes yang diperluas.Untuk mempelajari cara menggunakan
gke-deploy
dengan Cloud Build, lihat dokumentasi Cloud Build untukgke-deploy
.
Menggunakan ko
ko
adalah library dan alat command line untuk membuat
image container Go
dan men-deploy-nya ke cluster Kubernetes. ko
mem-build image tanpa menggunakan daemon Docker, sehingga Anda dapat menggunakannya di lingkungan tempat Docker tidak dapat diinstal.
Sub-perintah ko
build
membangun image dan memublikasikannya ke registry image container atau memuatnya ke daemon Docker lokal.
Sub-perintah ko
resolve
melakukan hal berikut:
- Mengidentifikasi image yang akan dibuat dengan menemukan placeholder di kolom
image
pada manifes Kubernetes yang Anda berikan menggunakan argumen--filename
. - Membangun dan memublikasikan image Anda.
- Mengganti placeholder nilai
image
dengan nama dan ringkasan image yang dibuatnya. - Mencetak manifes yang diperluas.
Sub-perintah ko
apply
,
create
,
dan
run
melakukan langkah yang sama seperti resolve
, lalu menjalankan kubectl apply
,
create
, atau run
dengan manifes yang diperluas.
Untuk mem-build image dari kode sumber Go dan menambahkan ringkasan image ke manifes deployment Kubernetes, lakukan hal berikut
Di Cloud Shell, buat dan buka direktori untuk menyimpan file yang Anda buat di bagian ini:
mkdir -p ~/container-image-digests-tutorial/ko cd ~/container-image-digests-tutorial/ko
Download
ko
dan tambahkan kePATH
Anda:mkdir -p ${HOME}/bin export PATH=${HOME}/bin:${PATH} KO_VERSION=$(curl -sL https://api.github.com/repos/ko-build/ko/releases/latest | jq -r .tag_name | cut -c2-) curl -L "https://github.com/ko-build/ko/releases/download/v${KO_VERSION}/ko_${KO_VERSION}_$(uname -s)_$(uname -m).tar.gz" | tar -zxC ${HOME}/bin ko
Buat aplikasi Go dengan nama modul
example.com/hello-world
di direktori baru bernamaapp
:mkdir -p app/cmd/ko-example cd app go mod init example.com/hello-world cat << EOF > cmd/ko-example/main.go package main import "fmt" func main() { fmt.Println("hello world") } EOF
Tentukan repositori image yang digunakan
ko
untuk memublikasikan image:export KO_DOCKER_REPO=LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY
Contoh ini menggunakan Artifact Registry, tetapi Anda dapat menggunakan
ko
dengan registry image container yang berbeda.Untuk membangun dan memublikasikan image untuk aplikasi Anda, lakukan salah satu langkah berikut:
Bangun dan publikasikan image untuk aplikasi Anda dengan menyediakan jalur ke paket utama Go:
ko build --base-import-paths ./cmd/ko-example
Argumen opsional
--base-import-paths
berarti bahwako
menggunakan nama pendek direktori paket utama sebagai nama image.ko
mencetak nama image dan ringkasan kestdout
dalam format berikut:LOCATION-docker.pkg.dev/PROJECT_ID/ko-example@sha256:DIGEST
Dalam output ini,
DIGEST
adalah nilai ringkasan image.Gunakan
ko
untuk mengganti placeholder manifes dengan nama dan ringkasan image yang dibangun dan dipublikasikan:Membuat manifes Pod Kubernetes. Manifes menggunakan
ko://IMPORT_PATH_OF_YOUR_MAIN_PACKAGE
placeholder sebagai nilai kolomimage
:cat << EOF > ko-pod.yaml apiVersion: v1 kind: Pod metadata: name: ko-example spec: containers: - name: hello-world image: ko://example.com/hello-world/cmd/ko-example EOF
Bangun dan publikasikan image untuk aplikasi Anda, dan ganti placeholder manifes dengan nama image dan ringkasan:
ko resolve --base-import-paths --filename ko-pod.yaml
ko
mencetak manifes dengan nama image dan ringkasan kestdout
:apiVersion: v1 kind: Pod metadata: name: ko-example spec: containers: - name: hello-world image: LOCATION-docker.pkg.dev/PROJECT_ID/ko-example@sha256:DIGEST
Dalam output ini,
DIGEST
adalah nilai ringkasan image.
Pembersihan
Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project Google Cloud yang Anda buat untuk tutorial. Atau, Anda dapat menghapus resource satu per satu.
Menghapus project
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Menghapus resource
Jika ingin menyimpan project Google Cloud yang digunakan dalam tutorial ini, hapus masing-masing resource:
Di Cloud Shell, hapus file yang Anda buat pada tutorial ini:
cd rm -rf ~/container-image-digests-tutorial
Hapus repositori image container di Artifact Registry:
gcloud artifacts repositories delete REPOSITORY \ --location=LOCATION --async --quiet
Langkah berikutnya
- Pelajari ringkasan image container lebih lanjut.
- Pelajari lebih lanjut fungsi KRM sisi klien digester dan webhook bermutasi Kubernetes.
- Pelajari Continuous delivery bergaya GitOps dengan Cloud Build.