めもめも

データエンジニアリング、機械学習について書いてます

Artifact Registry から GKE にデプロイ

概要

  • コンテナイメージを管理するサービスである Artifact Registry に nginxイメージを push
  • Artifact Registry から GKE にデプロイ
  • nginxをインターネットに公開

環境

Cloud SDK と Docker がインストール済みの環境で実行

$ gcloud -v 

Google Cloud SDK 355.0.0
bq 2.0.71
core 2021.08.27
gsutil 4.67
$ docker -v

Docker version 20.10.8, build 3967b7d

手順

手順は以下のとおりです。

  1. Artifact registryにリポジトリを作成
  2. nginxイメージを公式からpull
  3. nginxイメージにタグづけ
  4. イメージをArtifact registryにpush
  5. GKEクラスター作成
  6. GKEクラスターにnginxコンテナをデプロイ
  7. nginxを公開

① Artifact registryにリポジトリを作成

nginxイメージを保存するためのリポジトリを、事前に作成する必要があります。 スクリーンショット 2021-09-07 14.46.48.png 右上の「リポジトリを作成」から、以下の設定でリポジトリを作成します。

名前   :test-repository 形式   :Docker リージョン:asia-northeast1(東京)

次に、作成したリポジトリへのリクエストを認証するために、以下のコマンドを実行します。

gcloud auth configure-docker asia-northeast1-docker.pkg.dev

これで、イメージをpushする準備ができました。 次に、イメージを準備します。

② nginxイメージを公式からpull

以下のコマンドで公式のnginxイメージをpullしましょう。

docker pull nginx

イメージのpullに成功していたら、以下のコマンドでnginxイメージが表示されます。

docker images

③ nginxイメージにタグづけ

イメージをリポジトリにpushするために、リポジトリ名でタグづけする必要があります。

docker tag nginx asia-northeast1-docker.pkg.dev/プロジェクト名/test-repository/nginx-image

このコマンドを実行することで、nginxイメージに「asia-northeast1-docker.pkg.dev/プロジェクト名/test-repository/nginx-image」というタグが付きます。

④ イメージをArtifact registryにpush

以下のコマンドで、イメージをリポジトリにpushします。

docker push asia-northeast1-docker.pkg.dev/プロジェクト名/test-repository/nginx-image

リポジトリにイメージがpushされました。 スクリーンショット 2021-09-07 16.57.35.png

これでArtifact registryでの作業は完了です。

⑤ GKEクラスタ作成

次にGKEクラスタを作成します。 スクリーンショット 2021-09-07 17.01.21.png 「GKE Standard」を選択し、全てデフォルトの設定のまま、「作成」を押します。

クラスターの作成には、数分かかります。

⑥ GKEクラスタにnginxコンテナをデプロイ

作成したGKEクラスタにnginxコンテナをデプロイしていきましょう。

まず、作成したGKEクラスタに接続できるようにするために、以下のコマンドを実行します。

gcloud container clusters get-credentials cluster-1 --zone us-central1-c --project プロジェクト名

これで、GKEクラスタに接続できるようになりました。
次に、3つのPodを作成するdeploymentをデプロイします。 定義ファイルは以下の通りです。

apiVersion: "apps/v1"
kind: "Deployment"
metadata:
  name: "nginx-1"
  namespace: "default"
  labels:
    app: "nginx-1"
spec:
  replicas: 3
  selector:
    matchLabels:
      app: "nginx-1"
  template:
    metadata:
      labels:
        app: "nginx-1"
    spec:
      containers:
      - name: "nginx-image-1"
        image: "asia-northeast1-docker.pkg.dev/プロジェクト名/test-repository/nginx-image:latest"

この定義ファイルの存在するディレクトリで次のコマンドを実行します。

kubectl apply -f deployment.yaml

deploymentがうまくデプロイできたか確認します。

kubectl get deployments
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
nginx-1   3/3     3            3           46s

⑦ nginxを公開

deploymentがデプロイできたら、LoadBalancerを使ってインターネットに公開します。 定義ファイルは以下の通りです。

apiVersion: "v1"
kind: "Service"
metadata:
  name: "nginx-1-service"
  namespace: "default"
  labels:
    app: "nginx-1"
spec:
  ports:
  - protocol: "TCP"
    port: 80
  selector:
    app: "nginx-1"
  type: "LoadBalancer"

この定義ファイルの存在するディレクトリで次のコマンドを実行します。

kubectl apply -f loadbalancer.yaml 

うまく公開できたかチェックしましょう。

kubectl get services

で表示されるLoadBalancerの外部IPアドレスに対して、curlを実行します。 ※ 外部IPアドレスが表示されるまで、数分かかる可能性があります。

curl -i {外部IPアドレス}:80

HTTP/1.1 200 OK
Server: nginx/1.21.1
.
.
.
(省略)

上手く公開できていれば、ステータスコード200が返ってきます。

最後に

Artifact Registoryにpushしたnginxイメージを、GKEにデプロイし、公開するまでを説明しました。 お疲れ様でした。

参考

https://cloud.google.com/artifact-registry/docs/docker/quickstart?hl=JA