ワークロードをデプロイする
デプロイスペック を cornus deploy で適用し、ワークロードに接続し、五つのデプロイバックエンドを使い分けるためのレシピです。ローカルバックエンドは CORNUS_DEPLOY_BACKEND 環境変数で選ばれます。CLI フラグはありません。
Compose プロジェクトを Docker ホストにローカルデプロイする (既定 dockerhost バックエンド)
既定の dockerhost バックエンドで、仕様をローカル Docker デーモンに適用します。
cornus deploy -f app.yamlname: web
image: localhost:5000/app:v1
replicas: 1
restart: unless-stopped
ports:
- { host: 8080, container: 80 }dockerhostには Docker ソケット (/var/run/docker.sock) が必要です。これは最も機能が豊富なバックエンドであり、最も多くの仕様フィールドに対応します。
関連ページ: cornus deploy, デプロイスペック, デプロイ backends
素の containerd ホストにデプロイする (CORNUS_DEPLOY_BACKEND=containerd)
dockerd を介さず、containerd ホスト上でワークロードをネイティブに実行します。
sudo CORNUS_DEPLOY_BACKEND=containerd cornus deploy -f app.yaml- Linux 専用です。root が必要です (netns を作成し CNI を実行します)。containerd ソケット (
CORNUS_CONTAINERD_ADDRESS、既定/run/containerd/containerd.sock) と、/opt/cni/bin下の標準 CNI プラグインも必要です。 - dockerhost と比べた既知の制約: attach は出力専用で、ヘルスチェックは無視されます。
関連ページ: デプロイ backends, cornus deploy
Incus ホストにデプロイする (CORNUS_DEPLOY_BACKEND=incus)
同じ OCI イメージを Incus のアプリケーションコンテナとして、incusd の監督下で実行します。
CORNUS_DEPLOY_BACKEND=incus cornus deploy -f app.yaml- Linux 専用です。Incus 6.3+ (それより前のリリースには OCI サポートがありません) と、デーモンソケット (
CORNUS_INCUS_SOCKET、既定/var/lib/incus/unix.socket) へのアクセス権が必要です。プロジェクトはCORNUS_INCUS_PROJECTで選びます。 skopeoとumociは incusd が動くホストにインストールされている必要があります。 OCI イメージを平坦化するのは cornus ではなくデーモンです。incusd が平文 HTTP のレジストリ (たとえば cornus 自身のもの) からプルする場合は、CORNUS_INCUS_INSECURE_REGISTRIESに列挙し、さらにデーモンホストの/etc/containers/registries.conf.d/でも insecure と指定してください。そうしないと skopeo が拒否します。- インスタンス名は
cornus-<app>-<replica>です。公開ポートは replica 0 上の Incusproxyデバイスになります。 - dockerhost と比べた既知の制約: マウント、ボリューム、user ネットワーク、ヘルスチェック、command/entrypoint の上書きに対応しません。
cornus attachは非対応です (cornus execを使ってください)。ログはインスタンスのコンソール由来のため--follow/--since/--tailは適用されません。cornus statsの CPU 使用率は低く出ます。map しないフィールドはいずれも名前を挙げて警告します。
関連ページ: デプロイ backends, サーバー環境変数
Kubernetes クラスターにデプロイする (サーバー / 接続プロファイル経由)
kubernetes バックエンドはサーバー / クラスター内のみなので、クラスター内で動く cornus サーバーに対してデプロイします。
cornus deploy -f app.yaml --server https://cornus.example.com- ローカルの
cornus deployにCORNUS_DEPLOY_BACKEND=kubernetesを付けても警告とともにdockerhostへフォールバックします。クラスターバックエンドはサーバー (cornus serve) 上で動きます。 - サーバーを接続プロファイルとして一度保存しておくと、以後のコマンドで
--serverが不要になります。
関連ページ: リモート clusters, デプロイ backends
生のデプロイスペックファイルを適用する (cornus deploy -f spec.yaml)
ネイティブ schema を直接デプロイします。Compose と devcontainers が変換される先と同じ shape です。
cornus deploy -f spec.yaml- 仕様は命令的に適用されます。1 つの仕様を受け取り、バックエンドがワークロードをその内容に収束させます。ポート、マウント、ボリューム、リソース、ヘルスチェックについては完全なフィールドリファレンスを参照してください。
関連ページ: デプロイスペック, cornus deploy
デプロイメントを削除する (cornus deploy --delete / cornus compose down)
名前を指定してデプロイメントを削除します。ローカルでもサーバーに対してでも使えます。
cornus deploy -f app.yaml --delete
cornus deploy -f app.yaml --server https://cornus.example.com --delete- Compose プロジェクトでは、代わりに
cornus compose downを使います (project-scoped 名前付きボリュームも削除するには--volumesを追加)。
関連ページ: cornus deploy, cornus compose
バックグラウンドでデプロイを実行する (-d/--detach)
仕様をサーバーへ一度 POST して終了し、クライアントセッションなしでワークロードを動かし続けます。
cornus deploy -f app.yaml --server https://cornus.example.com --detach
# later, tear it down:
cornus deploy -f app.yaml --server https://cornus.example.com --delete- detached デプロイはクライアントローカルバインドマウントと client-sourced 資格情報を拒否し、公開済みポートは自動転送ではなくサーバーホストにバインドされます。
--detachはローカルデプロイでは no-op です。
関連ページ: cornus deploy, リモートクラスターで作業する
レプリカ数とローリング更新を設定する (デプロイスペックの replicas と updateConfig)
desired インスタンス count と、Kubernetes ローリング更新の進み方を設定します。
name: web
image: localhost:5000/app:v1
replicas: 3
updateConfig:
parallelism: 1
order: start-firstcornus deploy -f app.yaml --server https://cornus.example.comreplicasはすべてのバックエンドで尊重されます。ホストバックエンドでは公開済みホストポートはレプリカ 0 にだけ向きます。updateConfigは Kubernetes デプロイメントのstrategy.rollingUpdateにだけ map されます。ホストバックエンドは単一インスタンスを recreate し、これを無視します。
関連ページ: デプロイスペック, デプロイ backends
実行中ワークロードの中でコマンドを実行する (cornus exec)
docker exec のように、サーバー経由でデプロイメントの first インスタンスに exec します。
cornus exec --server https://cornus.example.com -it web -- sh- デプロイメント name の後ろにあるものはすべてコマンドにそのまま渡されます。
-iは stdin を転送し、-tは PTY を要求します (stdin が terminal でない場合はプレーンストリームに downgrade)。 - リモートコマンドの exit code は cornus 自身の exit code として伝搬します。
関連ページ: cornus exec, cornus config
クライアントローカルディレクトリをリモートワークロードにマウントする (--local-mount、9P でストリーム)
cornus deploy --server はリモートサーバー上でデプロイメントを実行しつつ、このマシン上にあるディレクトリを --local-mount (または Compose の volumes:) で 9P ストリームしてバインドマウントします。デプロイメントはコマンドが接続している間だけ生きます。これが開発ループのツールになる理由です。ローカルでファイルを編集すると、ワークロードがそれを見ます。
cornus deploy -f app.yaml --server https://cornus.example.com \
--local-mount ./config:/etc/app:ro \
--local-mount ./data:/data--local-mount SRC:DST[:ro]は繰り返し指定可能で、セッションの存続中にパスを 9P で提供します。ワークロードはファイルをその場で読みます。事前コピーはありません。- クライアントローカルマウントはサーバー自身の
<DataDir>/mounts領域から提供され、常に許可されます。そのためホストの権限ポリシーを緩めなくても動作します。 - フォアグラウンドセッションが必要です。
--detachはクライアントローカルマウントを拒否します。
9P を素朴にトンネルすると、すべての読み取りがネットワークを越えるため、大きいマウントや書き込みの多いマウントでは問題になります。2 つの接尾辞でサーバー側のファイルキャッシュを有効にできます。
cornus deploy -f app.yaml --server https://cornus.example.com \
--local-mount ./models:/models:ro,cache \
--local-mount ./db:/var/lib/app:async,cacheを追加すると、不変の読み取り専用ソースとして宣言します。データセットやモデルの重み向けの read-through キャッシュです。サーバーのファイル単位キャッシュを使用し、:roを暗黙に指定します。,asyncを追加すると、ブロックプロトコルによる書き込み可能でキャッシュ整合性を保つマウントになります。開発用データベースのような書き込み集約的な単一書き込みワークロード向けで、replicas: 1が必要です。roまたはcacheとは併用できません。- どちらもサーバーのファイルキャッシュを有効にする必要があります。データベース型の async マウントでは、サーバーと deploy の呼び出し元の両方で
CORNUS_BLOCK_COHERENCE=subhash,subfillを設定し、CORNUS_BLOCK_READAHEAD=64k以上の上限を追加することが出発点です。サーバー環境変数と、キャッシュの仕組みについてはクライアントローカルバインドマウントを参照してください。
関連ページ: cornus deploy, ネットワークと conduit
公開済み / 未公開ポートに到達する (自動クライアント側転送と cornus port-forward)
--server セッション中は、公開済みポート (仕様の ports:) が 127.0.0.1:<host> へ自動転送されます。他の任意のコンテナポートには、必要に応じて cornus port-forward で到達します。
# Published ports auto-forward for the session's lifetime:
cornus deploy -f app.yaml --server https://cornus.example.com
# (prints forwarding 127.0.0.1:8080 -> :80)
# Reach an unpublished container port separately:
cornus port-forward web 5432:5432- デプロイの
--no-forward-portsで自動転送を無効化できます。cornus port-forwardはLOCAL:REMOTE(または裸のPORT) mapping ごとにローカルリスナーを 1 つバインドし、Ctrl-C までフォアグラウンドで動きます。 - クラスタープロファイルでは、どちらのパスも kubeconfig を使ってワークロード pod へ直接向かい、必要ならサーバー経由のトンネルにフォールバックします。
/udpmapping は dockerhost、containerd、bare バックエンドでは動作しますが、Kubernetes ではスキップされます。
関連ページ: cornus port-forward, networking, リモートクラスターで作業する