Memigrasikan container dari registry pihak ketiga

Jika Anda menarik beberapa image container langsung dari registry pihak ketiga untuk di-deploy ke lingkungan Google Cloud seperti Google Kubernetes Engine atau Cloud Run, batas kapasitas pada penarikan image atau pemadaman layanan pihak ketiga dapat mengganggu build dan deployment Anda. Halaman ini menjelaskan cara mengidentifikasi dan menyalin image tersebut ke registry di Google Cloud untuk pengelolaan image container yang terkonsolidasi dan konsisten.

Selain itu, Anda dapat memanfaatkan kemampuan lainnya, termasuk mengamankan supply chain software dengan pemindaian kerentanan dan penerapan kebijakan deployment dengan Otorisasi Biner.

Memilih registry

Artifact Registry adalah layanan yang direkomendasikan untuk menyimpan dan mengelola image container serta artefak build lainnya di Google Cloud.

  • Jika saat ini tidak menggunakan Container Registry, migrasikan image ke Artifact Registry. Artifact Registry memberikan fleksibilitas dan kontrol yang lebih besar, termasuk menyimpan image di suatu region, bukan multi-region, kontrol akses yang lebih terperinci, dan dukungan untuk format artefak lainnya.
  • Jika saat ini Anda menggunakan Container Registry, gunakan petunjuk dalam dokumen ini untuk memigrasikan image Anda ke host Container Registry.

Ringkasan migrasi

Migrasi image container mencakup langkah-langkah berikut:

  1. Siapkan prasyarat.
  2. Identifikasi gambar yang akan dimigrasikan.
    • Telusuri file Dockerfile dan manifes deployment Anda untuk menemukan referensi ke registry pihak ketiga
    • Tentukan frekuensi pull gambar dari registry pihak ketiga menggunakan Cloud Logging dan BigQuery.
  3. Menyalin image yang teridentifikasi ke Container Registry.
  4. Pastikan izin ke registry sudah dikonfigurasi dengan benar, terutama jika Container Registry dan lingkungan deployment Google Cloud Anda berada dalam project yang berbeda.
  5. Memperbarui manifests untuk deployment Anda.
  6. Deploy ulang workload Anda.
  7. (Opsional) Blokir deployment image dari sumber pihak ketiga.

Container Registry tidak memantau registry pihak ketiga untuk memeriksa update image yang Anda salin ke Container Registry. Jika ingin menggabungkan versi image yang lebih baru ke dalam pipeline, Anda harus mengirimkannya ke Container Registry.

Sebelum memulai

  1. Verifikasi izin Anda. Anda harus memiliki peran IAM Pemilik atau Editor di project tempat Anda memigrasikan image ke Container Registry.
  2. Buka halaman pemilih project

    1. Pilih project Google Cloud tempat Anda ingin menggunakan Container Registry
    2. Di Konsol Google Cloud, buka Cloud Shell
    3. Temukan project ID Anda dan tetapkan di Cloud Shell. Ganti YOUR_PROJECT_ID dengan project ID Anda.

      gcloud config set project YOUR_PROJECT_ID
      
  3. Ekspor variabel lingkungan berikut:

      export PROJECT=$(gcloud config get-value project)
    
  4. Aktifkan BigQuery, Container Registry, dan Cloud Monitoring API dengan perintah berikut:

    gcloud services enable \
    containerregistry.googleapis.com \
    stackdriver.googleapis.com \
    logging.googleapis.com \
    monitoring.googleapis.com
    
  5. Pastikan Go versi 1.13 atau yang lebih baru telah diinstal.

    • Periksa versi penginstalan Go yang ada dengan perintah:

      go version
      
    • Jika Anda perlu menginstal atau mengupdate Go, lihat dokumentasi penginstalan Go.

Biaya

Panduan ini menggunakan komponen Google Cloud yang dapat ditagih berikut:

Identifikasi gambar yang akan dimigrasikan

