先週にgoogleから対処必要ってメールが来た。
せっかく覚えたのに、GCR(google cloud registry)があと1年でフェードアウトするから、さっさとGAR(artifact registry)へ引っ越せってさ。
Container Registry の非推奨 | Container Registry documentation | Google Cloud
非推奨にはなってるけど、すぐには使えなくなるわけじゃなさそう。
こういう響きは、すぐになくなっちゃう可能性もあるのかなぁ。
気持ち悪いから引っ越しちゃう。
dockerイメージをコピーする方法もあるみたいやけど、GCRからローカルにpullしてGARへpushするかな。
それをGKEで動かしてみる。
前にローカルPCで作ったイメージをGCRに登録してGKEで動かしたから、その材料を使う。
GCP gkeのメモ2(gceでpythonサンプルアプリをビルドし、google cloud registoryにpush/pullしてgkeでも動かす) | ギャバンITサービス
VMイメージ壊さずに残ってたかな。
GARを用意#
料金の確認#
もちろんgoogleは商売としてサーバを貸してくれる。
まずは料金確認。
料金 | Artifact Registry | Google Cloud
今の環境やと0.5GBまで無料、ネットワークは同じリージョンなら下りは無料、上りは全部無料、ストレージ使った分がかかるってことかな。
ま、練習やから今はあんまり気にしない。
リポジトリ作成#
docker扱える標準リポジトリを作ってく。
標準リポジトリを作成する | Artifact Registry documentation | Google Cloud
gcraneってツールを使ってコピーすることもできるらしい。
一回しか使わないツールは使わない。
セットアップ方法も書いてある。
標準リポジトリへの移行 | Artifact Registry documentation | Google Cloud
ちゃんと動きを確認して使いましょ。

APIの有効化#
GAR使うためのおまじない。

GCRからローカルPCにpull#
ローカルPCのイメージをカラにする#
前に作ったイメージを確認ね。
1
2
3
4
|
gavannitsales@ubuntu22:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
923557c064da gcr.io/fourth-elixir-383118/hello-world-container:v1.0 "/usr/bin/gunicorn -…" 2 weeks ago Exited (0) 2 weeks ago nervous_gagarin
b202ef51299f hello-world-container "/usr/bin/gunicorn -…" 2 weeks ago Exited (0) 2 weeks ago gracious_swirles
|
残ってるコンテナを潰す。
1
2
3
4
5
6
7
|
gavannitsales@ubuntu22:~$ docker rm 923557c064da
923557c064da
gavannitsales@ubuntu22:~$ docker rm b202ef51299f
b202ef51299f
gavannitsales@ubuntu22:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
gavannitsales@ubuntu22:~$
|
dockerイメージも潰す。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
gavannitsales@ubuntu22:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world-container latest 5de507c26f8a 2 weeks ago 245MB
gcr.io/fourth-elixir-383118/hello-world-container v1.0 5de507c26f8a 2 weeks ago 245MB
gavannitsales@ubuntu22:~$ docker rmi hello-world-container:latest
Untagged: hello-world-container:latest
gavannitsales@ubuntu22:~$ docker rmi gcr.io/fourth-elixir-383118/hello-world-container:v1.0
Untagged: gcr.io/fourth-elixir-383118/hello-world-container:v1.0
Untagged: gcr.io/fourth-elixir-383118/hello-world-container@sha256:fe215a34dc5b5ea4cc1f22c809798e507562daaf9085e1a8304d91d515758554
Deleted: sha256:5de507c26f8a19e551cf039c5805c670d0efc75a9ce373d8b64eca6502bc79fd
gavannitsales@ubuntu22:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gavannitsales@ubuntu22:~$
|
ローカルPCへGCRからpull#
前にGCRへ登録したイメージをローカルPCへpullする。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
gavannitsales@ubuntu22:~$ docker pull gcr.io/fourth-elixir-383118/hello-world-container:v1.0
v1.0: Pulling from fourth-elixir-383118/hello-world-container
2e6e20c8e2e6: Already exists
0551a797c01d: Already exists
512123a864da: Already exists
1e583242b4c3: Already exists
86c34855c25e: Already exists
3b856a94d9d0: Already exists
4f4fb700ef54: Already exists
Digest: sha256:fe215a34dc5b5ea4cc1f22c809798e507562daaf9085e1a8304d91d515758554
Status: Downloaded newer image for gcr.io/fourth-elixir-383118/hello-world-container:v1.0
gcr.io/fourth-elixir-383118/hello-world-container:v1.0
gavannitsales@ubuntu22:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gcr.io/fourth-elixir-383118/hello-world-container v1.0 5de507c26f8a 2 weeks ago 245MB
gavannitsales@ubuntu22:~$
|
ローカルPCにあるイメージでdockerコンテナ動かす#
念のため動くか確認。
参照先のURLはcompute engineの画面で、vmのネットワークのエフィメラルって書いてある箇所のIPを確認したらわかる。
エフィメラルやから起動しなおすごとに変わる。

