Cloud Code for Cloud Shell での開発を高速化する

Cloud Code for Cloud Shell でのローカル開発を高速化するには、ファイル同期とホットリロード、保存時の自動デプロイを利用します。そして、Skaffold モジュールを使用して、アプリケーションの一部を個別に開発します。

Skaffold ファイルの同期とホットリロードを有効にする

ローカルの開発用ワークフローの効率を高め、Pod の再ビルド、再デプロイ、再起動を行わずに済むように、Skaffold は変更されたファイルをデプロイ済みコンテナにコピーできます。つまり、静的ファイルとソースコード ファイルに変更を加えた場合、その変更は数秒で反映されるため、フィードバック ループが高速化されます。

静的ファイル(HTML ファイルや CSS ファイルなど)の場合、このファイルをコピーする動作はファイルの同期と呼ばれます。

ソースコード ファイルの場合、この動作はホットリロードと呼ばれ、次のファイル形式をサポートしています。

  • Go: *.go
  • Java: *.java, *.kt, *.scala, *.groovy, *.clj
  • NodeJS: *.js、*.mjs、*.coffee、*.litcoffee、*.json

ホットリロードを構成すると、Skaffold はサポートされているファイルの変更を検出し、これらの変更をクラスタで実行中のコンテナに同期します。ホットリロードをサポートしていないファイル形式が変更されると、イメージの再ビルドがトリガーされ、Pod が再起動します。

Buildpacks を優先ビルダーとして使用している場合、ファイルの自動同期とホット リロードはデフォルトで有効になっています。Docker などの他のビルダーでは、カスタマイズするアーティファクトの skaffold.yaml ファイルで sync セクションを指定できます。

次の同期設定のいずれかを行うことができます(優先順位順)。

  • auto: Skaffold は同期を自動的に構成します。(Jib および Buildpacks のアーティファクトのみ)これは Buildpack のデフォルトです。
  • infer: 変更された各ファイルの宛先は、ビルダーから推測されます。
  • manual: ローカル ワークスペース内のファイルと、実行中のコンテナ内での各ファイルの宛先を指定する必要があります。

skaffold.yaml ファイル内の次のサンプル sync セクションでは、manual 同期を指定して、すべての /static-html HTML ファイルをコンテナ内の static フォルダに同期しています。

build:
  artifacts:
    - image: gcr.io/k8s-skaffold/node-example
      context: node
      sync:
        manual:
          - src: 'static-html/*.html'
            dest: static

ファイルの同期と同期ルールの指定の詳細については、ファイル同期に関する Skaffold のガイドをご覧ください。

Kubernetes で開発する際の新機能を追加する

ファイル同期とホットリロードを設定したら、反復サイクルを開始して、プロジェクトに機能を追加します。変更は Kubernetes Deployment にデプロイされます。Deployment の停止と削除、手動でのイメージのビルドとタグ付け、クラスタの更新は行われません。

標準的な反復サイクルは次のようになります。

  1. プロジェクトに変更を加えます。たとえば、Cloud Code Java Guestbook アプリを使用する場合は、次のように新しいエンドポイントを FrontendController クラスに追加します。

    1. src/main/java/cloudcode/guestbook/frontend から FrontendController.java ファイルを開き、次のものを追加します。

      @RequestMapping("/greeting")
      @ResponseBody
      public String greeting(@RequestParam(value="name", defaultValue="World") String name) {
         return String.format("Hello from Kubernetes with IntelliJ, %s!", name);
      }
      
    2. 新しいアノテーションである RequestMappingResponseBody に必要なインポートを追加します。

  2. 変更を保存するか(Ctrl または Cmd+S)、プロジェクトをビルドします。

    コンソール ウィンドウでは、進行状況とデプロイのログを確認できます。 変更がデプロイされたら、更新を確認します。

  3. 継続的な開発セッションを終了するには、[停止] アイコンをクリックします。

    Cloud Code によって、開発セッションに使用されたすべての Kubernetes リソースが削除されます。

Skaffold 構成を使用してマイクロサービス アプリケーションを開発する

マイクロサービス アプリケーションを開発する場合は、デバッグとデプロイを簡素化するために別々のセクションに個別に取り組むと便利です。

アプリケーションを Skaffold モジュールに分割することで、アプリケーションの一部を個別に開発、デバッグできます。たとえば、Bank of Anthos のサンプルは 10 個のマイクロサービスを含むアプリケーションです。サンプルの skaffold.yaml ファイルでは、これらのサービスを setupdbfrontendbackendloadgenerator という名前の 5 つの skaffold モジュールにグループ化します。

Skaffold モジュールと構成の依存関係を定義する