Telusuri file yang Anda gunakan untuk mem-build dan men-deploy image container untuk referensi ke registry pihak ketiga, lalu periksa seberapa sering Anda menarik image.

Mengidentifikasi referensi di Dockerfile

Lakukan langkah ini di lokasi tempat Dockerfile Anda disimpan. Di sinilah kode Anda mungkin di-check out secara lokal atau di Cloud Shell jika file tersebut tersedia di VM.

Dalam direktori dengan Dockerfile Anda, jalankan perintah:

grep -inr -H --include Dockerfile\* "FROM" . | grep -i -v -E 'docker.pkg.dev|gcr.io'

Outputnya akan terlihat seperti contoh berikut:

./code/build/baseimage/Dockerfile:1:FROM debian:stretch
./code/build/ubuntubase/Dockerfile:1:FROM ubuntu:latest
./code/build/pythonbase/Dockerfile:1:FROM python:3.5-buster

Perintah ini menelusuri semua Dockerfile di direktori Anda dan mengidentifikasi baris "FROM". Sesuaikan perintah yang diperlukan agar cocok dengan cara Anda menyimpan Dockerfile.

Mengidentifikasi referensi dalam manifes

Lakukan langkah ini di lokasi tempat manifes GKE atau Cloud Run Anda disimpan. Di sinilah kode Anda mungkin di-check out secara lokal atau di Cloud Shell jika file tersebut tersedia di VM.

  1. Di direktori tempat manifes GKE atau Cloud Run Anda, jalankan perintah:

    grep -inr -H --include \*.yaml "image:" . | grep -i -v -E 'docker.pkg.dev|gcr.io'
    

    Contoh output:

    ./code/deploy/k8s/ubuntu16-04.yaml:63: image: busybox:1.31.1-uclibc
    ./code/deploy/k8s/master.yaml:26:      image: kubernetes/redis:v1
    

    Perintah ini melihat semua file YAML di direktori Anda dan mengidentifikasi baris image:, dan menyesuaikan dengan kebutuhan agar manifes juga dapat disimpan sesuai kebutuhan.

  2. Untuk menampilkan daftar gambar yang sedang berjalan di cluster, jalankan perintah:

      kubectl get all --all-namespaces -o yaml | grep image: | grep -i -v -E 'docker.pkg.dev|gcr.io'
    

    Perintah ini akan menampilkan semua objek yang berjalan di cluster Kubernetes yang saat ini dipilih dan mendapatkan nama image-nya.

    Contoh output:

    - image: nginx
      image: nginx:latest
        - image: nginx
        - image: nginx
    

Jalankan perintah ini untuk semua cluster GKE di seluruh project Google Cloud untuk cakupan total.

Mengidentifikasi frekuensi pull dari registry pihak ketiga

Dalam project yang mengambil dari registry pihak ketiga, gunakan informasi tentang frekuensi pull image untuk menentukan apakah penggunaan Anda mendekati atau melebihi batas kapasitas yang diberlakukan oleh registry pihak ketiga.

Mengumpulkan data log

Buat sink log untuk mengekspor data ke BigQuery. Sink log menyertakan tujuan dan kueri yang memilih entri log yang akan diekspor. Anda dapat membuat sink dengan membuat kueri satu per satu project, atau menggunakan skrip untuk mengumpulkan data di seluruh project.

Untuk membuat sink bagi satu project:

Petunjuk ini ditujukan untuk Antarmuka pratinjau Logging.

  1. Buka Logs Explorer

  2. Pilih project Google Cloud.

  3. Pada tab Builder kueri, masukkan kueri berikut:

      resource.type="k8s_pod"
      jsonPayload.reason="Pulling"
    
  4. Ubah filter histori dari 1 jam terakhir menjadi 7 Hari Terakhir.

    gambar

  5. Klik Run Query.

  6. Setelah memastikan bahwa hasilnya muncul dengan benar, klik Tindakan > Buat Sink.

  7. Di daftar sink, pilih Set data BigQuery, lalu klik Next.

  8. Di panel Edit Sink, lakukan langkah-langkah berikut:

    • Di kolom Sink Name, masukkan image_pull_logs.
    • Di kolom Sink Destination, buat set data baru atau pilih set data tujuan di project lain.
  9. Klik Create Sink.