1
2
3
4
5
|
gavannitsales@ubuntu22:~$ docker run -p 80:8000 gcr.io/fourth-elixir-383118/hello-world-container:v1.0
2023-05-20 17:34:51 [1] [INFO] Starting gunicorn 17.5
2023-05-20 17:34:51 [1] [INFO] Listening at: http://0.0.0.0:8000 (1)
2023-05-20 17:34:51 [1] [INFO] Using worker: sync
2023-05-20 17:34:51 [11] [INFO] Booting worker with pid: 11
|
はい、Helloworldが見えた。

ローカルPCに元のイメージを戻したので、タグ付けもローカルPCでビルドしてGCR登録し終わったときと同じような状態にしてみる。
1
2
3
4
5
6
|
gavannitsales@ubuntu22:~$ docker tag gcr.io/fourth-elixir-383118/hello-world-container:v1.0 hello-world-container
gavannitsales@ubuntu22:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world-container latest 5de507c26f8a 2 weeks ago 245MB
gcr.io/fourth-elixir-383118/hello-world-container v1.0 5de507c26f8a 2 weeks ago 245MB
gavannitsales@ubuntu22:~$
|
GARへ登録#
手続き踏まないと登録はできん。
gcp認証#
前と同じようなことする。
1
2
3
4
5
6
7
8
|
gavannitsales@ubuntu22:~$ gcloud auth login
:(中略)
Enter authorization code: xxxxxxxxxxxxxxxxxxx
You are now logged in as [gavannitsales@gmail.com].
Your current project is [fourth-elixir-383118]. You can change this setting by running:
$ gcloud config set project PROJECT_ID
gavannitsales@ubuntu22:~$
|
docker認証ヘルパーの登録#
docker認証ヘルパーの登録は前にgcloud auth configure-dockerってやってjsonファイルできてるからパス。
でもこれだけじゃダメってのが後でわかって"us-central1-docker.pkg.dev": "gcloud"を追記しないとpushがうまくいかない。
1
2
3
4
5
6
7
8
9
10
11
|
gavannitsales@ubuntu22:~$ cat /home/gavannitsales/.docker/config.json
{
"credHelpers": {
"gcr.io": "gcloud",
"us.gcr.io": "gcloud",
"eu.gcr.io": "gcloud",
"asia.gcr.io": "gcloud",
"staging-k8s.gcr.io": "gcloud",
"marketplace.gcr.io": "gcloud"
}
}gavannitsales@ubuntu22:~$
|
GAR登録するときの権限をつける#
やらなアカンみたい。
ロールはroles/artifactregistry.writeと、roles/artifactregistry.createOnPushWriterをつけた。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
gavannitsales@ubuntu22:~$ gcloud projects add-iam-policy-binding fourth-elixir-383118 \
--member=user:gavannitsales@gmail.com \
--role=roles/artifactregistry.createOnPushWriter
Updated IAM policy for project [fourth-elixir-383118].
bindings:
- members:
- user:gavannitsales@gmail.com
role: roles/artifactregistry.createOnPushWriter
:(中略)
version: 1
gavannitsales@ubuntu22:~$
gavannitsales@ubuntu22:~$ gcloud projects add-iam-policy-binding fourth-elixir-383118 \
--member=user:gavannitsales@gmail.com \
--role=roles/artifactregistry.writer
Updated IAM policy for project [fourth-elixir-383118].
bindings:
- members:
- user:gavannitsales@gmail.com
role: roles/artifactregistry.createOnPushWriter
:(中略)
version: 1
gavannitsales@ubuntu22:~$
|
GARへpush#
ローカルのdockerイメージにタグ付けしてからpushする。
GCRへの登録はこうしてた。
1
2
|
docker tag hello-world-container gcr.io/fourth-elixir-383118/hello-world-container:v1.0
docker push gcr.io/fourth-elixir-383118/hello-world-container:v1.0
|
GARへの登録はこうする。
1
2
|
docker tag hello-world-container us-central1-docker.pkg.dev/fourth-elixir-383118/gavannitsales/hello-world-container:v1.0
docker push us-central1-docker.pkg.dev/fourth-elixir-383118/gavannitsales/hello-world-container:v1.0
|
やってみたら失敗した。
1
2
3
4
5
6
7
8
9
10
11
|
gavannitsales@ubuntu22:~$ docker push us-central1-docker.pkg.dev/fourth-elixir-383118/gavannitsales/hello-world-container:v1.0
The push refers to repository [us-central1-docker.pkg.dev/fourth-elixir-383118/gavannitsales/hello-world-container]
5f70bf18a086: Preparing
76587561c5b7: Preparing
16c5158656f7: Preparing
fdbd8112be4a: Preparing
83109fa660b2: Preparing
30d3c4334a23: Waiting
f2fa9f4cf8fd: Waiting
denied: Permission "artifactregistry.repositories.uploadArtifacts" denied on resource "projects/fourth-elixir-383118/locations/us-central1/repositories/gavannitsales" (or it may not exist)
gavannitsales@ubuntu22:~$
|
docker認証ヘルパーの登録で作るjsonファイルに追記しないといけないみたいなので書き足した。
"us-central1-docker.pkg.dev": "gcloud"ってのが書き足したところ。
1
2
3
4
5
6
7
8
9
10
11
12
|
gavannitsales@ubuntu22:~/.docker$ cat config.json
{
"credHelpers": {
"gcr.io": "gcloud",
"us.gcr.io": "gcloud",
"eu.gcr.io": "gcloud",
"asia.gcr.io": "gcloud",
"staging-k8s.gcr.io": "gcloud",
"marketplace.gcr.io": "gcloud",
"us-central1-docker.pkg.dev": "gcloud"
}
}
|
気を取り直してもう1回動かす。
1
2
3
4
5
6
7
8
9
10
11
|
gavannitsales@ubuntu22:~/.docker$ docker push us-central1-docker.pkg.dev/fourth-elixir-383118/gavannitsales/hello-world-container:v1.0
The push refers to repository [us-central1-docker.pkg.dev/fourth-elixir-383118/gavannitsales/hello-world-container]
5f70bf18a086: Layer already exists
76587561c5b7: Pushed
16c5158656f7: Pushed
fdbd8112be4a: Pushed
83109fa660b2: Pushed
30d3c4334a23: Pushed
f2fa9f4cf8fd: Pushed
v1.0: digest: sha256:fe215a34dc5b5ea4cc1f22c809798e507562daaf9085e1a8304d91d515758554 size: 1779
gavannitsales@ubuntu22:~/
|
はい、入った〜。

