Memigrasikan image container dari registry pihak ketiga

Jika Anda mengambil 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 pengambilan image atau pemadaman layanan pihak ketiga dapat mengganggu build dan deployment Anda. Halaman ini menjelaskan cara mengidentifikasi dan menyalin image tersebut ke Artifact Registry untuk pengelolaan image container yang terpadu dan konsisten.

Artifact Registry tidak memantau registry pihak ketiga untuk mengetahui update pada image yang Anda salin ke Artifact Registry. Jika ingin menyertakan versi image yang lebih baru ke dalam pipeline, Anda harus mengirimkannya ke Artifact Registry.

Ringkasan migrasi

Migrasi image container Anda mencakup langkah-langkah berikut:

  1. Siapkan prasyarat.
  2. Identifikasi image yang akan dimigrasikan.
    • Telusuri file Dockerfile dan manifes deployment untuk menemukan referensi ke registry pihak ketiga
    • Tentukan frekuensi pengambilan image dari registry pihak ketiga menggunakan Cloud Logging dan BigQuery.
  3. Salin image yang diidentifikasi ke Artifact Registry.
  4. Pastikan izin ke registry dikonfigurasi dengan benar, terutama jika Artifact Registry dan lingkungan deployment Google CloudAnda berada di project yang berbeda.
  5. Perbarui manifests untuk deployment Anda.
  6. Deploy ulang workload Anda.

Sebelum memulai

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.
  3. To use a federated identity with the gcloud CLI, you must first configure the tool to use a federated identity.

    For more information, see Browser-based sign-in with the gcloud CLI.

  4. To initialize the gcloud CLI, run the following command:

    gcloud init
  5. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

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

  7. Enable the Artifact Registry API:

    gcloud services enable artifactregistry.googleapis.com
  8. Install the Google Cloud CLI.
  9. To use a federated identity with the gcloud CLI, you must first configure the tool to use a federated identity.

    For more information, see Browser-based sign-in with the gcloud CLI.

  10. To initialize the gcloud CLI, run the following command:

    gcloud init
  11. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

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

  13. Enable the Artifact Registry API:

    gcloud services enable artifactregistry.googleapis.com
  14. Jika Anda tidak memiliki repositori Artifact Registry, buat repositori dan konfigurasi autentikasi untuk klien pihak ketiga yang memerlukan akses ke repositori.
  15. Verifikasi izin Anda. Anda harus memiliki peran IAM Pemilik atau Editor di project tempat Anda memigrasikan image ke Artifact Registry.
  16. Ekspor variabel lingkungan berikut:
    export PROJECT=$(gcloud config get-value project)
  17. Pastikan Go versi 1.13 atau yang lebih baru telah diinstal.
    go version
    Jika Anda perlu menginstal atau mengupdate Go, lihat dokumentasi penginstalan Go.

Biaya

Panduan ini menggunakan komponen Google Cloudyang dapat ditagih berikut:

Mengidentifikasi image yang akan dimigrasikan

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

Mengidentifikasi referensi dalam Dockerfile

Lakukan langkah ini di lokasi penyimpanan Dockerfile Anda. Ini mungkin tempat kode Anda diambil secara lokal atau di Cloud Shell jika file tersebut tersedia di VM.

Di 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 sesuai kebutuhan agar cocok dengan cara Anda menyimpan Dockerfile.

Mengidentifikasi referensi dalam manifes

Lakukan langkah-langkah ini di lokasi tempat manifes GKE atau Cloud Run Anda disimpan. Ini mungkin tempat kode Anda di-check out secara lokal atau di Cloud Shell jika file tersebut tersedia di VM.
  1. Di direktori dengan manifes GKE atau Cloud Run, jalankan perintah berikut:
    grep -inr -H --include \*.yaml "image:" . | grep -i -v -E 'docker.pkg.dev|gcr.io'
    Outputnya akan terlihat seperti berikut:
        ./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:. Sesuaikan perintah sesuai kebutuhan untuk menggunakan cara penyimpanan manifes
  2. Untuk mencantumkan image yang berjalan di cluster, jalankan perintah berikut:
    kubectl get all --all-namespaces -o yaml | grep image: | grep -i -v -E 'docker.pkg.dev|gcr.io'
    Perintah ini menampilkan semua objek yang berjalan di cluster Kubernetes yang dipilih dan mendapatkan nama image-nya. Outputnya akan terlihat seperti berikut:
        - image: nginx
          image: nginx:latest
            - image: nginx
            - image: nginx
        

