ํ์ฌ ๋ ์ง์คํธ๋ฆฌ์์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง ์ผ๋ถ๋ฅผ ์ง์ ๊ฐ์ ธ์ Google Kubernetes Engine ๋๋ Cloud Run๊ณผ ๊ฐ์ Google Cloud ํ๊ฒฝ์ ๋ฐฐํฌํ๋ฉด ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ ๋๋ ํ์ฌ ์๋น์ค ์ค๋จ์ ๋ํ ๋น์จ ์ ํ์ ๋ฐ๋ผ ๋น๋์ ๋ฐฐํฌ๊ฐ ์ค๋จ๋ ์ ์์ต๋๋ค. ์ด ํ์ด์ง์์๋ ํตํฉ์ ์ด๊ณ ์ผ๊ด์ ์ธ ์ปจํ ์ด๋ ์ด๋ฏธ์ง ๊ด๋ฆฌ๋ฅผ ์ํด ์ด๋ฏธ์ง๋ฅผ ํตํฉํด์ Google Cloud์ ๋ ์ง์คํธ๋ฆฌ์ ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
๋ํ ์ทจ์ฝ์ ์ค์บ์ ์ฌ์ฉํ ์ํํธ์จ์ด ๊ณต๊ธ๋ง ๋ณด์ ๋ฐ Binary Authorization์ ์ฌ์ฉํ ๋ฐฐํฌ ์ ์ฑ ์ ์ฉ์ ํฌํจํ ๊ธฐํ ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์์ต๋๋ค.
๋ ์ง์คํธ๋ฆฌ ์ ํ
Artifact Registry๋ Google Cloud์์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง ๋ฐ ๊ธฐํ ๋น๋ ์ํฐํฉํธ ์ ์ฅ ๋ฐ ๊ด๋ฆฌ๋ฅผ ์ํด ๊ถ์ฅ๋๋ ์๋น์ค์ ๋๋ค.
- Container Registry๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ ๋์ ์ด๋ฏธ์ง๋ฅผ Artifact Registry๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ์ธ์. Artifact Registry๋ ๋ฉํฐ ๋ฆฌ์ ๋์ ๋จ์ผ ๋ฆฌ์ ์ ์ด๋ฏธ์ง ์ ์ฅ, ๋ณด๋ค ์ธ๋ถ์ ์ธ ์ก์ธ์ค ์ ์ด, ๊ธฐํ ์ํฐํฉํธ ํ์ ์ง์์ ํฌํจํ์ฌ ๋ฐ์ด๋ ์ ์ฐ์ฑ๊ณผ ์ ์ด ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- Container Registry๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ Artifact Registry๋ก ์ ํํ ์ ์์ต๋๋ค.
๋ง์ด๊ทธ๋ ์ด์ ๊ฐ์
์ปจํ ์ด๋ ์ด๋ฏธ์ง ๋ง์ด๊ทธ๋ ์ด์ ์๋ ๋ค์ ๋จ๊ณ๊ฐ ํฌํจ๋ฉ๋๋ค.
- ๊ธฐ๋ณธ ์๊ฑด์ ์ค์ ํฉ๋๋ค.
- ๋ง์ด๊ทธ๋ ์ด์
ํ ์ด๋ฏธ์ง๋ฅผ ์๋ณํฉ๋๋ค.
- ํ์ฌ ๋ ์ง์คํธ๋ฆฌ์ ๋ํ ์ฐธ์กฐ๋ก Dockerfile ํ์ผ๊ณผ ๋ฐฐํฌ ๋งค๋ํ์คํธ ๊ฒ์
- Cloud Logging ๋ฐ BigQuery๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ ๋ ์ง์คํธ๋ฆฌ์์ ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ ๋น๋๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
- Container Registry์ ์๋ณ๋ ์ด๋ฏธ์ง๋ฅผ ๋ณต์ฌํฉ๋๋ค.
- ๋ ์ง์คํธ๋ฆฌ์ ๋ํ ๊ถํ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋์๋์ง ํนํ Container Registry์ Google Cloud ๋ฐฐํฌ ํ๊ฒฝ์ด ๋ค๋ฅธ ํ๋ก์ ํธ์ ์๋์ง ํ์ธํฉ๋๋ค.
- ๋ฐฐํฌ ๋งค๋ํ์คํธ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
- ์ํฌ๋ก๋๋ฅผ ๋ค์ ๋ฐฐํฌํฉ๋๋ค.
- (์ ํ์ฌํญ) ํ์ฌ ์์ค์ ์ด๋ฏธ์ง ๋ฐฐํฌ๋ฅผ ์ฐจ๋จํฉ๋๋ค.
Container Registry๋ Container Registry๋ก ๋ณต์ฌํ๋ ์ด๋ฏธ์ง ์ ๋ฐ์ดํธ์ ์ฌ์ฉ๋๋ ํ์ฌ ๋ ์ง์คํธ๋ฆฌ๋ฅผ ๋ชจ๋ํฐ๋งํ์ง ์์ต๋๋ค. ์ต์ ๋ฒ์ ์ ์ด๋ฏธ์ง๋ฅผ ํ์ดํ๋ผ์ธ์ ํตํฉํ๋ ค๋ฉด Container Registry๋ก ํธ์ํด์ผ ํฉ๋๋ค.
์์ํ๊ธฐ ์ ์
- ๊ถํ์ ํ์ธํฉ๋๋ค. ์ด๋ฏธ์ง๋ฅผ Container Registry๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ค๋ ํ๋ก์ ํธ์ ์์ ์ ๋๋ ํธ์ง์ IAM ์ญํ ์ด ์์ด์ผ ํฉ๋๋ค.
ํ๋ก์ ํธ ์ ํ๊ธฐ ํ์ด์ง๋ก ์ด๋
- Container Registry๋ฅผ ์ฌ์ฉํ Google Cloud ํ๋ก์ ํธ๋ฅผ ์ ํํฉ๋๋ค.
- Google Cloud ์ฝ์์์ Cloud Shell๋ก ์ด๋ํฉ๋๋ค.
ํ๋ก์ ํธ ID๋ฅผ ์ฐพ์์ Cloud Shell์์ ์ค์ ํฉ๋๋ค.
YOUR_PROJECT_ID
๋ฅผ ํ๋ก์ ํธ ID๋ก ๋ฐ๊ฟ๋๋ค.gcloud config set project YOUR_PROJECT_ID
๋ค์ ํ๊ฒฝ ๋ณ์๋ฅผ ๋ด๋ณด๋ ๋๋ค.
export PROJECT=$(gcloud config get-value project)
๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ BigQuery, Container Registry, Cloud Monitoring API๋ฅผ ์ฌ์ฉ ์ค์ ํฉ๋๋ค.
gcloud services enable \ containerregistry.googleapis.com \ stackdriver.googleapis.com \ logging.googleapis.com \ monitoring.googleapis.com
Go ๋ฒ์ 1.13 ์ด์์ด ์ค์น๋์ด ์๋์ง ํ์ธํฉ๋๋ค.
๋ค์ ๋ช ๋ น์ด๋ก ๊ธฐ์กด Go ์ค์น ๋ฒ์ ์ ํ์ธํฉ๋๋ค.
go version
Go๋ฅผ ์ค์นํ๊ฑฐ๋ ์ ๋ฐ์ดํธํด์ผ ํ๋ ๊ฒฝ์ฐ Go ์ค์น ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
๋น์ฉ
์ด ๊ฐ์ด๋์์๋ ๋น์ฉ์ด ์ฒญ๊ตฌ๋ ์ ์๋ ๋ค์๊ณผ ๊ฐ์ Google Cloud ๊ตฌ์ฑ์์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ง์ด๊ทธ๋ ์ด์ ํ ์ด๋ฏธ์ง ์๋ณ
ํ์ฌ ๋ ์ง์คํธ๋ฆฌ์ ๋ํ ์ฐธ์กฐ์ฉ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋น๋ ๋ฐ ๋ฐฐํฌํ๋ ๋ฐ ์ฌ์ฉํ ํ์ผ์ ๊ฒ์ํ ํ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ค๋ ๋น๋๋ฅผ ํ์ธํฉ๋๋ค.
Dockerfile์์ ์ฐธ์กฐ ์๋ณ
Dockerfile์ด ์ ์ฅ๋ ์์น์์ ์ด ๋จ๊ณ๋ฅผ ์ํํฉ๋๋ค. ํ์ผ์ VM์์ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ์ฝ๋๊ฐ ๋ก์ปฌ์์ ์ฒดํฌ์์๋๊ฑฐ๋ Cloud Shell์ ์๋ ์์น์ผ ์ ์์ต๋๋ค.
Dockerfile์ด ์๋ ๋๋ ํฐ๋ฆฌ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
grep -inr -H --include Dockerfile\* "FROM" . | grep -i -v -E 'docker.pkg.dev|gcr.io'
์ถ๋ ฅ์ ๋ค์ ์์์ ๊ฐ์ด ํ์๋ฉ๋๋ค.
./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
์ด ๋ช ๋ น์ด๋ ๋๋ ํฐ๋ฆฌ์ ๋ชจ๋ Dockerfile์ ๊ฒ์ํ๊ณ "FROM" ์ค์ ์๋ณํฉ๋๋ค. Dockerfile์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ๊ณผ ์ผ์นํ๋๋ก ๋ช ๋ น์ด๋ฅผ ์กฐ์ ํฉ๋๋ค.
๋งค๋ํ์คํธ์์ ์ฐธ์กฐ ์๋ณ
GKE ๋๋ Cloud Run ๋งค๋ํ์คํธ๊ฐ ์ ์ฅ๋๋ ์์น์์ ์ด ๋จ๊ณ๋ฅผ ์ํํฉ๋๋ค. ํ์ผ์ VM์์ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ์ฝ๋๊ฐ ๋ก์ปฌ์์ ์ฒดํฌ์์๋๊ฑฐ๋ Cloud Shell์ ์๋ ์์น์ผ ์ ์์ต๋๋ค.
GKE ๋๋ Cloud Run ๋งค๋ํ์คํธ๊ฐ ์๋ ๋๋ ํฐ๋ฆฌ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
grep -inr -H --include \*.yaml "image:" . | grep -i -v -E 'docker.pkg.dev|gcr.io'
์ํ ๊ฒฐ๊ณผ:
./code/deploy/k8s/ubuntu16-04.yaml:63: image: busybox:1.31.1-uclibc ./code/deploy/k8s/master.yaml:26: image: kubernetes/redis:v1
์ด ๋ช ๋ น์ด๋ ๋๋ ํฐ๋ฆฌ์ ๋ชจ๋ YAML ํ์ผ์ ํ์ธํ๊ณ image: ์ค์ ์๋ณํ ํ ๋งค๋ํ์คํธ๊ฐ ์ ์ฅ๋๋ ๋ฐฉ์์ ๋ฐ๋ผ ์กฐ์ ํฉ๋๋ค.
ํ์ฌ ํด๋ฌ์คํฐ์์ ์คํ ์ค์ธ ์ด๋ฏธ์ง๋ฅผ ๋์ดํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
kubectl get all --all-namespaces -o yaml | grep image: | grep -i -v -E 'docker.pkg.dev|gcr.io'
์ด ๋ช ๋ น์ด๋ ํ์ฌ ์ ํ๋ Kubernetes ํด๋ฌ์คํฐ์์ ์คํ ์ค์ธ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ณ ์ด๋ฏธ์ง ์ด๋ฆ์ ๊ฐ์ ธ์ต๋๋ค.
์ํ ๊ฒฐ๊ณผ:
- image: nginx image: nginx:latest - image: nginx - image: nginx
์ ์ฒด Google Cloud ํ๋ก์ ํธ์ ๋ชจ๋ GKE ํด๋ฌ์คํฐ์ ์ด ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
ํ์ฌ ๋ ์ง์คํธ๋ฆฌ์์ ๊ฐ์ ธ์ค๊ธฐ ๋น๋ ์๋ณ
ํ์ฌ ๋ ์ง์คํธ๋ฆฌ์์ ๊ฐ์ ธ์ค๋ ํ๋ก์ ํธ์์ ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ ๋น๋์ ๋ํ ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ๋์ด ํ์ฌ ๋ ์ง์คํธ๋ฆฌ์์ ์ ์ฉํ๋ ๋น์จ ์ ํ์ ๊ทผ์ ํ๊ฑฐ๋ ์ด๋ฅผ ์ด๊ณผํ๋์ง ํ์ธํฉ๋๋ค.
๋ก๊ทธ ๋ฐ์ดํฐ ์์ง
๋ก๊ทธ ์ฑํฌ๋ฅผ ๋ง๋ค์ด BigQuery๋ก ๋ฐ์ดํฐ๋ฅผ ๋ด๋ณด๋ ๋๋ค. ๋ก๊ทธ ์ฑํฌ์๋ ๋ด๋ณด๋ผ ๋ก๊ทธ ํญ๋ชฉ์ ์ ํํ๋ ๋์๊ณผ ์ฟผ๋ฆฌ๊ฐ ํฌํจ๋ฉ๋๋ค. ๊ฐ๋ณ ํ๋ก์ ํธ๋ฅผ ์ฟผ๋ฆฌํ์ฌ ์ฑํฌ๋ฅผ ๋ง๋ค๊ฑฐ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์์งํ ์ ์์ต๋๋ค.
๋จ์ผ ํ๋ก์ ํธ์ ์ฑํฌ๋ฅผ ๋ง๋ค๋ ค๋ฉด ๋ค์ ์๋ด๋ฅผ ๋ฐ๋ฅด์ธ์.
๋ค์ ์๋ด๋ Logging ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ธํฐํ์ด์ค์ ์ ์ฉ๋ฉ๋๋ค.
Google Cloud ํ๋ก์ ํธ๋ฅผ ์ ํํฉ๋๋ค.
์ฟผ๋ฆฌ ๋น๋ ํญ์์ ๋ค์ ์ฟผ๋ฆฌ๋ฅผ ์ ๋ ฅํฉ๋๋ค.
resource.type="k8s_pod" jsonPayload.reason="Pulling"
๋ณ๊ฒฝ ๋ด์ญ ํํฐ๋ฅผ ์ง๋ 1์๊ฐ์์ ์ง๋ 7์ผ๋ก ๋ณ๊ฒฝํฉ๋๋ค.
์ฟผ๋ฆฌ ์คํ์ ํด๋ฆญํฉ๋๋ค.
๊ฒฐ๊ณผ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ํ์๋๋์ง ํ์ธํ ํ ์์ > ์ฑํฌ ๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
์ฑํฌ ๋ชฉ๋ก์์ BigQuery ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ ํํ ํ ๋ค์์ ํด๋ฆญํฉ๋๋ค.
์ฑํฌ ์์ ํจ๋์์ ๋ค์ ๋จ๊ณ๋ฅผ ์ํํฉ๋๋ค.
- ์ฑํฌ ์ด๋ฆ ํ๋์
image_pull_logs
๋ฅผ ์ ๋ ฅํฉ๋๋ค. - ์ฑํฌ ๋์ ํ๋์์ ์ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ง๋ค๊ฑฐ๋ ๋ค๋ฅธ ํ๋ก์ ํธ์ ๋์ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ ํํฉ๋๋ค.
- ์ฑํฌ ์ด๋ฆ ํ๋์
์ฑํฌ ๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
์ฌ๋ฌ ํ๋ก์ ํธ์ ์ฑํฌ๋ฅผ ๋ง๋ค๋ ค๋ฉด ๋ค์ ์๋ด๋ฅผ ๋ฐ๋ฅด์ธ์.
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
๊ฐ ํญ๋ชฉ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- PROJECT-LIST๋ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋ Google Cloud ํ๋ก์ ํธ ID์ ๋ชฉ๋ก์
๋๋ค. ์๋ฅผ ๋ค๋ฉด
project1 project2 project3
์ ๋๋ค. - DATASET-PROJECT๋ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ ์ฅํ ํ๋ก์ ํธ์ ๋๋ค.
- DATASET-NAME์ ๋ฐ์ดํฐ ์ธํธ ์ด๋ฆ์
๋๋ค(์:
image_pull_logs
).
- PROJECT-LIST๋ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋ Google Cloud ํ๋ก์ ํธ ID์ ๋ชฉ๋ก์
๋๋ค. ์๋ฅผ ๋ค๋ฉด
์ฑํฌ๋ฅผ ๋ง๋ ํ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ค๋ ๋น๋์ ๋ฐ๋ผ BigQuery ํ ์ด๋ธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค.
๊ฐ์ ธ์ค๊ธฐ ๋น๋ ์ฟผ๋ฆฌ
๋น๋๊ฐ ์ํํ๋ ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ์ ๋ํ ์ํ์ด ์์ผ๋ฉด ๊ฐ์ ธ์ค๊ธฐ ๋น๋์ ์ฟผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค.
๋ค์ ์ฟผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค.
SELECT REGEXP_EXTRACT(jsonPayload.message, r'"(.*?)"') AS imageName, COUNT(*) AS numberOfPulls FROM `DATASET-PROJECT.DATASET-NAME.events_*` GROUP BY imageName ORDER BY numberOfPulls DESC
๊ฐ ํญ๋ชฉ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- DATASET-PROJECT๋ ๋ฐ์ดํฐ ์ธํธ๊ฐ ํฌํจ๋ ํ๋ก์ ํธ์ ๋๋ค.
- DATASET-NAME๋ ๋ฐ์ดํฐ ์ธํธ ์ด๋ฆ์ ๋๋ค.
๋ค์ ์์๋ ์ฟผ๋ฆฌ์ ์ถ๋ ฅ์ ๋ณด์ฌ์ค๋๋ค. imageName ์ด์์ Container Registry ๋๋ Artifact Registry์ ์ ์ฅ๋์ง ์์ ์ด๋ฏธ์ง์ ๊ฐ์ ธ์ค๊ธฐ ๋น๋๋ฅผ ๊ฒํ ํ ์ ์์ต๋๋ค.
Container Registry๋ก ์ด๋ฏธ์ง ๋ณต์ฌ
ํ์ฌ ๋ ์ง์คํธ๋ฆฌ์์ ์ด๋ฏธ์ง๋ฅผ ์๋ณํ๋ฉด ์ด๋ฏธ์ง๋ฅผ Container Registry๋ก ๋ณต์ฌํ ์ ์์ต๋๋ค. gcrane ๋๊ตฌ๋ ๋ณต์ฌ ํ๋ก์ธ์ค๋ฅผ ์ง์ํฉ๋๋ค.
Cloud Shell์์ ํ์ธํ ์ด๋ฏธ์ง์ ์ด๋ฆ์ผ๋ก ํ ์คํธ ํ์ผ
images.txt
๋ฅผ ๋ง๋ญ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.ubuntu:18.04 debian:buster hello-world:latest redis:buster jupyter/tensorflow-notebook
gcrane์ ๋ค์ด๋ก๋ํฉ๋๋ค.
GO111MODULE=on go get github.com/google/go-containerregistry/cmd/gcrane
copy_images.sh
๋ผ๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์ด ํ์ผ ๋ชฉ๋ก์ ๋ณต์ฌํฉ๋๋ค.#!/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
์คํฌ๋ฆฝํธ๋ฅผ ์คํ ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค.
chmod +x copy_images.sh
์คํฌ๋ฆฝํธ๋ฅผ ์คํํ์ฌ ํ์ผ์ ๋ณต์ฌํฉ๋๋ค.
GCR_PROJECT=${PROJECT} ./copy_images.sh
๊ถํ ํ์ธ
๊ธฐ๋ณธ์ ์ผ๋ก Google Cloud CI/CD ์๋น์ค๋ ๋์ผํ Google Cloud ํ๋ก์ ํธ์ Container Registry์ ์ก์ธ์คํฉ๋๋ค.
- Cloud Build๋ ์ด๋ฏธ์ง๋ฅผ ๋ด๋ณด๋ด๊ณ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
- GKE, Cloud Run, App Engine ๊ฐ๋ณํ ํ๊ฒฝ, Compute Engine๊ณผ ๊ฐ์ ๋ฐํ์ ํ๊ฒฝ์์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
ํ๋ก์ ํธ ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ํธ์ํ๊ฑฐ๋ ๊ฐ์ ธ์์ผ ํ๋ ๊ฒฝ์ฐ ๋๋ Container Registry์ ์ก์ธ์คํด์ผ ํ๋ ํ์ฌ ๋๊ตฌ๋ฅผ ํ์ดํ๋ผ์ธ์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ํฌ๋ก๋๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ์ฌ๋ฐฐํฌํ๊ธฐ ์ ์ ๊ถํ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋์ด ์๋์ง ํ์ธํฉ๋๋ค.
์์ธํ ๋ด์ฉ์ ์ก์ธ์ค ์ ์ด ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
Container Registry๋ฅผ ์ฐธ์กฐํ๋๋ก ๋งค๋ํ์คํธ ์ ๋ฐ์ดํธ
ํ์ฌ ๋ ์ง์คํธ๋ฆฌ ๋์ Container Registry๋ฅผ ์ฐธ์กฐํ๋๋ก Dockerfile๊ณผ ๋งค๋ํ์คํธ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
๋ค์ ์์์์๋ ํ์ฌ ๋ ์ง์คํธ๋ฆฌ๋ฅผ ์ฐธ์กฐํ๋ ๋งค๋ํ์คํธ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
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
๋งค๋ํ์คํธ์ ์ด ์ ๋ฐ์ดํธ๋ ๋ฒ์ ์ 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
๋งค๋ํ์คํธ๊ฐ ๋ง์ ๊ฒฝ์ฐ ๋ง์ ํ ์คํธ ํ์ผ์์ ์ ๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ sed๋ ๋ค๋ฅธ ๋๊ตฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ํฌ๋ก๋ ์ฌ๋ฐฐํฌ
์ ๋ฐ์ดํธ๋ ๋งค๋ํ์คํธ๋ก ์ํฌ๋ก๋๋ฅผ ์ฌ๋ฐฐํฌํฉ๋๋ค.
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
๋ชจ๋ ์ ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ๋ Container Registry์์ ์ํ๋์ด์ผ ํ๊ณ gcr.io
๋ฌธ์์ด์ ํฌํจํด์ผ ํฉ๋๋ค.
(์ ํ์ฌํญ) ํ์ฌ ๋ ์ง์คํธ๋ฆฌ์์ ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ ์ฐจ๋จ
Binary Authorization์ ์ฌ์ฉํ๋ GKE ํด๋ฌ์คํฐ์ ๊ฒฝ์ฐ ์ ์๋ ์ ์ฑ ์ ์๋์ผ๋ก ์ ๋ขฐํ ์ ์๋ ์์ค์์ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฐจ๋จํฉ๋๋ค. ๋ง์ด๊ทธ๋ ์ด์ ๋ ์ด๋ฏธ์ง๋ฅผ ์์ธ ๋ชฉ๋ก์ ์ถ๊ฐํ์ฌ ์ด ์ด๋ฏธ์ง๊ฐ ์ ์ฑ ์์ ์ฐจ๋จ๋์ง ์๋์ง ํ์ธํฉ๋๋ค. ์ด ์๋ด์์๋ ํ๋ก์ ํธ ๋ด Container Registry์ ์ ์ฅ๋ ๋ชจ๋ ์ด๋ฏธ์ง์ ์์ธ๋ฅผ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
์ฒ์์ ์ ์ฑ ์ ์ ๋ฐ์ดํธํ ๋๋ ํ ์คํธ ์คํ ๋ชจ๋๋ฅผ ์ฌ์ฉ ์ค์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. Binary Authorization์ ์ด๋ฏธ์ง๋ฅผ ์ฐจ๋จํ๋ ๋์ ๊ฐ์ฌ ๋ก๊ทธ ํญ๋ชฉ์ ๋ง๋ค์ด Container Registry๋ก ๋ง์ด๊ทธ๋ ์ด์ ํด์ผ ํ๋ ํ์ฌ ๋ ์ง์คํธ๋ฆฌ์์ ์ฒ๋ฆฌ๋์ง ์์ ์ด๋ฏธ์ง๋ฅผ ์๋ณํ ์ ์์ต๋๋ค.
๋ฐฐํฌ ์ ์ฑ ์ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ Binary Authorization ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
- Binary Authorization ํ์ด์ง๋ก ์ด๋
- ์ ์ฑ ์์ ์ ํด๋ฆญํฉ๋๋ค.
- ํ๋ก์ ํธ ๊ธฐ๋ณธ ๊ท์น์์ ํ ์คํธ ์คํ ๋ชจ๋๋ฅผ ์ฌ์ฉ ์ค์ ํฉ๋๋ค.
- ๋ฐฐํฌ ๊ท์น์์ ์ ์ธ๋๋ ์ด๋ฏธ์ง์์ Google์ด ์ ๊ณตํ๋ ๋ชจ๋ ์์คํ ์ด๋ฏธ์ง ์ ๋ขฐ๋ฅผ ์ ํ๋ ์ํ๋ก ๋ก๋๋ค.
- ์ด๋ฏธ์ง ๊ฒฝ๋ก๋ฅผ ํผ์นฉ๋๋ค.
- ์ด๋ฏธ์ง ๊ฒฝ๋ก๋ฅผ ๊ธฐ๋ณธ ํ๋ก์ ํธ ๊ท์น์ ๋ํ ์์ธ๋ก ์ถ๊ฐํฉ๋๋ค.
- ์ด๋ฏธ์ง ๋ชฉ๋ก ํ๋จ์ ์๋ ์ด๋ฏธ์ง ์ถ๊ฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
- Google Cloud ํ๋ก์ ํธ์ ์ด๋ฏธ์ง ๊ฒฝ๋ก๋ฅผ ์
๋ ฅํฉ๋๋ค.
์๋ฅผ ๋ค์ด
gcr.io/my-project/*
๋my-project
ํ๋ก์ ํธ์ ๋ชจ๋ ์ด๋ฏธ์ง๋ฅผ ์์ธ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
- ๋ฐฐํฌํ ์ด๋ฏธ์ง๊ฐ ํฌํจ๋ ๋ค๋ฅธ ํ๋ก์ ํธ์ ์ด์ ๋จ๊ณ๋ฅผ ๋ฐ๋ณตํฉ๋๋ค.
Logging์์ ๋ฐฐํฌ์ ํ ์คํธ ์คํ ์ด๋ฒคํธ๋ฅผ ๊ฒํ ํฉ๋๋ค. ํ์ฌ ๋ ์ง์คํธ๋ฆฌ์์ ์ ๊ธฐ์ ์ผ๋ก ๊ฐ์ ธ์ค๋ ๋๋จธ์ง ์ด๋ฏธ์ง๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํฉ๋๋ค. ๋ชจ๋ ์ด๋ฏธ์ง๊ฐ ๋ง์ด๊ทธ๋ ์ด์ ๋๋ฉด ์ ์ฑ ์ ์์ ํ์ฌ ํ ์คํธ ์คํ ๋ชจ๋๋ฅผ ์ค์งํ๊ณ ์ ๋ขฐํ ์ ์๋ ์์ค์ ์ด๋ฏธ์ง๋ฅผ ์ฐจ๋จํ ์ ์์ต๋๋ค.