Memigrasikan image container dari registry pihak ketiga ke Artifact Registry memungkinkan Anda menggabungkan pengelolaan image dan menghindari gangguan build atau deployment dari pembatasan kapasitas dan pemadaman layanan eksternal. Anda dapat mengidentifikasi image yang sering ditarik dan menyalinnya ke Artifact Registry untuk deployment ke lingkungan Google Cloud seperti Google Kubernetes Engine atau Cloud Run.
Ringkasan migrasi
Migrasi image container Anda mencakup langkah-langkah berikut:
- Siapkan prasyarat.
- Identifikasi image yang akan dimigrasikan.
- Telusuri file Dockerfile dan manifes deployment Anda untuk menemukan referensi ke registry pihak ketiga
- Menentukan frekuensi pull image dari registry pihak ketiga menggunakan Cloud Logging dan BigQuery.
- Salin image yang diidentifikasi ke Artifact Registry.
- Pastikan izin ke registry dikonfigurasi dengan benar, terutama jika Artifact Registry dan lingkungan deployment Google CloudAnda berada di project yang berbeda.
- Perbarui manifes untuk deployment Anda.
- Deploy ulang workload Anda.
Artifact Registry tidak memantau registry upstream untuk update pada image yang disalin. Jika ingin menggabungkan versi image yang lebih baru ke dalam pipeline, Anda harus mengirimkannya ke Artifact Registry.
Sebelum memulai
- Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
-
Instal Google Cloud CLI.
-
Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.
-
Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:
gcloud init -
Buat atau pilih project Google Cloud .
Peran yang diperlukan untuk memilih atau membuat project
- Memilih project: Memilih project tidak memerlukan peran IAM tertentu—Anda dapat memilih project apa pun yang perannya telah diberikan kepada Anda.
-
Membuat project: Untuk membuat project, Anda memerlukan peran Project Creator
(
roles/resourcemanager.projectCreator), yang berisi izinresourcemanager.projects.create. Pelajari cara memberikan peran.
-
Buat project Google Cloud :
gcloud projects create PROJECT_ID
Ganti
PROJECT_IDdengan nama untuk Google Cloud project yang Anda buat. -
Pilih project Google Cloud yang Anda buat:
gcloud config set project PROJECT_ID
Ganti
PROJECT_IDdengan nama project Google Cloud Anda.
-
Pastikan penagihan diaktifkan untuk project Google Cloud Anda.
Aktifkan Artifact Registry API, jika belum diaktifkan:
Peran yang diperlukan untuk mengaktifkan API
Untuk mengaktifkan API, Anda memerlukan izin
serviceusage.services.enable. Jika Anda membuat project, kemungkinan Anda sudah memiliki izin ini melalui peran Pemilik (roles/owner). Jika tidak, Anda bisa mendapatkan izin ini melalui peran Service Usage Admin (roles/serviceusage.serviceUsageAdmin). Pelajari cara memberikan peran.gcloud services enable artifactregistry.googleapis.com
-
Instal Google Cloud CLI.
-
Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.
-
Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:
gcloud init -
Buat atau pilih project Google Cloud .
Peran yang diperlukan untuk memilih atau membuat project
- Memilih project: Memilih project tidak memerlukan peran IAM tertentu—Anda dapat memilih project apa pun yang perannya telah diberikan kepada Anda.
-
Membuat project: Untuk membuat project, Anda memerlukan peran Project Creator
(
roles/resourcemanager.projectCreator), yang berisi izinresourcemanager.projects.create. Pelajari cara memberikan peran.
-
Buat project Google Cloud :
gcloud projects create PROJECT_ID
Ganti
PROJECT_IDdengan nama untuk Google Cloud project yang Anda buat. -
Pilih project Google Cloud yang Anda buat:
gcloud config set project PROJECT_ID
Ganti
PROJECT_IDdengan nama project Google Cloud Anda.
-
Pastikan penagihan diaktifkan untuk project Google Cloud Anda.
Aktifkan Artifact Registry API, jika belum diaktifkan:
Peran yang diperlukan untuk mengaktifkan API
Untuk mengaktifkan API, Anda memerlukan izin
serviceusage.services.enable. Jika Anda membuat project, kemungkinan Anda sudah memiliki izin ini melalui peran Pemilik (roles/owner). Jika tidak, Anda bisa mendapatkan izin ini melalui peran Service Usage Admin (roles/serviceusage.serviceUsageAdmin). Pelajari cara memberikan peran.gcloud services enable artifactregistry.googleapis.com
- Jika Anda tidak memiliki repositori Artifact Registry, buat repositori dan konfigurasikan autentikasi untuk klien pihak ketiga yang memerlukan akses ke repositori.
- Verifikasi izin Anda. Anda harus memiliki peran IAM Owner atau Editor di project tempat Anda memigrasikan image ke Artifact Registry.
- Ekspor variabel lingkungan berikut:
export PROJECT=$(gcloud config get-value project)
- Pastikan Go versi 1.13 atau yang lebih baru telah diinstal.
Jika Anda perlu menginstal atau mengupdate Go, lihat dokumentasi penginstalan Go.go version
Biaya
Panduan ini menggunakan komponen Google Cloudyang dapat ditagih berikut:
Mengidentifikasi image yang akan dimigrasikan
Telusuri file yang Anda gunakan untuk membangun dan men-deploy image container untuk referensi ke registry pihak ketiga, lalu periksa seberapa sering Anda mengambil image.
Mengidentifikasi referensi di Dockerfile
Lakukan langkah ini di lokasi tempat Dockerfile Anda disimpan. Ini mungkin tempat kode Anda diperiksa secara lokal atau di Cloud Shell jika file tersedia di VM.Dalam direktori yang berisi 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 sesuai 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-checkout secara lokal atau di Cloud Shell jika file tersedia di VM.- Di direktori dengan manifes GKE atau Cloud Run, jalankan perintah berikut:
Outputnya akan terlihat seperti berikut:grep -inr -H --include \*.yaml "image:" . | grep -i -v -E 'docker.pkg.dev|gcr.io'
Perintah ini akan melihat semua file YAML di direktori Anda dan mengidentifikasi baris image:. Sesuaikan perintah sesuai kebutuhan agar berfungsi dengan cara penyimpanan manifes Anda./code/deploy/k8s/ubuntu16-04.yaml:63: image: busybox:1.31.1-uclibc ./code/deploy/k8s/master.yaml:26: image: kubernetes/redis:v1 - Untuk mencantumkan image yang berjalan di cluster, jalankan perintah berikut:
Perintah ini menampilkan semua objek yang berjalan di cluster Kubernetes yang dipilih dan mendapatkan nama image-nya. Outputnya akan terlihat seperti berikut:kubectl get all --all-namespaces -o yaml | grep image: | grep -i -v -E 'docker.pkg.dev|gcr.io'
- 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 image untuk menentukan apakah penggunaan Anda mendekati atau melebihi batas kapasitas yang diterapkan oleh registry pihak ketiga.
Mengumpulkan data log
Membuat sink log untuk mengekspor data ke BigQuery. Sink log mencakup tujuan dan kueri yang memilih entri log yang akan diekspor. Anda dapat membuat sink dengan mengkueri setiap project, atau menggunakan skrip untuk mengumpulkan data di seluruh project.
Untuk membuat sink bagi satu project:
-
Di konsol Google Cloud , buka halaman Logs Explorer:
Jika Anda menggunakan kotak penelusuran untuk menemukan halaman ini, pilih hasil yang subjudulnya adalah Logging.
Pilih project Google Cloud .
Di tab Pembuat Kueri, masukkan kueri berikut:
resource.type="k8s_pod" jsonPayload.reason="Pulling"Ubah filter histori perubahan dari Last 1 hour menjadi Last 7 Days.

