はじめに

Cloud Runのマルチコンテナサポートのプレビューで利用が可能になりました。
すでに色々と試した記事がでていますが、私の方でも試してみたのと、気付いた点や所感記載してみました。

概要

Cloud Run のマルチコンテナサポート がプレビューで利用が可能になり、公式ページでもサイドカーのユースケースとして紹介されていたのは以下のようなものが紹介されていました。
– アプリケーションの監視、ロギング、トレース
– アプリケーションコンテナの前でNginx、Envoy、またはApache2をプロキシとして使用する
– 認証および認可フィルターの追加 (Open Policy Agent など)
– Alloy DB Auth プロキシなどのアウトバウンド接続プロキシの実行

AWS上でFargateでコンテナを動かす場合などでも、上記のような理由でサイドカーを利用されます。
羅列された中でもGoogleだからあがったものとしては、DBへの接続はCloud SQLであれば、Cloud SQL Auth Proxyを利用した接続が推奨されているため、DBに対するアウトバウンド接続プロキシの実行としての役割があがっているのが、Googleならではだと思いました。
個人的にはAPMなどの利用が盛んになってきているので1点目の監視に関わる部分で利用できるのが地味に良いなと感じました。

サイドカーを表した図

exposeして公開するコンテナは1つでそのコンテナにて外部からのリクエストを受け付けます。
その公開コンテナから用途に応じて必要なポートでサイドカーコンテナと通信します。
コンテナ間の通信は同じネットワーク名前空間での通信になるため、localhostでの通信となり、サイドカーのコンテナを指定する場合、localhostで指定します。
またメモリ共有ボリュームを介したファイルの共有も可能となっています。

ちなみに図の内容はLaravelを動作させるCloud Runの一例を表したもので、Nginx にプラスしてPHPとCloud SQL Auth Proxyをサイドカーとしてサービス化したものになります。

やってみた

まさに図に記載した構成をやってみましたので、Cloud Runのマルチコンテナデプロイについて記載します。

前提

それぞれのコンテナを準備されているものとします。

Cloud Runへのデプロイ準備

Cloud Run の YAML を準備します。
サイドカーの記事内にサンプルYAMLがありましたので、それも参考に準備しました。
YAMLリファレンスはここです。
※コンソールからの新規作成はサポートされておりませんのでCLIで実行時に参照するYAMLファイルを作成しています。

apiVersion: serving.knative.dev/v1
kind: Service
metadata: 
  annotations: 
    run.googleapis.com/launch-stage: BETA
  name: h-saito-cloudrun-laravel # Cloud Run のサービス名
spec: 
  template: 
    metadata: 
      annotations: 
        run.googleapis.com/execution-environment: gen1 #or gen2 # Cloud Run の世代
        run.googleapis.com/container-dependencies: '{"nginx":["php"],"php":["cloudsqlproxy"]}' # 依存関係をコンテナ単位でつけた名前で制御できます
        run.googleapis.com/cloudsql-instances: XXXXXXX:asia-northeast1:XXXXXXX # Cloud SQLとの接続を行うため有効化し接続名を入力しています
    spec: 
      containers: 
      - image: asia-northeast1-docker.pkg.dev/XXXXX/XXXXXXX/nginx:latest
        name: nginx
        ports: 
        - containerPort: 8080
      - image: asia-northeast1-docker.pkg.dev/XXXXX/XXXXXXX/php:latest
        name: php
      - image: gcr.io/cloudsql-docker/gce-proxy:latest
        name: cloudsqlproxy

デプロイする

※事前にプロジェクトのセットは済ませている前提となります。
準備ができましたら、実行します。

gcloud run services replace multicloudrun.yaml --region asia-northeast1

成功すると目で見てわかるようにコンソール上でマルチコンテナが表示されています。
Ingressコンテナ以外はプレビューという表示がでています。

無事にアクセスできました。

気付いた点

  • 一度デプロイし、Cloud Run の更新自体はコンテナをlatest(今回はテストということもあり)で指定していればArtifact Registry内を更新し、コンソール上からのCloud Run の再デプロイすることでも、サイドカーコンテナも更新されました。新規作成はできません。
    ※再デプロイは以下を指しています。

  • サイドカーのArtifact Registry を更新をして、Cloud Run の CLIでのReplaceコマンドを実行をしても、Cloud Run のリビジョンが更新されないことがあり、上記した手動での更新をしていました(2023/05/19時点)。

所感

Cloud Runを初めて触ったときからマルチコンテナできないんだぁ、って思っていましたが、とうとうプレビューリリースされました。Cloud Runのジョブ利用、IAPの対応、ヘルスチェックの対応など、バシバシアップデートが続く中で、GAすると会心のアップデートになるように思います。今後ますます利用ケースの拡大が見込めると思うので、GA時に時間かからず採用できるよう、準備していきたいと思います。