Google Kubernetes Engine へのデプロイ

このガイドでは、Artifact Registry からイメージを pull して Google Kubernetes Engine にデプロイする方法について説明します。自己ホスト型またはサードパーティの Kubernetes サービスにデプロイする場合は、Artifact Registry からイメージを pull する前に Google Cloud への認証を構成する必要があります。Google Cloud の外部にある Kubernetes ワークロードから Google Cloud への認証を行う方法については、Kubernetes との Workload Identity 連携を構成するをご覧ください。

Google Kubernetes Engine は、Docker リポジトリから直接イメージを pull できます。一部のバージョンには、Artifact Registry Docker リポジトリからイメージを pull するための事前構成済みのサポートが含まれています。

要件

このセクションでは、GKE と統合するための要件について説明します。

権限

GKE は、ノードプールまたはクラスタを作成する際に次のデフォルトを使用します。

これらのデフォルトを使用すると、GKE は同じ Google Cloud プロジェクト内の Artifact Registry リポジトリからイメージを pull できます。ノードからイメージを push する場合、プロジェクト間でイメージを pull または push する場合、ユーザー指定のサービス アカウントを使用する場合、またはデフォルト設定でサポートされていない他の要件がある場合は、アクセスの構成についてアクセス制御のドキュメントをご覧ください。

「permission denied」エラーが発生した場合は、4xx エラーをご覧ください。

GKE バージョン

次の表に、同じプロジェクトの Docker リポジトリからコンテナを pull するデフォルトの権限を持つクラスタを作成するために必要な GKE バージョンの最小要件を示します。

バージョン 必要最小限のパッチ
1.14 1.14.10-gke.22
1.15 1.15.9-gke.8

GKE のバージョンが最小バージョンより前のものである場合は、GKE がイメージを pull できるように Kubernetes imagePullSecrets を構成する必要があります。

GKE が Artifact Registry とは異なるプロジェクトにある場合は、GKE ノードが使用するサービス アカウントに Artifact Registry 権限を付与します。デフォルトでは、ノードは Compute Engine のデフォルトのサービス アカウントを使用します。

イメージを実行する

次のコマンドを使用して、Google Kubernetes Engine クラスタで Artifact Registry イメージを実行できます。

kubectl run [NAME] --image=LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE:TAG

ここで

  • LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションです。
  • PROJECT は、Google Cloud コンソール プロジェクト ID です。プロジェクト ID にコロン(:)が含まれている場合は、ドメインをスコープとするプロジェクトをご覧ください。
  • REPOSITORY は、イメージが保存されるリポジトリの名前です。
  • IMAGE は、リポジトリ内のイメージの名前です。
  • TAG は、pull するイメージ バージョンのタグです。

Kubernetes コマンドの詳細については、kubectl の概要をご覧ください。

containerd ノードイメージのトラブルシューティング

GKE ノード バージョン 1.19 以降、Linux ノードのデフォルト ノードイメージは、Docker(cos)バリアントを含む Container-Optimized OS から、Containerd(cos_containerd)バリアントが含まれている Container-Optimized OS に代わっています。

Docker バイナリは、containerd をランタイムとして使用する Linux ノードで使用できますが、使用しないことをおすすめします。Docker では、Kubernetes が containerd ノードで実行するコンテナを管理しません。このため、Docker コマンドや Docker API を使用して、実行中の Kubernetes コンテナの表示や操作を行うことはできません。

Linux ノードでのデバッグやトラブルシューティングのため、Kubernetes コンテナ ランタイム用にビルドされたポータブル コマンドライン ツール crictl を使用して、containerd と対話できます。crictl は、コンテナやイメージの表示、ログの読み取り、コンテナでのコマンドの実行などの一般的な機能をサポートします。

詳細については、crictl ユーザーガイドcontainerd に関する GKE のドキュメントをご覧ください。

Windows Server ノードの場合、containerd デーモンは containerd という名前の Windows サービスとして実行されます。ログは C:\etc\kubernetes\logs\containerd.log ディレクトリに格納され、ログ エクスプローラLOG NAME: "container-runtime" に表示されます。

公開 Artifact Registry リポジトリからの pull

containerd ノードを含む GKE クラスタにイメージをデプロイしたら、SSH を使用して VM インスタンスに接続し、crictl コマンドを実行してトラブルシューティングを行うことができます。

公開 Artifact Registry リポジトリでは認証は必要ありません。crictl は、限定公開 Artifact Registry リポジトリのイメージを pull するためにも使用できます。

Console

  1. Google Cloud コンソールで、[VM インスタンス] ページに移動します。

    [VM インスタンス] に移動

  2. 仮想マシン インスタンスのリストで、接続するインスタンスの行にある [SSH] の横の矢印をクリックします。

    インスタンス名の横にある SSH ボタン。

  3. [ブラウザ ウィンドウで開く] を選択するか、プルダウン オプションから任意の接続方法を選択します。

  4. Google Cloud コンソールで新しいターミナル ウィンドウが開きます。crictl を使用して Artifact Registry からイメージを pull します。

    crictl pull IMAGE_LOCATION:TAG
    

    出力は次のようになります。

    Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5

    Artifact Registry 非公開リポジトリからイメージを pull する場合は、リポジトリに対する認証を行う必要があります。アクセス トークンを使用して認証情報を提供できます。

