Cornus とは
Cornus は、docker compose、docker CLI、Dev Container という Docker の開発ワークフローを、単一の Go バイナリから Kubernetes クラスター (または通常の Docker ホスト) に持ち込むためのソフトウェアです。通常は社内プラットフォームで別々に運用する三つのツールを、自己完結した一つのサービスにまとめます。小規模なチームでも、レジストリ、BuildKit デーモン、GitOps コントローラーを個別に用意することなく、Compose プロジェクトをビルド、プッシュし、実際のクラスターへデプロイできます。
1.0 未満
Cornus は活発に開発中であり、CLI または API の安定性はまだ保証していません。リリースアーティファクトをバージョンに固定し、アップグレード前にリリースノートを確認してください。
このプロジェクトは単一モジュール (module cornus、Go 1.26、Apache-2.0) です。
三つのサブシステム
Cornus は、動作に必要なレジストリ、ビルドエンジン、デプロイエンジンを一つのバイナリに収めています。
- レジストリ — 永続的な sha256 コンテンツアドレス指定ストアを基盤とする、小規模な OCI Distribution v1.1 レジストリ (
/v2/*) です。永続化方式は差し替え可能で、--storageによりファイルシステム (既定)、メモリ内、S3 / S3 互換オブジェクトストレージを選べます (gs:///azblob://は-tags cloudblobビルドで利用できます)。ボリューム / PVC またはオブジェクトバケットを使用するため、再起動後もデータが残ります。ストレージバックエンドを参照してください。 - ビルドエンジン — 別個の
buildkitdを必要としない、docker buildxと同じプロセス内 BuildKit ソルバーです。Dockerfile ビルド、キャッシュマウント (RUN --mount=type=cache)、シークレットマウント (RUN --mount=type=secret)、SSH エージェント転送 (RUN --mount=type=ssh)、名前付きビルドコンテキスト / バインドマウント、リモートキャッシュをそのまま利用できます。ビルドはローカルまたはリモートの Cornus サーバーで実行でき、呼び出し元のディレクトリ、シークレット、SSH エージェントは 9P-over-WebSocket でストリーミングされます。必要に応じて遅延転送もできるため、ビルドが実際に読むバイトだけがネットワークを通過します。cornus buildCLI と/.cornus/v1/buildHTTP エンドポイントから利用できます。 - デプロイエンジン — 命令的で差し替え可能なデプロイバックエンドです。
dockerhost(既定) は Docker ホスト上でコンテナを実行し、podmanは Podman をそのネイティブ libpod API 経由で駆動し、containerdは素の containerd ホスト上でネイティブに実行します (CNI ブリッジネットワークを使用し、dockerd は不要です)。bareはデーモンなしで OCI ランタイムを直接駆動します。incusは Incus 6.3+ のデーモン上で Incus のアプリケーションコンテナとして実行します。kubernetes(client-go) はデプロイメントとサービスをクラスターへデプロイします。v1 に git の監視や継続的リコンシリエーションはありません。中核機能に加え、リモートワークロードへ 9P で送るクライアントローカルバインドマウント、公開ポートのクライアント側自動転送、ホスト型トンネルを介したワークロードの公開、リモートワークロードの通信を呼び出し元ネットワーク経由にするクライアント側エグレスも提供します。デプロイバックエンドを参照してください。
サブシステムは共有する Go ストレージではなく OCI HTTP を介して連携します。ビルドエンジンはイメージ参照をレジストリへプッシュし、対象ランタイムがそれをプルします。レジストリのコンテンツストアは pkg/storage の背後にあるプライベートな永続化層なので、Cornus は外部 OCI レジストリも使用できます。
ビルド → プッシュ → デプロイの流れ
ワークロードがクラスターに到達するまでには、サブシステムに直接対応する三つの段階があります。
- ビルドエンジンでイメージをビルドします。
- Cornus 自身のもの、または外部のレジストリへイメージをプッシュします。
- デプロイバックエンドに仕様を適用してデプロイします。バックエンドがイメージをプルして実行します。
cornus compose upはこれらの基本操作をまとめた糖衣構文です。明示的に制御したい場合は、cornus build、cornus push、cornus deployを直接実行することもできます。詳しい手順はクイックスタートを参照してください。
デプロイメントモデル
Cornus はコンテナイメージ (およびビルド済みのオールインワン CLI バイナリ) として配布され、ローカル Docker コンテナとしても、Kubernetes の第一級サービスとしても動作します (StatefulSet + PVC + Service + RBAC。Helm チャートも提供されます)。ビルド済みマルチアーキテクチャイメージは、semver タグで ghcr.io/moriyoshi/cornus に公開されます。イメージにはサードパーティーライセンスの帰属表示が含まれます。リリースには Linux および macOS (amd64/arm64) と Windows (amd64) 向けの CLI バイナリも添付されます。Linux の生成物は完全に静的で、SHA256SUMS マニフェストが付属します。Helm チャートは OCI アーティファクトとして公開され、すべての生成物がキーレス cosign で署名されます。
レジストリとデプロイのサブシステムに特別な権限は不要ですが、ビルドエンジンには root、またはルートレスユーザー名前空間のスタックが必要です。バイナリの入手方法はインストール、権限の考え方はアーキテクチャ概要を参照してください。
インターフェイス
- HTTP:
/v2/*(レジストリ)、/.cornus/v1/build+/.cornus/v1/build/attach、/.cornus/v1/deploy[/{name}[/{action}]]+/.cornus/v1/deploy/attach、/.cornus/v1/caretaker/attach(Pod サイドカーとの接続確立)、/.cornus/v1/hub/catalog、/.cornus/v1/gc、/healthz、/readyz、および任意で有効化する Prometheus/metrics。 - CLI (kong):
serve、setup、config、build、push、deploy、exec、port-forward、tunnel、socks5、compose、daemon、hub、token、health、version。cornus configは kubeconfig 風の接続プロファイルを管理します。クラスター内サーバーへの自動ポート転送と、呼び出し元の kube アクセスに基づく短命な資格情報の発行ができるため、手動のトンネルやトークンなしで全コマンドをリモートクラスターに対して実行できます。リモートクラスターで作業するを参照してください。 cornus compose: Docker Compose 互換のコマンドグループ (up/down/ps/build/restart/stop/start) です。Compose コマンドを実行中の Cornus サーバーへ振り向けます。ライフサイクルコマンドとワークスペースマウントを含む Dev Container 定義 (.devcontainer/devcontainer.json) も、単一コンテナ形式と Compose 形式の両方をネイティブに読み取ります。cornus daemon: ユーザーごとの単一エージェントがホストする長時間動作のクライアント側ヘルパーです。daemon dockerはローカル Docker エンジン API プロキシを公開します (DOCKER_HOSTを指すと Docker 互換クライアントがリモート Cornus サーバーを操作します)。同じエージェントが、デタッチされた Compose のマウント、ポート転送、SOCKS5 alias、エグレス、および資格情報セッションを保持します。