ローカル Compose プロジェクトをそのまま Kubernetes へ配信する
シナリオ
チームが毎日ローカルで実行している compose.yaml があり、共有ステージング環境や統合実行のために同じファイルを実際の Kubernetes クラスターで使いたいとします。デプロイメント、サービス、PVC に書き換える必要はありません。Cornus では Compose ファイルがどのバックエンドでも実行中の制御対象となるため、移行はソースの変更ではなく接続プロファイルの変更です。
使用するもの
- サーバーに対してビルドとデプロイを行う Compose 互換クライアント。Compose、Dev Container、Docker CLIと
cornus composeを参照。 - ローカルサーバーからクラスター内サーバーへ切り替える接続プロファイル。リモートクラスターで作業するを参照。
- Compose の概念をネイティブ仕様へ変換するデプロイエンジン。デプロイスペックとデプロイバックエンドを参照。
手順
すでに実行している Compose ファイルから始めます。 user ネットワーク上で API を通じて database と通信する web front end を含む、通常の multi-service プロジェクトです。
yaml# compose.yaml name: shop services: web: build: ./web ports: - "8080:80" depends_on: - api networks: - frontend api: build: ./api environment: DATABASE_URL: postgres://db:5432/shop networks: - frontend - backend db: image: postgres:16 volumes: - db-data:/var/lib/postgresql/data networks: - backend networks: frontend: backend: volumes: db-data:現在とまったく同じようにローカルで実行します。 ローカル Cornus サーバー (既定の
dockerhostバックエンド) に対して、cornus compose upはbuild:サービスをビルドし、stack をデプロイし、公開ポートを127.0.0.1:8080で保持します。shcornus compose up --build # -> 127.0.0.1:8080 -> :80 に転送。curl http://127.0.0.1:8080 が応答プロファイルの対象をクラスターにします。 クラスター内サーバーを一度保存します。イングレスのないクラスターでは、そのサービスを指定して CLI がコマンドごとにポート転送を開くようにします。
shcornus config set-context staging \ --pf-namespace cornus --pf-service cornus --pf-remote-port 5000 cornus config use-context staging同一コマンドをクラスターに対して実行します。 ファイルもコマンドも同じです。違いは選択したプロファイルだけで、
CORNUS_DEPLOY_BACKEND=kubernetesを持つクラスター内サーバーに解決されます。shcornus compose up --buildbuild:サービスはクラスター内でビルドされ同梱レジストリへプッシュされます。各サービスはshop-web/shop-api/shop-dbというデプロイメントと、公開ポート用のサービスになります。frontend/backendユーザーネットワークもクラスター上に実現されます。セッションの存続期間中は8080がマシンの127.0.0.1:8080へ自動転送されるため、ワークロードがクラスター内で実行されていてもcurl http://127.0.0.1:8080が応答します。同じ方法で確認し、削除します。
shcornus compose ps cornus compose logs --follow web cornus compose down --volumes # --volumes は db-data PVC も削除する
仕組み
Compose ファイルは内部でネイティブ デプロイスペック へ変換され、サーバーが実行するバックエンドに同じ仕様が適用されます。そのためすべての核となる概念は変更なしで引き継がれます。
- サービス は
<project>-<service>という名前のデプロイメント一つずつになります。 ports:は公開ポートになります。セッション中は Kubernetes を含むすべてのバックエンドで127.0.0.1:<host>へ自動転送されるため、ワークロードは localhost で応答します。ポートごとのリスナー (既定) を選ぶか、--conduitでサービス名に到達する単一 SOCKS5 プロキシを選べます。networks:はユーザー定義ネットワークになります。同じネットワークのメンバーはサービス名 (およびエイリアス) で相互に解決します。Kubernetes では既定ドライバーはservices(DNS のみ、どのクラスターでも利用可) です。bridge/ipvlan/macvlan(Multus) またはciliumはCORNUS_K8S_NET_DRIVERで明示的に有効化します。volumes:は管理対象ボリュームになります。名前付きボリュームは一つのデプロイメントを削除しても存続するプロジェクトスコープのストアです (Kubernetes では PVC、dockerhostでは Docker 名前付きボリューム)。匿名ボリュームは一時的です。depends_on、healthcheck、deploy.replicas、deploy.update_configも変換されます。
バックエンドはサーバー側で選択されるため、CLI 側ワークフローは dockerhost、containerd、bare、kubernetes のいずれでも同一です。デプロイ backendsを参照してください。
Kubernetes で異なる点
いくつかの Compose 設定には Kubernetes の同等物がなく、フィールドごとに扱われます (デプロイスペックリファレンスが各項目を示します)。
- ポートの
hostIP(Compose の127.0.0.1:8080:80) はホストバックエンドでは尊重されますが、Kubernetes サービスには同等物がありません。 - UDP 公開ポートは
dockerhost/containerd/bareでは動作しますが、Kubernetes ポート転送は TCP 専用なので/udpmapping はそこでスキップされます。 - ヘルスチェックは
dockerhostでは Docker ヘルスチェック、Kubernetes では exec liveness / readiness probe になります。 deploy.update_configは Kubernetes デプロイメントのstrategy.rollingUpdateにだけ対応します。ホストバックエンドは一つのインスタンスを再作成します。- Compose
labels:は Kubernetes では label ではなく pod-template annotation になります。多くの host-only knob (init、stop_signal、ulimits、devicesなど) は警告とともに Kubernetes で無視されます。
バリエーション
- Detached staging。
cornus compose up --build -dはマウントと転送ポートをバックグラウンド helper に渡して戻ります。cornus compose downであとから停止します。 - サービス名で到達する。
cornus compose up --conduit socks5はポートごとのリスナーを一つのプロキシに置き換えるため、web.cornus.internalとdb.cornus.internalがそれを通じて解決されます。 - layered 上書き。 base
compose.yamlを保ち、クラスター専用調整は-f compose.staging.yamlとして追加します。コマンドは同じです。
関連項目: Compose、devcontainers、docker CLI · ワークロードをデプロイする · リモートクラスターで作業する · デプロイスペック · デプロイ backends