Untuk membuat sink bagi beberapa project:

  1. Buka Cloud Shell.

  2. Jalankan perintah berikut di Cloud Shell:

    PROJECTS="PROJECT-LIST"
    DESTINATION_PROJECT="DATASET-PROJECT"
    DATASET="DATASET-NAME"
    
    for source_project in $PROJECTS
    do
      gcloud logging --project="${source_project}" sinks create image_pull_logs bigquery.googleapis.com/projects/${DESTINATION_PROJECT}/datasets/${DATASET} --log-filter='resource.type="k8s_pod" jsonPayload.reason="Pulling"'
    done
    

    dengan

    • PROJECT-LIST adalah daftar project ID Google Cloud, yang dipisahkan dengan spasi. Contohnya, project1 project2 project3.
    • DATASET-PROJECT adalah project tempat Anda ingin menyimpan set data.
    • DATASET-NAME adalah nama untuk set data, misalnya image_pull_logs.

Setelah Anda membuat sink, perlu waktu agar data mengalir ke tabel BigQuery, bergantung pada seberapa sering gambar diambil.

Kueri untuk frekuensi pull

Setelah Anda memiliki sampel pengambilan gambar representatif yang dibuat oleh build Anda, jalankan kueri untuk frekuensi pull.

  1. Buka konsol BigQuery.

  2. Jalankan kueri berikut:

    SELECT
      REGEXP_EXTRACT(jsonPayload.message, r'"(.*?)"') AS imageName,
      COUNT(*) AS numberOfPulls
    FROM
          `DATASET-PROJECT.DATASET-NAME.events_*`
    GROUP BY
          imageName
    ORDER BY
          numberOfPulls DESC
    

    dengan

    • DATASET-PROJECT adalah project yang berisi set data Anda.
    • DATASET-NAME adalah nama set data.

Contoh berikut menampilkan output dari kueri. Di kolom imageName, Anda dapat meninjau frekuensi pull untuk image yang tidak disimpan di Container Registry atau Artifact Registry.

gambar

Menyalin image ke Container Registry

Setelah mengidentifikasi image dari registry pihak ketiga, Anda siap untuk menyalinnya ke Container Registry. Alat gcrane membantu Anda dalam proses penyalinan.

  1. Buat file teks images.txt di Cloud Shell dengan nama gambar yang Anda identifikasi. Contoh:

    ubuntu:18.04
    debian:buster
    hello-world:latest
    redis:buster
    jupyter/tensorflow-notebook
    
  2. Unduh gcrane.

      GO111MODULE=on go get github.com/google/go-containerregistry/cmd/gcrane
    
  3. Buat skrip bernama copy_images.sh untuk menyalin daftar file Anda.

    #!/bin/bash
    
    images=$(cat images.txt)
    
    if [ -z "${GCR_PROJECT}" ]
    then
        echo ERROR: GCR_PROJECT must be set before running this
        exit 1
    fi
    
    for img in ${images}
    do
        gcrane cp ${img} gcr.io/${GCR_PROJECT}/${img}
    done
    

    Buat agar skrip dapat dieksekusi:

      chmod +x copy_images.sh
    
  4. Jalankan skrip untuk menyalin file:

    GCR_PROJECT=${PROJECT}
    ./copy_images.sh
    

Verifikasi izin

Secara default, layanan CI/CD Google Cloud memiliki akses ke Container Registry di project Google Cloud yang sama.

  • Cloud Build dapat mengirim dan mengambil image
  • Lingkungan runtime, seperti GKE, Cloud Run, lingkungan fleksibel App Engine, dan Compute Engine, dapat mengambil image.

