このトピックでは、コンポーネントのインストール、ウォームプールの作成、SDK の統合、本番環境向けのドメイン名と証明書の設定など、ACS クラスターに Agent Sandbox を作成する方法について説明します。
事前準備
-
ACK クラスターの作成を行い、エージェントサンドボックスを有効化します。
-
既存のクラスターがある場合は、サービスを有効化した後に、次のコンポーネントをアップグレードする必要があります。
-
acs-virtual-nodeコンポーネントを v2.17.0 以降にアップグレードします。 -
Kube Schedulerコンポーネントのバージョンをアップグレードします。クラスターバージョン
Kube Schedulerコンポーネントのバージョンv1.28
v1.28.12-aliyun-1.4.6 以降
v1.30
v1.30.3-aliyun-1.6.2 以降
v1.31
v1.31.0-aliyun-1.5.2 以降
v1.32
v1.32.0-apsara.6.11.11.3187ac8f 以降
-
コンポーネントのインストール
コンポーネントがインストールされている場合は、ack-agent-sandbox-controller コンポーネントを v0.5.14-release.1 以降に、ack-sandbox-manager コンポーネントを v0.6.0 以降にアップグレードしてください。
-
ACS コンソールにログオンします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
-
クラスターリスト ページで、目的のクラスターの名前をクリックします。左側のナビゲーションウィンドウで、Add-ons を選択します。
-
Ingress コントローラーとサンドボックス関連のコンポーネントをインストールします。
-
Ingress コントローラーをインストールします。
ACK でサポートされている Ingress コントローラーコンポーネントをインストールして、クラスターの外部から
sandbox-managerサービスにアクセスします。次の手順では、ALB Ingress Controller のインストールを例に、新しいパブリック ALB インスタンスを作成します。 -
ack-agent-sandbox-controller コンポーネントをインストールします。
このコンポーネントを初めてインストールする場合は、クラウドリソースにアクセスするための AliyunCSManagedAgentSandboxRole ロールの権限を付与する必要があります。デフォルトのパラメーター設定を使用できます。より高い同時実行数が必要な場合は、リソース仕様を増やすことができます。
このコンポーネントの機能の詳細については、「ack-agent-sandbox-controller」をご参照ください。
-
ack-sandbox-manager コンポーネントをインストールします。
-
E2B ドメイン名を準備します。
ドメイン名の準備、DNS 名前解決の設定、証明書の申請の詳細については、「本番環境での使用」をご参照ください。
-
コンポーネントのパラメーターを設定します。
classNameをalb(Ingress コントローラーコンポーネントをインストールするときに自動的に作成される IngressClass) に変更し、domainを実際のドメイン名に変更し、adminApiKeyをカスタム API キーに変更します。他の設定はデフォルト値のままにします。コンポーネントがインストールされると、sandbox-system名前空間にsandbox-managerという名前の Ingress が作成されます。 -
ALB Ingress コントローラーを使用する場合は、ALB インスタンスと Ingress の両方に HTTPS:443 リスナーを追加する必要もあります。
-
-
エージェントサンドボックスの作成
ステップ 1:ウォームプールの作成
ウォームプールは、SandboxSet カスタムリソースによって管理される、事前に作成されたサンドボックスレプリカのセットです。アプリケーションは、ウォームプールからすぐに使用できるサンドボックスを直接取得できるため、配信効率が大幅に向上します。
-
左側のナビゲーションウィンドウで、Custom Resources を選択します。CRDs タブで、Create from YAML をクリックします。
-
次の YAML を使用して SandboxSet リソースを作成します。
ack-sandbox-managerはこのリソースを自動的に検出し、code-interpreter という名前のサンドボックステンプレート設定を初期化します。動的ストレージマウントを有効にするには、特権コンテナと hostPath (
/var/run/csi) へのアクセスを許可する必要があります。チケットを送信することで、セキュリティ制限の解除を申請できます。ただし、関連するセキュリティリスクについてはお客様の責任となります。このメカニズムの詳細については、「責任共有モデル」をご参照ください。apiVersion: agents.kruise.io/v1alpha1 kind: SandboxSet metadata: name: code-interpreter namespace: default spec: runtimes: - name: csi # CSI マウントをサポートします。対応するサイドカーが新しいサンドボックスに挿入されます。 - name: agent-runtime # envd などの環境管理ツールを挿入します。 replicas: 4 template: metadata: labels: alibabacloud.com/acs: "true" alibabacloud.com/compute-class: agent-sandbox # エージェントサンドボックスのインスタンスタイプ。 alibabacloud.com/compute-qos: default # コンピュート QoS:default または best-effort。 spec: automountServiceAccountToken: false containers: - image: registry-cn-zhangjiakou-vpc.ack.aliyuncs.com/acs/code-interpreter:v1.6 # リージョンをクラスターがデプロイされているリージョンに置き換えてください。 imagePullPolicy: IfNotPresent name: sandbox resources: limits: cpu: "1" memory: 1Gi requests: cpu: "1" memory: 1Gi ephemeral-storage: 30Gi terminationGracePeriodSeconds: 30 -
左側のナビゲーションバーで Pods をクリックし、対応する名前空間を選択して、作成された
code-interpreterサンドボックスを表示します。kubectl get sbsコマンドを実行して SandboxSet リソースを表示できます。ここで、AVAILABLEは準備完了のサンドボックスの数を示します。
サンドボックスが割り当てられると、SandboxSet は自動的に補充プロセスをトリガーして、ウォームプール内のインスタンス数を維持します。
ステップ 2:エージェントサンドボックスの取得
E2B SDK
-
ローカル環境に Python をインストールします。
-
E2B Python SDK をインストールします (v2.25.0 より前のバージョンのみがサポートされています)。
pip install "e2b-code-interpreter==2.7.0" "e2b==2.24.0" -
環境変数を設定します。
# ack-sandbox-manager コンポーネントのインストール時に設定したデフォルトのドメイン名を使用します。アスタリスク (*) は含めないでください。実際の設定に基づいてこれを変更してください。 export E2B_DOMAIN=your.domain.com # ack-sandbox-manager コンポーネントのインストール時に設定したデフォルトの API キーを使用します。実際の設定に基づいてこれを変更してください。 export E2B_API_KEY=admin-987654321 -
次のコードを
main.pyファイルとして保存します。# E2B SDK をインポート from e2b_code_interpreter import Sandbox sbx: Sandbox = Sandbox.create(template="code-interpreter") print(f"sandbox id: {sbx.sandbox_id}") result = sbx.run_code("print('hello, world')") print(f"run code result: {result}") text = input("enter some text to be saved to file 'text.txt' inside sandbox: ") sbx.files.write("text.txt", text) print(f"read file from sandbox via files api: [{sbx.files.read('text.txt')}]") print(f"read file from sandbox via commands api: [{sbx.commands.run('cat text.txt')}]") input("press ENTER to kill the sandbox") print(sbx.kill()) -
main.pyファイルを実行して、サンドボックスを作成および検証します。最初のプロンプトが表示された後、
acs agent sandboxなどのテキストを入力して ENTER キーを押します。この操作により、code-interpreter-29***という名前の Pod の/home/user/text.txtファイルにacs agent sandboxが書き込まれます。もう一度 ENTER キーを押すと、現在のサンドボックスは削除されます。python main.py想定される出力:
sandbox id: default--code-interpreter-29*** run code result: Execution(Results: [], Logs: Logs(stdout: ['hello, world\n'], stderr: []), Error: None) enter some text to be saved to file 'text.txt' inside sandbox: acs agent sandbox read file from sandbox via files api: [acs agent sandbox] read file from sandbox via commands api: [CommandResult(stderr='', stdout='acs agent sandbox', exit_code=0, error='')] press ENTER to kill the sandbox True
SandboxClaim
サンドボックスがウォームプールから割り当てられると、自動補充プロセスがすぐに開始され、プールが迅速にバックフィルされます。
-
左側のナビゲーションウィンドウで、Custom Resources を選択します。CRDs タブで、Create from YAML をクリックします。
-
次の YAML を使用して SandboxClaim リソースを作成し、サンドボックスを取得します。
apiVersion: agents.kruise.io/v1alpha1 kind: SandboxClaim metadata: name: code-interpreter # SandboxSet の名前。 namespace: default # SandboxSet の名前空間。 spec: templateName: code-interpreter # SandboxSet の名前。 replicas: 1 # SandboxSet から取得したいサンドボックスの数。 claimTimeout: 5m # SandboxClaim のタイムアウト期間。 ttlAfterCompleted: 15m # SandboxClaim が完了した後の Time-to-Live (TTL) 期間。TTL 期間が経過すると、SandboxClaim リソースは削除されます。取得したサンドボックスは削除されません。 -
左側のナビゲーションバーで Pods をクリックし、
default名前空間を選択して、code-interpreter-xxxxxという名前の新しいサンドボックスを表示します。kubectl get sbx -l agents.kruise.io/claim-name=code-interpreterコマンドでサンドボックスのステータスを取得できます。
Kubernetes SDK を使用してサンドボックスリソースを管理することもできます。
エージェントサンドボックスのコンテナイメージの置き換え
E2B SDK
次の Python コードをご参照ください。<YOUR_IMAGE> を実際のイメージアドレスに置き換えます。ウォームプールからサンドボックスを取得した後、metadata パラメーターを使用して、コンテナイメージを指定されたイメージに置き換えます。
from e2b_code_interpreter import Sandbox
# デフォルトのタイムアウト期間は 300 秒です。
sbx = Sandbox.create(template="some-template", timeout=300, metadata={
# インプレース更新を実行して、サンドボックスコンテナのイメージを指定されたイメージに置き換えます。
"e2b.agents.kruise.io/image": "<YOUR_IMAGE>"
})
SandboxClaim
<YOUR_IMAGE> を実際のイメージアドレスに置き換えます。
apiVersion: agents.kruise.io/v1alpha1
kind: SandboxClaim
metadata:
name: my-sandbox-claim
namespace: default
spec:
templateName: code-interpreter # SandboxSet ウォームプールの名前。
replicas: 1
claimTimeout: 5m
ttlAfterCompleted: 15m
inplaceUpdate:
# 更新のターゲットイメージ。
image: <YOUR_IMAGE> # cn-zhangjiakou を実際のリージョン ID に置き換えてください。
エージェントサンドボックスのリソース仕様
ウォームプールからサンドボックスを割り当てるとき、インプレース垂直スケーリング (VPA) がサポートされます。これにより、Pod を再作成することなく、低スペックのサンドボックスインスタンスをスケールアップしてビジネス要件を満たすことができます。このアプローチは、ウォームプールの迅速なプロビジョニングと、多様なリソース需要を満たす柔軟性を兼ね備えています。
-
現在、調整できるのは CPU のみです。メモリやその他のリソース設定は無視され、メインコンテナのみが調整されます。詳細な制限と使用方法については、「CPU メトリックに基づくコンテナのインプレース垂直スケーリング」をご参照ください。
-
バージョンが 1.32 より前のクラスターでインプレーススケーリングを有効にするには、Add-ons で [Kube API Server] の
InPlacePodVerticalScaling=trueフィーチャーゲートを設定する必要があります。
ステップ 1:インプレーススケーリングの有効化
SandboxSet の spec.template.metadata.annotations に scaling.alibabacloud.com/enable-inplace-resource-resize: "true" を追加して、ウォームプール内のサンドボックスが割り当てられるときにインプレース VPA を実行できるようにします。
次の例では、より小さいリソース仕様でウォームプールを作成します。割り当て中にリソースを目的の仕様に動的にスケールアップできます。
apiVersion: agents.kruise.io/v1alpha1
kind: SandboxSet
metadata:
name: code-interpreter
spec:
template:
metadata:
annotations:
# ウォームプールからサンドボックスが割り当てられるときにインプレース VPA を許可します。
scaling.alibabacloud.com/enable-inplace-resource-resize: "true"
spec:
containers:
- name: interpreter
image: xxx
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 500m
memory: 1Gi
replicas: 5 # ウォームインスタンスの数。
ステップ 2:ターゲットリソース仕様の宣言
ウォームプールからエージェントサンドボックスを割り当てる際に、次のいずれかの方法を使用して、CPU を指定されたサイズに動的にスケールアップできます:
E2B SDK
Sandbox.create の metadata で、事前定義されたキーを使用してターゲット CPU 仕様を指定します。
from e2b_code_interpreter import Sandbox
sbx = Sandbox.create(template="code-interpreter", metadata={
"e2b.agents.kruise.io/cpu-request": "1000m",
"e2b.agents.kruise.io/cpu-limit": "1000m"
})
SandboxClaim
SandboxClaim の spec.inplaceUpdate.resources フィールドでターゲットリソース仕様を宣言します。
apiVersion: agents.kruise.io/v1alpha1
kind: SandboxClaim
metadata:
name: code-interpreter-vpa-claim
namespace: default
spec:
templateName: code-interpreter
replicas: 1
claimTimeout: 5m
ttlAfterCompleted: 15m
inplaceUpdate: # ターゲットリソース仕様を宣言します。
resources:
requests:
cpu: 1000m
limits:
cpu: 1000m
エージェントサンドボックスの削除
インスタンスを完全に削除するには、次のいずれかの方法でサンドボックスを削除します。
E2B SDK
E2B SDK を使用してサンドボックスインスタンスを削除します:<YOUR_SANDBOX_ID> を実際のサンドボックス ID に置き換えます。
from e2b_code_interpreter import Sandbox
sandbox = Sandbox.connect("<YOUR_SANDBOX_ID>")
sandbox.kill()
Sandbox CR
# コマンドを実行する前に、<NAMESPACE> をリソースの名前空間に、<RESOURCE_NAME> を CR の名前に置き換えてください。
kubectl -n <NAMESPACE> delete sandbox <RESOURCE_NAME>
本番環境
ドメイン名の準備
内部権威ドメイン (ゾーン) の追加または削除を参照して、ドメイン名 your.domain.com および *.your.domain.com を設定し、それらを Ingress アドレスに解決できます。アクセスが完全に ACS クラスター内にある場合は、クラスター内のヘッドレスサービスアドレスである sandbox-manager.sandbox-system.svc.cluster.local を直接使用することもできます。
証明書の取得
E2B クライアントは HTTPS を介してバックエンドにリクエストを送信できます。本番環境では、次のいずれかの方法で証明書を取得します。
方法 1:cert-manager
方法 2:自己署名証明書
方法 3:パブリック証明書
DNS 名前解決
次のコマンドを実行して、エンドポイント情報を表示します:
kubectl get ingress sandbox-manager -o jsonpath='{range .status.loadBalancer.ingress[*]}{.hostname}{.ip}{"\n"}{end}' -n sandbox-system
提供されたエンドポイント情報に基づいて、ドメイン your.domain.com または *.your.domain.com の DNS 名前解決を設定します。DNS 名前解決の詳細については、「クイックリンク」をご参照ください。
-
出力が IP アドレス (
47.114.***.***など) の場合、ホストレコード*.your.domain.comを A レコードとしてその IP アドレスにマッピングします。 -
出力が
alb-*****62roo70i*****.cn-hangzhou.alb.aliyuncsslb.comのようなドメイン名である場合、ホストレコード*.your.domain.comを CNAME レコードとしてそのドメイン名に解決してください。 -
複数のエンドポイントが返された場合は、レコードをいずれか 1 つに解決するか、すべてのエンドポイントに対してラウンドロビン DNS を設定できます。
よくある質問
ack-agent-sandbox-controller のインストールエラー:「[RAM Role AliyunCSManagedAgentSandboxRole is not granted]」
-
Resource Access Management (RAM) コンソールに移動し、[ID] > [ロール] を選択します。AliyunCSManagedAgentSandboxRole を検索し、ロール名をクリックして詳細ページを開きます。
-
[権限] タブで、AliyunCSManagedAgentSandboxRolePolicy ポリシーを選択し、[権限の削除] をクリックします。
-
権限付与リンクをクリックして、再度権限を付与します。