gcloud

  1. Google Cloud CLI が最新バージョンであることを確認します。

    gcloud components update
    
  2. VM に接続します。

    gcloud compute ssh --project=PROJECT_ID \
     --zone=ZONE \
     VM_NAME
    

    次のように置き換えます。

    • PROJECT_ID: VM が含まれているプロジェクトの ID
    • ZONE: VM が存在するゾーンの名前
    • VM_NAME: VM の名前

    Google Cloud CLI のデフォルト プロパティを設定している場合、このコマンドの --project フラグと --zone フラグは省略できます。次に例を示します。

    gcloud compute ssh VM_NAME
    
  3. SSH 認証鍵をまだ作成していない場合は、SSH keygen によって生成されます。プロンプトが表示されたら、パスフレーズを入力するか、空白のままにします。

  4. crictl を使用して Artifact Registry からイメージを pull します。

    crictl pull IMAGE_LOCATION:TAG
    
  5. 出力は次のようになります。

    Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5

    Artifact Registry 非公開リポジトリからイメージを pull する場合は、リポジトリに対する認証を行う必要があります。アクセス トークンを使用して認証情報を提供できます。

非公開 Artifact Registry リポジトリからの pull

Console

  1. Google Cloud コンソールで、[VM インスタンス] ページに移動します。

    [VM インスタンス] に移動

  2. 仮想マシン インスタンスのリストで、接続するインスタンスの行にある [SSH] の横の矢印をクリックします。

    インスタンス名の横にある SSH ボタン。

  3. プルダウン オプションから [ブラウザ ウィンドウで開く] を選択します。

  4. Google Cloud コンソールで新しいターミナル ウィンドウが開きます。curl を使用して Compute Engine サービス アカウントのアクセス トークンを生成します。

    curl -s "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google"
    

    出力は、次の例のようになります。

    "access_token":"ya29.c.KpkBCQgdwv6LrZ2tjrCpG6snWwPMX29LzMeUmAV_Hq_XaxUurfXcCfGZfASGh_KbdmUYTvkuV3sh-WaSBplEskdP6Tc
    HDsTv4B9hMyvoL4M9HrzKHuKTa1ZGj_3iQ1lwq_dAMxAPGjxEVKexatwN2KP0EAWyb6R55Cuu8ItgLf9f4pm9lC5zH4Qo0fkxPUsnCGRBe4AYxEpN6T
    sh","expires_in":3526,"token_type":"Bearer"}
  5. 返された出力から access_token の値を引用符なしでコピーします。

  6. crictl pull --creds と、前の手順でコピーした access_token 値を使用してイメージを pull します。

    crictl pull --creds "oauth2accesstoken:ACCESS_TOKEN" IMAGE_LOCATION:TAG

    出力は次のようになります。

    Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5

gcloud

  1. Google Cloud CLI が最新バージョンであることを確認します。

    gcloud components update
    
  2. VM に接続します。

    gcloud compute ssh --project=PROJECT_ID \
     --zone=ZONE \
     VM_NAME
    

    次の変数を置き換えます。

    • PROJECT_ID: VM が含まれているプロジェクトの ID
    • ZONE: VM が存在するゾーンの名前
    • VM_NAME: VM の名前

    Google Cloud CLI のデフォルト プロパティを設定している場合、このコマンドの --project フラグと --zone フラグは省略できます。次に例を示します。

    gcloud compute ssh VM_NAME
    
  3. SSH 認証鍵をまだ作成していない場合は、SSH keygen によって生成されます。プロンプトが表示されたら、パスフレーズを入力するか、空白のままにします。

  4. curl を使用して Compute Engine サービス アカウントのアクセス トークンを生成します。

    curl -s "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google"
    

    出力は次のようになります。

    "access_token":"ya29.c.KpkBCQgdwv6LrZ2tjrCpG6snWwPMX29LzMeUmAV_Hq_XaxUurfXcCfGZfASGh_KbdmUYTvkuV3sh-WaSBplEskdP6Tc
    HDsTv4B9hMyvoL4M9HrzKHuKTa1ZGj_3iQ1lwq_dAMxAPGjxEVKexatwN2KP0EAWyb6R55Cuu8ItgLf9f4pm9lC5zH4Qo0fkxPUsnCGRBe4AYxEpN6T
    sh","expires_in":3526,"token_type":"Bearer"}
  5. 返された出力から access_token の値を引用符なしでコピーします。

  6. crictl pull --creds と、前の手順でコピーした access_token 値を使用してイメージを pull します。

    crictl pull --creds "oauth2accesstoken:ACCESS_TOKEN" IMAGE_LOCATION:TAG

    出力は次のようになります。

    Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5

crictl を使用すると、デベロッパーは Kubernetes コンポーネントを設定せずにランタイムをデバッグできます。コマンドの一覧については、crictl のドキュメントKubernetes デバッグのドキュメントをご覧ください。