Klik Run Query.
Setelah memverifikasi bahwa hasil ditampilkan dengan benar, klik Actions > Create Sink.
Dalam dialog Sink details, selesaikan langkah-langkah berikut:
- Di kolom Sink Name, masukkan
image_pull_logs. - Di Sink description, masukkan deskripsi sink.
- Di kolom Sink Name, masukkan
Klik Berikutnya.
Dalam dialog Sink destination, pilih nilai berikut:
- Di kolom Select Sink service, pilih BigQuery dataset.
- 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.
- Klik Create dataset.
Klik Berikutnya.
Di bagian Choose logs to include in sink, kueri cocok dengan kueri yang Anda jalankan di tab Pembuat Kueri.
Klik Berikutnya.
Opsional: Pilih log yang akan difilter dari sink. Untuk mengetahui informasi selengkapnya tentang cara membuat kueri dan memfilter data Cloud Logging, lihat Bahasa kueri logging.
Klik Create Sink.
Sink log Anda telah dibuat.
Untuk membuat sink bagi beberapa project:
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"' donedi mana
- 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 set data, misalnya
image_pull_logs.
- PROJECT-LIST adalah daftar project ID Google Cloud ,
yang dipisahkan dengan spasi. Contohnya,
Setelah Anda membuat sink, perlu waktu agar data mengalir ke tabel BigQuery, bergantung pada seberapa sering image ditarik.
Kueri untuk frekuensi pengambilan
Setelah Anda memiliki sampel perwakilan dari penarikan image yang dibuat oleh build Anda, jalankan kueri untuk frekuensi penarikan.
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 DESCdi mana
- DATASET-PROJECT adalah project yang berisi set data Anda.
- DATASET-NAME adalah nama set data.
Menyalin image ke Artifact Registry
Setelah mengidentifikasi image dari registry pihak ketiga, Anda siap menyalinnya ke Artifact Registry. Alat gcrane membantu Anda dalam proses penyalinan.
Buat file teks
images.txtdengan nama image yang Anda identifikasi. Contoh:ubuntu:18.04 debian:buster hello-world:latest redis:buster jupyter/tensorflow-notebookDownload gcrane.
GO111MODULE=on go get github.com/google/go-containerregistry/cmd/gcraneBuat skrip bernama
copy_images.shuntuk 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} doneGanti
LOCATIONdengan lokasi regional atau multi-regional repositori.Buat agar skrip dapat dieksekusi:
chmod +x copy_images.shJalankan 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 mengetahui 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 telah diupdate 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 penarikan 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 penarikan image baru harus berasal dari Artifact Registry dan berisi string
docker.pkg.dev.