独自のオーケストレーション プラットフォーム、VM ベースのサンドボックス、または Google Kubernetes Engine(GKE)以外のコンテナ環境で Filestore エージェント ボリュームを使用する場合は、Filestore REST API を使用して、ボリューム プール内の個々のボリュームを直接プロビジョニングして管理できます。
始める前に
- Filestore エージェント ボリュームを設定するで、初期プロジェクトと Private Service Connect(PSC)ネットワーキングの設定を完了します。
- ボリューム プールを作成して管理するでリージョン ボリューム プールを作成する。
ボリュームを作成
REST API
ボリューム プール内に個別のボリュームをプロビジョニングするには、volumes.create エンドポイントに HTTP POST リクエストを送信します。
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"https://file.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/volumePools/VOLUME_POOL_ID/volumes?volumeId=VOLUME_ID" \
-d '{
"description": "Dynamic tool scratchpad for Agent Worker 12",
"labels": {
"agent_id": "worker-12",
"workflow": "code_eval"
}
}'
次のように置き換えます。
PROJECT_ID: Google Cloud プロジェクト ID。LOCATION: 親ボリューム プールを含むリージョン(us-central1など)。VOLUME_POOL_ID: 親ボリューム プールの識別子。VOLUME_ID: ボリュームの識別子。^[a-z]([a-z0-9-]{0,61}[a-z0-9])?$と一致します。
ボリュームのプロビジョニングは 1 ~ 2 秒で完了します。API は Volume リソースを直接返します。ボリュームの作成時に、カスタム ボリューム割り当て(quotaMib)と動的 NFS エクスポート オプション(ipAcls)を指定することもできます。
{
"name": "projects/my-project/locations/us-central1/volumePools/my-volume-pool/volumes/my-volume",
"description": "Dynamic tool scratchpad for Agent Worker 12",
"mountPoint": {
"ipAddress": "10.128.0.45",
"mountName": "my_volume"
}
}
mountPoint 内に返される値に注意してください。
ipAddress: VPC ネットワーク内の NFS マウント エンドポイントの内部 IP アドレス。mountName: マウントする NFS エクスポート パス コンポーネント。
ボリュームをマウントする
ボリュームをプロビジョニングすると、オーケストレーターは、同じ VPC ネットワークに接続されているクライアント VM またはコンテナホストにボリュームの NFSv3 エクスポートを直接マウントできます。
- NFS クライアント ユーティリティがホストにインストールされていることを確認します(Debian または Ubuntu の
nfs-commonなど)。 マウント ディレクトリを作成し、ボリュームの
mountPointで返されたipAddressとmountNameを使用してボリュームをマウントします。sudo mkdir -p MOUNT_DIR sudo mount -t nfs -o vers=3,proto=tcp,mountproto=tcp,port=2049,mountport=2050 \ IP_ADDRESS:/MOUNT_NAME MOUNT_DIR次のように置き換えます。
MOUNT_DIR: ボリュームがマウントされているローカル ディレクトリのパス(/workspaceなど)。IP_ADDRESS: ボリュームの作成時または取得時に返されるmountPoint.ipAddress値。MOUNT_NAME: ボリュームの作成時または取得時に返されるmountPoint.mountName値。
ボリュームを管理する
REST API
次の各リクエストで、次のように置き換えます。
PROJECT_ID: Google Cloud プロジェクト ID。LOCATION: 親ボリューム プールを含むリージョン。VOLUME_POOL_ID: 親ボリューム プールの識別子。VOLUME_ID: ボリュームの識別子。
ボリュームの詳細を取得する
既存のボリュームの詳細(mountPoint や現在のライフサイクル state など)を表示するには:
curl -X GET \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://file.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/volumePools/VOLUME_POOL_ID/volumes/VOLUME_ID"
プール内のボリュームを一覧表示する
ボリューム プールにプロビジョニングされたすべてのボリュームを一覧表示するには:
curl -X GET \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://file.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/volumePools/VOLUME_POOL_ID/volumes"
ボリューム割り当てを更新する
アクティブなボリュームの保存容量を増やすには、updateMask=quotaMib を指定して HTTP PATCH リクエストを送信します。ボリューム割り当ては増やすことのみ可能です。ボリューム割り当ての削減はサポートされていません。
curl -X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-d '{
"quotaMib": 4096
}' \
"https://file.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/volumePools/VOLUME_POOL_ID/volumes/VOLUME_ID?updateMask=quotaMib"
ボリューム IP ACL を更新する
NFS アクセスを特定のサンドボックス クライアント IP アドレスに制限するか、IP エクスポート ルールを更新するには、updateMask=ipAcls を指定して HTTP PATCH リクエストを送信します。
curl -X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-d '{
"ipAcls": [
{
"ipRanges": ["10.128.0.50/32"],
"accessMode": "READ_WRITE"
}
]
}' \
"https://file.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/volumePools/VOLUME_POOL_ID/volumes/VOLUME_ID?updateMask=ipAcls"
ボリュームを削除する
エージェント セッションが終了するか、エフェメラル サンドボックスが終了したら、ボリュームを削除してプール内の割り当てを再利用します。
curl -X DELETE \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://file.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/volumePools/VOLUME_POOL_ID/volumes/VOLUME_ID"
ボリューム スナップショットを使用してワークスペースのクローンを作成する
READY 状態のボリューム プールと HOT 状態の既存のソース ボリュームがすでにある場合は、ボリューム スナップショットを作成して、エージェント ボリュームの特定時点の状態をキャプチャできます。これにより、後でワークスペースのクローンを作成したり、ブランチを作成したりできます。
REST API
ボリューム スナップショットを作成する
sourceVolumeフィールドにボリュームの完全なリソース名を指定し、SNAPSHOT_IDをスナップショットの固有識別子に置き換えて、HTTPPOSTリクエストをbackups.createエンドポイントに送信します。curl -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json" \ -d '{ "sourceVolume": "projects/PROJECT_ID/locations/LOCATION/volumePools/VOLUME_POOL_ID/volumes/VOLUME_ID", "description": "Baseline workspace snapshot" }' \ "https://file.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/backups?backupId=SNAPSHOT_ID"リクエストは長時間実行オペレーション(LRO)を返します。オペレーションをポーリングするか、
stateがREADYになるまでスナップショット リソースをクエリしてから、ボリュームのクローンを作成します。curl -X GET \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://file.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/backups/SNAPSHOT_ID"
スナップショットからボリュームのクローンを作成する
スナップショットからボリュームのクローンを作成するには、ソース スナップショットが同じボリューム プール内のボリュームから作成されている必要があります。
HTTP
POSTリクエストをvolumes:createFromSourceエンドポイントに送信します。リクエスト本文でipAclsを渡して、エクスポート権限を構成し、HOTティアでクローン作成されたボリュームを有効にします。curl -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json" \ -d '{ "backup": "projects/PROJECT_ID/locations/LOCATION/backups/SNAPSHOT_ID", "volumeId": "CLONED_VOLUME_ID", "ipAcls": [ { "ipRanges": ["10.128.0.0/24"], "accessMode": "READ_WRITE", "squashMode": "NO_ROOT_SQUASH" } ] }' \ "https://file.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/volumePools/VOLUME_POOL_ID/volumes:createFromSource"次のように置き換えます。
SNAPSHOT_ID: 同じボリューム プール内のソース スナップショットの ID。CLONED_VOLUME_ID: 新しいクローン ボリュームの ID。
このリクエストは長時間実行オペレーションを返します。
doneがtrueになるまで、オペレーションをポーリングします。curl -X GET \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://file.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/operations/OPERATION_ID"
オペレーションが完了したら、
volumes.getを呼び出すか、完了したオペレーション レスポンスを調べて、マウントする前に新しいボリュームのmountPoint(ipAddressとmountName)を取得します。curl -X GET \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://file.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/volumePools/VOLUME_POOL_ID/volumes/CLONED_VOLUME_ID"
スナップショットからのボリューム クローン作成は、1 GB あたり 3 秒、または 10,000 ファイルあたり 1.5 秒で完了します。
ボリュームを COLD に階層化する
REST API
アイドル状態のワークスペースをコールド ストレージに階層化するには、ボリュームの状態を COLD に更新し、ipAcls をクリアする HTTP PATCH リクエストを送信します。
curl -X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-d '{
"state": "COLD",
"ipAcls": []
}' \
"https://file.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/volumePools/VOLUME_POOL_ID/volumes/VOLUME_ID?updateMask=state,ipAcls"
エージェント セッションの再開時にボリュームを COLD ティアから HOT ティアに復元するには:
unfreezeカスタム メソッドを呼び出し、リクエスト本文でipAclsを渡して、クライアント アクセスを構成し、HOTティアでボリュームのマウント ポイントを有効にします。curl -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json" \ -d '{ "ipAcls": [ { "ipRanges": ["10.128.0.0/24"], "accessMode": "READ_WRITE", "squashMode": "NO_ROOT_SQUASH" } ] }' \ "https://file.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/volumePools/VOLUME_POOL_ID/volumes/VOLUME_ID:unfreeze"このリクエストは長時間実行オペレーションを返します。
doneがtrueになるまで、オペレーションをポーリングします。curl -X GET \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://file.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/operations/OPERATION_ID"
ボリュームが
COLDティアから復元されると、Filestore はボリューム プールから新しい NFS マウント エンドポイントを割り当てるため、mountPoint.ipAddressとmountPoint.mountNameが変更されます。完了したオペレーション レスポンスから、またはボリュームを再マウントする前にvolumes.getを呼び出して、更新されたmountPointを取得します。curl -X GET \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://file.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/volumePools/VOLUME_POOL_ID/volumes/VOLUME_ID"
次のステップ
- ボリューム プールを管理、モニタリングする。
- Filestore エージェント ボリュームの GKE 環境を構成します。