先週にgoogleから対処必要ってメールが来た。
せっかく覚えたのに、GCR(google cloud registry)があと1年でフェードアウトするから、さっさとGAR(artifact registry)へ引っ越せってさ。
非推奨にはなってるけど、すぐには使えなくなるわけじゃなさそう。
こういう響きは、すぐになくなっちゃう可能性もあるのかなぁ。
気持ち悪いから引っ越しちゃう。
dockerイメージをコピーする方法もあるみたいやけど、GCRからローカルにpullしてGARへpushするかな。
それをGKEで動かしてみる。
前にローカルPCで作ったイメージをGCRに登録してGKEで動かしたから、その材料を使う。
VMイメージ壊さずに残ってたかな。
GARを用意
料金の確認
もちろんgoogleは商売としてサーバを貸してくれる。
まずは料金確認。
今の環境やと0.5GBまで無料、ネットワークは同じリージョンなら下りは無料、上りは全部無料、ストレージ使った分がかかるってことかな。
ま、練習やから今はあんまり気にしない。
リポジトリ作成
docker扱える標準リポジトリを作ってく。
gcraneってツールを使ってコピーすることもできるらしい。
一回しか使わないツールは使わない。
セットアップ方法も書いてある。
ちゃんと動きを確認して使いましょ。
APIの有効化
GAR使うためのおまじない。
GCRからローカルPCにpull
ローカルPCのイメージをカラにする
前に作ったイメージを確認ね。
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
残ってるコンテナを潰す。
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イメージも潰す。
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する。
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を確認したらわかる。
エフィメラルやから起動しなおすごとに変わる。
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登録し終わったときと同じような状態にしてみる。
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認証
前と同じようなことする。
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がうまくいかない。
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
をつけた。
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への登録はこうしてた。
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への登録はこうする。
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
やってみたら失敗した。
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"
ってのが書き足したところ。
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回動かす。
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分ほど待つ。
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. 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:~$https://container.googleapis.com/v1/projects/fourth-elixir-383118/zones/us-central1-a/clusters/narigke
クラスタの認証情報を取得して接続する。
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のときはこうしてた。
kubectl run hello-world --image=gcr.io/fourth-elixir-383118/hello-world-container:v1.0 --port=8000
GARなのでこうする。
長いなぁ。
kubectl run hello-world --image=us-central1-docker.pkg.dev/fourth-elixir-383118/gavannitsales/hello-world-container:v1.0 --port=8000
Podはすぐに起動できた。
ログにもエラーないので割愛して、外部接続できるように公開設定入れる。
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つけてブラウザで開く。
はい、開いたー。