Jika Anda perlu mengirim atau mengambil image di seluruh project, atau jika Anda menggunakan alat pihak ketiga di pipeline yang perlu mengakses Container Registry, pastikan izin tersebut dikonfigurasi dengan benar sebelum Anda memperbarui dan men-deploy ulang beban kerja.

Untuk informasi selengkapnya, lihat dokumentasi kontrol akses.

Mengupdate manifes untuk mereferensikan Container Registry

Update Dockerfile dan manifes Anda agar merujuk ke Container Registry, bukan registry pihak ketiga.

Contoh berikut menunjukkan manifes yang merujuk ke registry pihak ketiga:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

Versi manifes terbaru ini mengarah ke image di Container Registry:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: gcr.io/<GCR_PROJECT>/nginx:1.14.2
        ports:
        - containerPort: 80

Untuk manifes dalam jumlah besar, gunakan sed atau alat lain yang dapat menangani update di banyak file teks.

Men-deploy ulang workload

Deploy ulang beban kerja dengan manifes yang telah diperbarui.

Pantau pull image baru dengan menjalankan kueri berikut di konsol BigQuery:

SELECT`

FORMAT_TIMESTAMP("%D %R", timestamp) as timeOfImagePull,
REGEXP_EXTRACT(jsonPayload.message, r'"(.*?)"') AS imageName,
COUNT(*) AS numberOfPulls
FROM
  `image_pull_logs.events_*`
GROUP BY
  timeOfImagePull,
  imageName
ORDER BY
  timeOfImagePull DESC,
  numberOfPulls DESC

Semua pull image baru harus berasal dari Container Registry dan berisi string gcr.io.

(Opsional) Blokir pengambilan gambar dari registry pihak ketiga

Untuk cluster GKE yang menggunakan Otorisasi Biner, kebijakan yang Anda tentukan akan otomatis memblokir pengambilan data dari sumber yang tidak tepercaya. Pastikan gambar yang Anda migrasikan tidak diblokir oleh kebijakan dengan menambahkannya ke daftar pengecualian. Petunjuk ini menjelaskan cara menentukan pengecualian untuk semua image yang disimpan di Container Registry dalam project Anda.

Saat Anda pertama kali mengupdate kebijakan, pertimbangkan untuk mengaktifkan mode uji coba. Alih-alih memblokir image, Otorisasi Biner akan membuat entri log audit agar Anda dapat mengidentifikasi image yang luar biasa dari registry pihak ketiga yang perlu dimigrasikan ke Container Registry.

Untuk mengetahui informasi selengkapnya tentang cara mengonfigurasi kebijakan deployment, lihat dokumentasi Otorisasi Biner.

  1. Buka halaman Otorisasi Biner
  2. Klik Edit Kebijakan.
  3. Di bagian Project default rule, aktifkan Dry run mode.
  4. Di bagian Gambar yang dikecualikan dari aturan deployment, biarkan Percayai semua image sistem yang disediakan Google dipilih.
  5. Luaskan Jalur gambar.
  6. Tambahkan jalur ke image Anda sebagai pengecualian ke aturan project default:
    1. Di bagian bawah daftar gambar, klik Tambahkan gambar.
    2. Masukkan jalur image untuk project Google Cloud Anda. Misalnya, gcr.io/my-project/* mengecualikan semua gambar dalam my-project project.
  7. Ulangi langkah sebelumnya untuk project lain yang berisi image yang ingin Anda deploy.

Meninjau peristiwa uji coba di Logging untuk deployment Anda. Migrasikan image apa pun yang tersisa yang Anda ambil secara rutin dari registry pihak ketiga. Setelah semua gambar dimigrasikan, Anda dapat mengedit kebijakan untuk menonaktifkan mode uji coba dan memblokir gambar dari sumber yang tidak tepercaya.