GKEでGARにあるイメージを使ってPod起動#
クラスタ作成#
これも前にやったけど、GCRからじゃなくてGARでやってみる。
クラスタは削除しちゃってるので、もう1回作る。
5分ほど待つ。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
gavannitsales@ubuntu22:~$ cat makeGke.sh
gcloud container clusters create narigke --num-nodes=3
gavannitsales@ubuntu22:~$ sh ./makeGke.sh
Default change: VPC-native is the default mode during cluster creation for versions greater than 1.21.0-gke.1500. To create advanced routes based clusters, please pass the `--no-enable-ip-alias` flag
Default change: During creation of nodepools or autoscaling configuration changes for cluster versions greater than 1.24.1-gke.800 a default location policy is applied. For Spot and PVM it defaults to ANY, and for all other VM kinds a BALANCED policy is used. To change the default values use the `--location-policy` flag.
Note: Your Pod address range (`--cluster-ipv4-cidr`) can accommodate at most 1008 node(s).
Creating cluster narigke in us-central1-a... Cluster is being health-checked (master is healthy)...done.
Created [https://container.googleapis.com/v1/projects/fourth-elixir-383118/zones/us-central1-a/clusters/narigke].
To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/us-central1-a/narigke?project=fourth-elixir-383118
kubeconfig entry generated for narigke.
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS
narigke us-central1-a 1.25.8-gke.500 34.28.16.121 e2-medium 1.25.8-gke.500 3 RUNNING
gavannitsales@ubuntu22:~$
|
クラスタの認証情報を取得して接続する。
1
2
3
4
5
6
7
|
gavannitsales@ubuntu22:~$ gcloud container clusters get-credentials narigke
Fetching cluster endpoint and auth data.
kubeconfig entry generated for narigke.
gavannitsales@ubuntu22:~$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* gke_fourth-elixir-383118_us-central1-a_narigke gke_fourth-elixir-383118_us-central1-a_narigke gke_fourth-elixir-383118_us-central1-a_narigke
gavannitsales@ubuntu22:~$
|
Pod起動#
GCRのときはこうしてた。
1
|
kubectl run hello-world --image=gcr.io/fourth-elixir-383118/hello-world-container:v1.0 --port=8000
|
GARなのでこうする。
長いなぁ。
1
|
kubectl run hello-world --image=us-central1-docker.pkg.dev/fourth-elixir-383118/gavannitsales/hello-world-container:v1.0 --port=8000
|
Podはすぐに起動できた。

ログにもエラーないので割愛して、外部接続できるように公開設定入れる。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
gavannitsales@ubuntu22:~$ kubectl expose pod/hello-world --port=80 --target-port=8000 --type=LoadBalancer
service/hello-world exposed
gavannitsales@ubuntu22:~$ kubectl describe service/hello-world
Name: hello-world
Namespace: default
Labels: run=hello-world
Annotations: cloud.google.com/neg: {"ingress":true}
Selector: run=hello-world
Type: LoadBalancer
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.112.11.129
IPs: 10.112.11.129
LoadBalancer Ingress: 34.122.202.245
Port: <unset> 80/TCP
TargetPort: 8000/TCP
NodePort: <unset> 32248/TCP
Endpoints: 10.108.0.6:8000
Session Affinity: None
External Traffic Policy: Cluster
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal EnsuringLoadBalancer 2m3s service-controller Ensuring load balancer
Normal EnsuredLoadBalancer 76s service-controller Ensured load balancer
gavannitsales@ubuntu22:~$
|
LoadBalancer Ingress:に公開アドレスあるから、httpつけてブラウザで開く。

はい、開いたー。