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 registry di Google Cloud untuk pengelolaan image container yang terpadu dan konsisten.
Selain itu, Anda dapat memanfaatkan kemampuan lain, termasuk mengamankan supply chain software dengan pemindaian kerentanan dan penegakan kebijakan deployment dengan Otorisasi Biner.
Memilih registry
Artifact Registry adalah layanan yang direkomendasikan untuk menyimpan dan mengelola image container dan artefak build lainnya di Google Cloud.
- Jika Anda tidak menggunakan Container Registry, migrasikan image ke Artifact Registry. Artifact Registry memberikan fleksibilitas dan kontrol yang lebih besar, termasuk menyimpan image di region, bukan multi-region, kontrol akses yang lebih terperinci, dan dukungan untuk format artefak lainnya.
- Jika menggunakan Container Registry, Anda dapat Bertransisi ke Artifact Registry.
Ringkasan migrasi
Migrasi image container Anda mencakup langkah-langkah berikut:
- Siapkan prasyarat.
- 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.
- Salin image yang diidentifikasi ke Container Registry.
- Pastikan izin ke registry dikonfigurasi dengan benar, terutama jika Container Registry dan lingkungan deployment Google Cloud Anda berada di project yang berbeda.
- Perbarui manifests untuk deployment Anda.
- Deploy ulang workload Anda.
- (Opsional) Blokir deployment image dari sumber pihak ketiga.
Container Registry tidak memantau registry pihak ketiga untuk mengetahui update pada image yang Anda salin ke Container Registry. Jika ingin menyertakan versi image yang lebih baru ke dalam pipeline, Anda harus mengirimkannya ke Container Registry.
Sebelum memulai
- Verifikasi izin Anda. Anda harus memiliki peran IAM Pemilik atau Editor di project tempat Anda memigrasikan image ke Container Registry.
-
- Pilih project Google Cloud tempat Anda ingin menggunakan Container Registry
- Di konsol Google Cloud, buka Cloud Shell
Temukan project ID Anda dan tetapkan di Cloud Shell. Ganti
YOUR_PROJECT_ID
dengan project ID Anda.gcloud config set project YOUR_PROJECT_ID
Ekspor variabel lingkungan berikut:
export PROJECT=$(gcloud config get-value project)
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
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:
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 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.
Di direktori dengan manifes GKE atau Cloud Run, 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:, sesuaikan sesuai kebutuhan agar sesuai dengan cara manifes disimpan
Untuk menampilkan daftar image 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 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 semua 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 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:
Petunjuk ini ditujukan untuk antarmuka Pratinjau Logging.
Pilih project Google Cloud.
Di tab Query builder, masukkan kueri berikut:
resource.type="k8s_pod" jsonPayload.reason="Pulling"
Ubah filter histori dari Last 1 hour menjadi Last 7 Days.
Klik Run Query.
Setelah memverifikasi bahwa hasil ditampilkan dengan benar, klik Actions > Create Sink.
Dalam daftar sink, pilih BigQuery dataset, lalu klik Next.
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.
- Di kolom Sink Name, masukkan
Klik Create Sink.
Untuk membuat sink untuk 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"' done
di mana
- PROJECT-LIST adalah daftar ID project 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
.
- PROJECT-LIST adalah daftar ID project Google Cloud, yang dipisahkan dengan spasi. Contohnya,
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.
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 Container Registry atau Artifact Registry.
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.
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
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 "${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
Setel agar skrip dapat dieksekusi:
chmod +x copy_images.sh
Jalankan skrip untuk menyalin file:
GCR_PROJECT=${PROJECT} ./copy_images.sh
Memverifikasi izin
Secara default, layanan CI/CD Google Cloud memiliki akses ke Container Registry dalam 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 mendorong atau menarik image di seluruh project, atau jika Anda menggunakan alat pihak ketiga di pipeline yang perlu mengakses Container Registry, pastikan izin dikonfigurasi dengan benar sebelum Anda mengupdate dan men-deploy ulang beban kerja.
Untuk informasi selengkapnya, lihat dokumentasi kontrol akses.
Memperbarui manifes untuk mereferensikan Container Registry
Perbarui Dockerfile dan manifes Anda untuk merujuk ke Container 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 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 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 Container Registry dan berisi string
gcr.io
.
(Opsional) Memblokir pengambilan gambar dari registry pihak ketiga
Untuk cluster GKE yang menggunakan Otorisasi Biner, kebijakan yang Anda tentukan akan otomatis memblokir pull dari sumber yang tidak tepercaya. Pastikan gambar yang dimigrasikan 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 memperbarui kebijakan, pertimbangkan untuk mengaktifkan mode uji coba. Sebagai gantinya, bukan memblokir image, Otorisasi Biner membuat entri log audit sehingga Anda dapat mengidentifikasi image yang belum diproses dari registry pihak ketiga yang perlu dimigrasikan ke Container Registry.
Untuk informasi selengkapnya tentang cara mengonfigurasi kebijakan deployment, lihat dokumentasi Otorisasi Biner.
- Buka halaman Otorisasi Biner
- Klik Edit Policy.
- Di bagian Aturan default project, aktifkan Mode uji coba.
- Di bagian Gambar yang dikecualikan dari aturan deployment, biarkan Percayai semua gambar sistem yang disediakan Google dipilih.
- Luaskan Jalur gambar.
- Tambahkan jalur ke gambar Anda sebagai pengecualian untuk aturan project default:
- Di bagian bawah daftar gambar, klik Tambahkan gambar.
- Masukkan jalur image untuk project Google Cloud Anda.
Misalnya,
gcr.io/my-project/*
mengecualikan semua gambar dalam projectmy-project
.
- Ulangi langkah sebelumnya untuk project lain yang berisi image yang ingin Anda deploy.
Tinjau peristiwa dry run di Logging untuk deployment Anda. Migrasikan image yang tersisa yang Anda ambil secara rutin dari registry pihak ketiga. Setelah semua image Anda dimigrasikan, Anda dapat mengedit kebijakan untuk menonaktifkan mode uji coba dan memblokir image dari sumber yang tidak tepercaya.