Menggunakan ringkasan image container dalam manifes Kubernetes

Last reviewed 2023-07-21 UTC

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. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

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

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the Artifact Registry API.

    Enable the API

  4. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

  5. Di Cloud Shell, tetapkan project default untuk Google Cloud CLI:

    gcloud config set project PROJECT_ID
    

    Ganti PROJECT_ID dengan [project ID] Anda.

  6. 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, misalnya digest-tutorial.
    • LOCATION: lokasi Artifact Registry, misalnya us-central1.
  7. 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:

  1. 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
    
  2. Buat clone repositori Git Skaffold:

    git clone https://github.com/GoogleContainerTools/skaffold.git
    
  3. Buka direktori contoh getting-started:

    cd skaffold/examples/getting-started
    
  4. Lihat tag Git yang cocok dengan versi Skaffold Anda:

    git checkout $(skaffold version)
    
  5. 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 nama k8s-pod.yaml.

    Untuk ringkasan semua opsi yang tersedia, lihat dokumentasi referensi skaffold.yaml.

  6. 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 kolom image cocok dengan nilai kolom image di file skaffold.yaml. Skaffold mengganti nilai placeholder ini dengan nama image lengkap dan ringkasan dalam output yang dirender.

  7. 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 ke false. Tetapkan flag ini ke false 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.

  8. 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 perintah skaffold 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.
  9. 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

  1. 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
    
  2. 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
    
  3. Buat manifes Pod Kubernetes yang merujuk image gcr.io/google-containers/echoserver menggunakan tag 1.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
    
  4. 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.

  5. 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

  1. 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
    
  2. Buat cluster Kubernetes lokal menggunakan kind:

    kind create cluster
    

    kind adalah alat command line untuk menjalankan cluster Kubernetes lokal menggunakan Docker.

  3. 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 -
    
  4. Buat namespace Kubernetes bernama digester-demo di cluster kind:

    kubectl create namespace digester-demo
    
  5. Tambahkan label digest-resolution: enabled ke namespace digester-demo:

    kubectl label namespace digester-demo digest-resolution=enabled
    

    Webhook digester menambahkan ringkasan ke Pod dalam namespace dengan label ini.

  6. Buat manifes Deployment Kubernetes yang mereferensikan image gcr.io/google-containers/echoserver menggunakan tag 1.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
    
  7. Terapkan manifes dalam namespace digester-demo:

    kubectl apply --filename deployment.yaml --namespace digester-demo \
        --output jsonpath='{.spec.template.spec.containers[].image}{"\n"}'
    

    Flag --output menginstruksikan kubectl 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.

  8. 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.

  1. 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
    
  2. Buat paket kpt di direktori saat ini:

    kpt pkg init --description "Container image digest tutorial"
    
  3. Buat manifes Pod Kubernetes yang merujuk image gcr.io/google-containers/echoserver menggunakan tag 1.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
    
  4. Gunakan kpt untuk membuat penyetel yang disebut echoimage untuk kolom manifes, dengan nilai yang ada adalah gcr.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"
    
  5. 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
  6. Dapatkan nilai ringkasan image container:

    DIGEST=$(gcloud container images describe \
        gcr.io/google-containers/echoserver:1.10 \
        --format='value(image_summary.digest)')
    
  7. 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.

  8. 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:

  1. 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
    
  2. Buat file kustomization.yaml:

    kustomize init
    
  3. Buat manifes Kubernetes dengan spesifikasi Pod yang mereferensikan image gcr.io/google-containers/echoserver menggunakan tag 1.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
    
  4. Tambahkan manifes sebagai resource dalam file kustomization.yaml:

    kustomize edit add resource pod.yaml
    
  5. Gunakan transformer image untuk memperbarui ringkasan image:

    kustomize edit set image \
        gcr.io/google-containers/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
    
  6. 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
  7. 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
  8. 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:

  1. 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
    
  2. Instal gke-deploy:

    go install github.com/GoogleCloudPlatform/cloud-builders/gke-deploy@latest
    
  3. Buat manifes Deployment Kubernetes yang mereferensikan image gcr.io/google-containers/echoserver menggunakan tag 1.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
    
  4. 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
    
  5. 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 perintah gke-deploy menetapkan nilai label app.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 untuk gke-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

  1. 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
    
  2. Download ko dan tambahkan ke PATH 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
    
  3. Buat aplikasi Go dengan nama modul example.com/hello-world di direktori baru bernama app:

    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
    
  4. 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.

  5. 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 bahwa ko menggunakan nama pendek direktori paket utama sebagai nama image.

      ko mencetak nama image dan ringkasan ke stdout 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:

      1. Membuat manifes Pod Kubernetes. Manifes menggunakan ko://IMPORT_PATH_OF_YOUR_MAIN_PACKAGE placeholder sebagai nilai kolom image:

        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
        
      2. 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 ke stdout:

        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

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. 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:

  1. Di Cloud Shell, hapus file yang Anda buat pada tutorial ini:

    cd
    rm -rf ~/container-image-digests-tutorial
    
  2. Hapus repositori image container di Artifact Registry:

    gcloud artifacts repositories delete REPOSITORY \
        --location=LOCATION --async --quiet
    

Langkah berikutnya