Jalankan perintah sebelumnya untuk semua cluster GKE di semua projectGoogle Cloud untuk cakupan total.

Mengidentifikasi frekuensi pull dari registry pihak ketiga

Dalam project yang mengambil dari registry pihak ketiga, gunakan informasi tentang frekuensi pengambilan gambar untuk menentukan apakah penggunaan Anda mendekati atau melebihi batas kapasitas yang diterapkan registry pihak ketiga.

Mengumpulkan data log

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

Untuk membuat sink untuk satu project:

  1. Di konsol Google Cloud, buka halaman Logs Explorer:

    Buka Logs Explorer

    Jika Anda menggunakan kotak penelusuran untuk menemukan halaman ini, pilih hasil yang subjudulnya adalah Logging.

  2. Pilih project Google Cloud .

  3. Di tab Query builder, masukkan kueri berikut:

      resource.type="k8s_pod"
      jsonPayload.reason="Pulling"
    
  4. Ubah filter histori dari Last 1 hour menjadi Last 7 Days. gambar

  5. Klik Run Query.

  6. Setelah memverifikasi bahwa hasil ditampilkan dengan benar, klik Actions > Create Sink.

  7. Di dialog Sink details, selesaikan tindakan berikut:

    1. Di kolom Sink Name, masukkan image_pull_logs.
    2. Di Deskripsi sink, masukkan deskripsi sink.
  8. Klik Berikutnya.

  9. Pada dialog Sink destination, pilih nilai berikut:

    1. Di kolom Select Sink service, pilih BigQuery dataset.
    2. Di kolom Select BigQuery dataset, pilih Create a new BigQuery dataset dan lengkapi informasi yang diperlukan dalam dialog yang terbuka. Untuk mengetahui informasi selengkapnya tentang cara membuat set data BigQuery, lihat Membuat set data.
    3. Klik Create dataset.
  10. Klik Berikutnya.

    Di bagian Choose logs to include in sink, kueri cocok dengan kueri yang Anda jalankan di tab Query builder.

  11. Klik Berikutnya.

  12. Opsional: Pilih log untuk difilter dari sink. Untuk mengetahui informasi selengkapnya tentang cara membuat kueri dan memfilter data Cloud Logging, lihat Bahasa kueri logging.

  13. Klik Create Sink.

    Sink log Anda telah dibuat.

Untuk membuat sink untuk 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
    

    di mana

    • PROJECT-LIST adalah daftar Google Cloud project ID, 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 frekuensi pengambilan gambar.

Kueri untuk frekuensi pull

Setelah Anda memiliki sampel perwakilan pull gambar yang dibuat build, 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
    

    di mana

    • DATASET-PROJECT adalah project yang berisi set data Anda.
    • DATASET-NAME adalah nama set data.
Contoh berikut menunjukkan output dari kueri. Di kolom imageName, Anda dapat meninjau frekuensi pengambilan untuk image yang tidak disimpan di Artifact Registry atau Container Registry.

gambar

Menyalin image ke Artifact Registry

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

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

    ubuntu:18.04
    debian:buster
    hello-world:latest
    redis:buster
    jupyter/tensorflow-notebook
    
  2. Download 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 "${AR_PROJECT}" ]
    then
        echo ERROR: AR_PROJECT must be set before running this
        exit 1
    fi
    
    for img in ${images}
    do
        gcrane cp ${img} LOCATION-docker.pkg.dev/${AR_PROJECT}/${img}
    done
    

    Ganti LOCATION dengan lokasi repositori regional atau multi-regional.

    Setel agar skrip dapat dieksekusi:

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

    AR_PROJECT=${PROJECT}
    ./copy_images.sh
    

Memverifikasi izin

Pastikan izin dikonfigurasi dengan benar sebelum Anda mengupdate dan men-deploy ulang workload.

Untuk informasi selengkapnya, lihat dokumentasi kontrol akses.

Memperbarui manifes untuk mereferensikan Artifact Registry

Perbarui Dockerfile dan manifes Anda untuk merujuk ke Artifact Registry, bukan registry pihak ketiga.

Contoh berikut menunjukkan manifes yang mereferensikan 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 yang diperbarui ini mengarah ke image di us-docker.pkg.dev.

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: us-docker.pkg.dev/<AR_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 workload dengan manifes yang telah diperbarui.

Lacak pengambilan 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 pengambilan image baru harus berasal dari Artifact Registry dan berisi string docker.pkg.dev.