Artifact Registry tidak memantau update pada image yang Anda salin ke Artifact Registry di registry pihak ketiga. Jika Anda 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:
- Siapkan prasyarat.
- Identifikasi gambar yang akan dimigrasikan.
- Telusuri file Dockerfile dan manifes deployment Anda untuk menemukan referensi ke registry pihak ketiga
- Tentukan frekuensi penarikan image dari registry pihak ketiga menggunakan Cloud Logging dan BigQuery.
- Salin gambar 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.
Sebelum memulai
- 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.
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry API:
gcloud services enable artifactregistry.googleapis.com
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry API:
gcloud services enable artifactregistry.googleapis.com
- Jika Anda tidak memiliki repositori Artifact Registry, maka buat repositori dan konfigurasikan autentikasi untuk klien pihak ketiga yang memerlukan akses ke repositori.
- Verifikasi izin Anda. Anda harus memiliki peran IAM Pemilik 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
- Di direktori dengan manifes GKE atau Cloud Run
Anda, 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 untuk bekerja dengan cara manifes Anda disimpan./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 gambarnya. 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
-
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 Query builder, masukkan kueri berikut:
resource.type="k8s_pod" jsonPayload.reason="Pulling"
Ubah filter histori perubahan dari 1 Jam Terakhir menjadi 7 Hari Terakhir.
Klik Run Query.
Setelah memverifikasi bahwa hasil muncul dengan benar, klik Actions > Create Sink.
Dalam dialog Sink details, selesaikan tindakan 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 Pilih log untuk disertakan dalam sink, kueri cocok dengan kueri yang Anda jalankan di tab Query builder.
Klik Berikutnya.
Opsional: Pilih log untuk memfilter 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.
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, 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
.
- PROJECT-LIST adalah daftar Google Cloud project ID, yang dipisahkan dengan spasi. Contohnya,
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.
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
Download gcrane.
GO111MODULE=on go get github.com/google/go-containerregistry/cmd/gcrane
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
Jalankan skrip untuk menyalin file:
AR_PROJECT=${PROJECT} ./copy_images.sh
Biaya
Panduan ini menggunakan komponen Google Cloudyang dapat ditagih berikut:
Mengidentifikasi gambar yang akan dimigrasikan
Telusuri file yang Anda gunakan untuk membangun dan men-deploy image container Anda untuk menemukan 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. Lokasi ini mungkin adalah tempat kode Anda di-checkout secara lokal atau di Cloud Shell jika file 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. Lokasi ini mungkin tempat kode Anda di-checkout secara lokal atau di Cloud Shell jika file tersedia di VM.Jalankan perintah sebelumnya untuk semua cluster GKE di semua projectGoogle Cloud untuk mendapatkan cakupan total.
Mengidentifikasi frekuensi penarikan dari registry pihak ketiga
Dalam project yang mengambil dari registry pihak ketiga, gunakan informasi tentang frekuensi penarikan image untuk menentukan apakah penggunaan Anda mendekati atau melebihi batas frekuensi yang diterapkan oleh registry pihak ketiga.
Mengumpulkan data log
Buat sink log untuk mengekspor data ke BigQuery. Sink log mencakup tujuan dan kueri yang memilih entri log yang akan diekspor. Anda dapat membuat tujuan dengan mengkueri setiap project, atau menggunakan skrip untuk mengumpulkan data di seluruh project.
Untuk membuat sink bagi satu project:
Untuk membuat sink untuk beberapa project:
Setelah Anda membuat tujuan, perlu waktu agar data mengalir ke tabel BigQuery, bergantung pada seberapa sering gambar ditarik.
Kueri untuk frekuensi penarikan
Setelah Anda memiliki sampel representatif dari penarikan gambar yang dilakukan build Anda, jalankan kueri untuk frekuensi penarikan.
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.
Verifikasi izin
Pastikan izin dikonfigurasi dengan benar sebelum Anda memperbarui 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 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 sejumlah besar manifes, gunakan sed atau alat lain yang dapat menangani pembaruan di banyak file teks.
Men-deploy ulang workload
Deploy ulang workload dengan manifes yang telah diperbarui.
Pantau 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 dilakukan dari Artifact Registry dan berisi string
docker.pkg.dev
.