Skaffold モジュールと構成の依存関係を定義するには、次の手順を行います。

  1. モジュールを定義するプロジェクトを開きます。

  2. skaffold.yaml ファイルを開きます。

  3. skaffold.yaml ファイルに複数の構成がある場合に、構成を Skaffold モジュールにするには、次の行を指定します。

    metadata:
      name: MODULE_NAME_1
    

    たとえば、Bank of Anthos skaffold.yamldb モジュールでは、データベースのデプロイを次のように定義します。

    apiVersion: skaffold/v3
    kind: Config
    metadata:
      name: db # module defining database deployments
    requires:
    - configs:
      - setup
    build:
      artifacts:
      - image: accounts-db
        context: src/accounts-db
      - image: ledger-db
        context: src/ledger-db
    manifests:
      rawYaml:
      - dev-kubernetes-manifests/accounts-db.yaml
      - dev-kubernetes-manifests/ledger-db.yaml
    deploy:
      kubectl: {}
  4. 現在の構成をデプロイする前に別の構成がデプロイされることに依存する構成の場合は、その構成を依存関係に追加する必要があります。構成の依存関係を指定するには、skaffold.yaml ファイルの requires セクションに configs リストを追加します。

    たとえば、Bank of Anthos の skaffold.yaml ファイルには、構成依存関係 setup が含まれています。

    依存関係を定義するには、次のものを skaffold.yaml ファイルに追加します。ここで、DEPENDENCY_NAME は依存関係の名前です。

    requires:
        - configs: DEPENDENCY_NAME
    

    この方法でリストされた構成は、同じファイルまたは現在のプロジェクト内の他の skaffold.yaml ファイルで定義された依存関係を参照できます。

  5. 構成の依存関係をテストするには、特定の Skaffold モジュールとその依存関係を構築するの手順に沿って、各 Skaffold モジュールを個別にビルドして、依存関係とともにデプロイされることを確認します。

特定の Skaffold モジュールとその依存関係をビルドする

モジュールとその依存関係を定義したら、launch.json ファイルでクラウドコードを使用して実行するモジュールを指定できます。

プロジェクトに launch.json ファイルが定義されていない場合、Cloud Code: Run on Kubernetes または Cloud Code: Debug on Kubernetes を実行すると、ビルドするモジュールを選択するように求められます。

  1. コマンド パレット(Ctrl/Cmd + Shift + P)を開き、Cloud Code: Run on Kubernetes を実行します。
  2. [Select modules] をクリックします。
  3. デプロイするモジュールを選択し、[OK] をクリックします。各モジュールは依存関係とともにビルドされます。
  4. プロンプトが表示されたら、イメージ レジストリを選択し、Enter を押します。

プロジェクトに launch.json がある場合は、次の手順に沿って、ビルドする Skaffold モジュールを選択します。

  1. プロジェクトの launch.json ファイルを開きます。

  2. 起動構成を編集して、ビルドする modules のカンマ区切りリストで skaffoldFlags オプションを追加します。skaffoldFlags を省略すると、すべてのモジュールがビルドされます。

      {
        "name": "Run on Kubernetes",
        "type": "cloudcode.kubernetes",
        "request": "launch",
        "skaffoldConfig": "${workspaceFolder}/skaffold.yaml",
        "skaffoldFlags": {
           "modules": ["MODULE_NAME_2,MODULE_NAME_2"],
        "watch": true,
        "cleanUp": true,
        }
      }
    
  3. 編集した起動構成を実行します。

Kubernetes での継続的な開発

必要なオプションで実行ターゲットを構成したら、アプリケーションの通常実行を選択するか、IDE で開発の反復サイクルを開始してソースに加えられた変更を反映し、ライブ アプリケーションの依存関係を定義できます。

Run on Kubernetes の実行ターゲットは、Kubernetes クラスタ上で開発サイクルを開始します。開発サイクルが開始されると、Skaffold を使用して Cloud Code でプロジェクト用のイメージを作成し、タグ付けして構成済みのリポジトリに push し、kubectl を使用してプロジェクトの Kubernetes マニフェストをデプロイします。

  1. 利用可能な構成オプションを使用してデプロイをカスタマイズします。
  2. アプリケーションが Skaffold モジュールを使用するように構成されている場合は、ビルドまたはデプロイする特定のモジュールを選択できます。
  3. コマンド パレットを開き(Ctrl/Cmd + Shift + P を押してください)、Cloud Code: Run on Kubernetes コマンドを実行します。
  4. 現在の Kubernetes コンテキストを使用してアプリを実行する(または目的のアプリに切り替える)かどうかを確認します。Kubernetes コンテキストの設定の詳細については、構成の設定をご覧ください。
  5. リモート クラスタをコンテキストとして選択した場合は、プロンプトが表示されたら、イメージの push 先となるイメージ レジストリを選択します。Container Registry を使用している場合は、既存のレジストリを参照するか、作成するレジストリ名を指定できます。 プロジェクトで Artifact Registry API が有効になっていて、少なくとも 1 つの Artifact Registry リポジトリがある場合、既存の Artifact Registry リポジトリを参照して選択できます。

    Cloud Code はコンテナをビルドして、レジストリに push し、Kubernetes 構成をクラスタに適用して、ロールアウトを待ちます。

次のステップ