agent-backend:Agent ランタイムサービス。Helm Chart によりデプロイされます。sandbox-gateway:サンドボックスの割り当てと回収を担うコントロールプレーン。Helm Chart によりデプロイされます。agent-sandboxcontroller:Kubernetes コミュニティ公式プロジェクト kubernetes-sigs/agent-sandbox。サンドボックスの CRD とコントローラーを提供し、事前にクラスターへのインストールが必要です。
agent-sandbox controller のインストール
インストールにはクラスター管理者権限が必要で、クラスターごとに一度実行します。sandboxes.agents.x-k8s.iosandboxclaims.extensions.agents.x-k8s.iosandboxtemplates.extensions.agents.x-k8s.iosandboxwarmpools.extensions.agents.x-k8s.io
Helm Chart の設定
agentBackend.enabled と sandboxGateway.enabled はいずれもデフォルトで true です。つまり、上記の controller のインストールが完了していれば、標準デプロイでサンドボックス機能が既定で有効になります。設定可能な項目の全体は helm show values dify/dify で確認できます。以下は Agent Sandbox 関連設定の例です。
-
agentBackend.enabled- agent-backend をデプロイするかどうか。無効にするとコンソールに Agent アプリが表示されません。
-
agentBackend.serverSecretKey- Agent ツールコールバックトークンの暗号化キー。base64url エンコードされた 32 バイトのランダム値です。本番環境ではデフォルト値を必ず置き換えてください。以下のコマンドで生成できます。
-
sandboxGateway.enabled- 専用 Pod サンドボックスモードを有効にするかどうか。無効にすると追加設定なしで 共有サンドボックスモード に自動的にフォールバックします。
-
agentRuntime.image- サンドボックスのランタイムイメージ。専用 Pod モードと共有サンドボックスモードで共通です。サンドボックスには Python 3.12、Node.js 22、pnpm、uv、git などの一般的なツールが同梱されています。カスタマイズは後述の サンドボックスイメージのカスタマイズ を参照してください。
-
sandboxGateway.provision.warmPoolReplicas- ウォームプールのレプリカ数、つまり待機させておくアイドルサンドボックスの数。Agent の同時実行数に応じて調整してください。
-
sandboxGateway.provision.requestsCpu/requestsMemory/limitsCpu/limitsMemory- サンドボックス Pod 1 つあたりのリソース設定。キャパシティプランニングでは、N 個の Agent セッションを同時実行するには約 N +
warmPoolReplicas個分のサンドボックス Pod のリソース余裕が必要です。
- サンドボックス Pod 1 つあたりのリソース設定。キャパシティプランニングでは、N 個の Agent セッションを同時実行するには約 N +
sandboxGateway.namespace:サンドボックス Pod の名前空間。デフォルトはリリースの名前空間です。sandboxGateway.provision.sandboxTtl:サンドボックス 1 つの最大生存期間。デフォルト1800s。sandboxGateway.inactiveTtl:サンドボックスのアイドル回収時間。デフォルト360s。sandboxGateway.execTimeout:コマンド 1 回あたりの実行タイムアウト。デフォルト300s。sandboxGateway.provision.extraEnv:サンドボックス Pod に注入する追加の環境変数。例:外向きプロキシ設定。sandboxGateway.provision.volumeClaimTemplates:サンドボックス Pod にマウントする永続ボリューム。各エントリが PVC を作成します。sandboxGateway.provision.securityContext/podSecurityContext:サンドボックス Pod のセキュリティコンテキスト。クラスターが Pod Security Standards を強制する場合に設定してください。- グローバルの
imagePullSecretsはサンドボックス Pod に自動的に伝播されるため、プライベートレジストリ利用時の追加設定は不要です。
サンドボックスのネットワークポリシー
サンドボックス Pod の外向き通信は、デフォルトで 2 層の制御を受けます。 SSRF プロキシ:Chart はサンドボックス専用の squid プロキシ(agent-sandbox-ssrf-proxy)をデプロイします。サンドボックス Pod には HTTP_PROXY / HTTPS_PROXY が注入され、すべての HTTP(S) 送信トラフィックがこのプロキシ経由になります。プロキシはデフォルトで内部ネットワーク(RFC1918 などのプライベートアドレス帯)宛のリクエストを遮断し、SSRF 対策を提供します。プロキシ自体は sandboxGateway.ssrfProxy(replicas / image / resources / squidConf)で設定します。
NetworkPolicy:sandboxGateway.provision.networkPolicy はデフォルトで enabled: true です。許可される送信先は DNS(kube-system の kube-dns/coredns)、agent-backend(5050 ポート)、SSRF プロキシ(3128 ポート)、外部インターネット(allowExternalEgress: true、内部アドレス帯を除く)のみです。サンドボックスから dify-api へ直接アクセスすることはできません。
サンドボックスからクラスター内の他サービスや内部アドレスへアクセスする必要がある場合は、次の 2 層を両方開放します。
networkPolicy.extraEgressRulesに対象アドレスの許可ルールを追加する。sandboxGateway.ssrfProxy.squidConfを上書きし、デフォルトのdeny private_dstルールより前に対象への allow ルールを挿入する。
networkPolicy.enabled: falseの場合、agent-sandbox controller のセキュアデフォルトが適用されます。パブリックインターネットのみ許可され、内部(RFC1918)アドレスはすべて遮断されます。networkPolicy.management: "Unmanaged"を指定すると NetworkPolicy の配布を完全にスキップし、クラスター側の管理に委ねます。
デプロイと検証
values を更新してアップグレードを実行します。SandboxTemplate と SandboxWarmPool リソースを自動作成するため(sandboxGateway.provision.managedByHelm デフォルト true)、手動作成は不要です。デプロイ状態を検証します。
RBAC 権限の説明
本機能の有効化により導入されるクラスター権限の変更は以下のとおりです。セキュリティ評価の参考にしてください。agent-sandboxcontroller はクラスタースコープのコンポーネントで、CRD に基づいてサンドボックス Pod の作成と削除を行います。- sandbox-gateway は名前空間スコープの Role を使用します(Chart が自動作成、
sandboxGateway.rbac.createで制御)。内容は以下のみです。sandboxclaimsの読み書き(サンドボックスのライフサイクル管理)sandboxtemplates/sandboxwarmpoolsの読み取り専用(リソース自体は Helm が作成)sandboxesの読み取り専用(ステータス照会)
- sandbox-gateway は Pod、Secret、ConfigMap などのネイティブリソースへの権限を持ちません。クラスタースコープの権限もありません。
sandboxGateway.rbac.create: false を設定し、sandboxGateway.serviceAccountName で指定してください。
agent-sandbox を導入しない代替案(共有サンドボックスモード)
サードパーティの CRD やコントローラーのインストールが許可されないクラスターでは、sandboxGateway.enabled を false に設定するだけで構いません。Chart が常駐の agent-runtime サービスを自動的にデプロイします。すべての Agent セッションは、専用 Pod ではなく単一のサンドボックスコンテナを共有します。
- このモードでは CRD のインストールも追加の RBAC 権限も不要です。
- すべてのセッションが 1 つのコンテナを共有するため、隔離性は専用 Pod モードより低く、シングルレプリカでのみ動作します。制約のある環境向けの代替案としてのみ推奨します。
- リソースは
agentRuntime.resourcesで調整します。
サンドボックスイメージのカスタマイズ
サンドボックス内に追加のツール、SDK、内部 CA 証明書などを組み込む場合は、公式イメージをベースにカスタマイズします。- イメージデフォルトの
CMD/ENTRYPOINTを上書きしないでください。サンドボックスサービスはポート 5004 で待ち受ける必要があります。 /usr/local/bin配下のshellctl*とdify-agentバイナリを削除しないでください。- システムパッケージのインストール時は
USER rootに切り替え、完了後は必ずUSER difyに戻してください。 /home/difyと/mnt/driveディレクトリおよびその所有者を維持してください。
agentRuntime.image を更新して helm upgrade を実行します。専用 Pod モードではウォームプールが新イメージへ自動的にローリング更新されます。共有サンドボックスモードでは agent-runtime がローリング再起動します。
FAQ
- コンソールに Agent アプリの入口がない
agentBackend.enabledがtrueであること、Dify のバージョンが 3.12.0 以上であることを確認してください。
- sandbox-gateway が CRD 不存在エラーで起動しない
- agent-sandbox controller がインストールされていません。上記のインストール手順を完了するか、インストールできない場合は共有サンドボックスモードに切り替えてください。
- サンドボックス Pod が Pending または ImagePullBackOff のまま
- ノードのリソース余裕を確認してください。プライベートレジストリ利用時はグローバルの
imagePullSecretsが設定済みであることを確認してください。
- ノードのリソース余裕を確認してください。プライベートレジストリ利用時はグローバルの
- サンドボックスからクラスター内サービスや内部アドレスにアクセスできない
- 送信トラフィックはデフォルトで SSRF プロキシを経由し、許可されるのは DNS、agent-backend、外部インターネットのみです。
networkPolicy.extraEgressRulesへの許可追加とsandboxGateway.ssrfProxy.squidConfの上書きの両方が必要です。サンドボックスのネットワークポリシー を参照してください。
- 送信トラフィックはデフォルトで SSRF プロキシを経由し、許可されるのは DNS、agent-backend、外部インターネットのみです。
- Agent のコマンド実行がタイムアウトする
- コマンド 1 回のデフォルト制限は 300 秒です。
sandboxGateway.execTimeoutで調整できます。
- コマンド 1 回のデフォルト制限は 300 秒です。
- セッション実行中にサンドボックスが回収される
- アイドル時間が
inactiveTtl(デフォルト 360 秒)を超えたか、生存時間がsandboxTtl(デフォルト 1800 秒)を超えています。業務に応じて延長してください。
- アイドル時間が