Agent Sandbox 用长期 AccessKey 挂载 AgenticFS 时,密钥会留在容器内,且所有实例共享同一组权限。改用 Agent Identity 后,每个 Sandbox 获取独立的 STS 临时凭据,权限可收缩到其声明的 AccessPoint。
工作原理
相比传统 AccessKey 方式将长期静态凭据挂载到 Sandbox(所有 Sandbox 共享同一组 AK/SK,权限无法收缩到实例维度),Agent Identity 通过 ack-agent-identity 组件为每个 Sandbox 签发独立身份,动态获取短期 STS(Security Token Service,安全令牌服务)临时凭据,实现 Sandbox 级别的精细化权限隔离,且 Sandbox 内不留存任何长期密钥。
Agent Identity 采用两层权限模型:
第一层:RAM 角色权限(最大权限边界)。在 RAM 控制台创建,覆盖所有 Sandbox 可能访问的 AgenticFS 文件系统范围,由管理员一次性配置。
第二层:CredentialProvider 策略(实际生效权限)。在集群内通过
CredentialProviderCR(Custom Resource,自定义资源)定义,必须是第一层的子集,支持变量插值按每个 Sandbox 声明的 AccessPoint 动态收缩。
每个 Sandbox 最终获取的 STS 凭据权限,为 RAM 角色权限与 CredentialProvider 策略的交集。此外,该权限的生效范围仅限于该 Sandbox 声明的 AccessPoint。
AgenticFS 的 Agent Identity 挂载走 aliagenticfs 客户端,通过 TLS 隧道(本地 stunnel → AgenticFS AccessPoint 的 12049 端口)以 NFSv3 协议挂载。因此除凭据链路外,还需确保 AgenticFS 侧已开启传输加密并放行 12049 端口,详见适用范围与步骤一:配置网络放行。
支持基于 E2B 的 Create 接口、休眠或唤醒功能以及原地升级镜像后的运行时存储挂载。
适用范围
已完成 Agent Sandbox 的基础环境搭建。具体操作,请参见创建Agent Sandbox。
已在集群组件管理中安装或升级并配置以下组件:
ack-agent-identity≥ v0.5.1,如果使用 e2b 接口,请勾选 agentTokenDelegation 配置项。ack-agent-sandbox-controller≥ v0.6.1-release.1,并勾选 identityProvider 配置项。由于组件运行及配置 Sandbox 时需要依赖 csi-agent、csi-plugin 以及 agent-runtime 镜像,建议提前配置好镜像缓存,避免扩容耗时。
ack-sandbox-manager≥ v0.6.11,并勾选 identityProvider 配置项。
已在集群集群信息页的基本信息页签中的安全与审计区域开启 RRSA OIDC,并已记录供应商 URL 和供应商 ARN,用于后续 RAM 角色信任策略配置。具体操作,请参考通过RRSA配置ServiceAccount的RAM权限实现Pod权限隔离。
AgenticFS 侧前置条件(AgenticFS 场景特有):
已创建 AgenticFS 文件系统,并为其创建 AccessPoint(接入点),且 AccessPoint 已开启 RAM 授权(
EnabledRam: true)。已为该 AgenticFS 文件系统开启传输加密(TLS)。AccessPoint 挂载强制要求 TLS,未开通会导致挂载报
mount.nfs: Unknown error 521。AgenticFS AccessPoint 与集群位于同一 VPC、同一 Region。
具体操作,请参考创建 AgenticFS Volume。
使用限制
Sandbox 需使用
dnsPolicy: ClusterFirst以便解析 Credential Provider 服务域名及 AgenticFS AccessPoint 域名。在配置网络策略或流量策略时,请务必放行访问 CoreDNS、Credential Provider 服务(TCP/8443)以及 AgenticFS AccessPoint TLS 端口(TCP/12049)的出方向流量。
AgenticFS AccessPoint 仅支持通过 TLS 挂载,不支持未加密挂载。
PV 的
volumeAttributes创建后不可修改,变更鉴权方式需删除并重建 PV。请根据 Sandbox 实例规模,前往配额中心申请
AssumeRoleWithOIDC接口的访问配额,避免因配额不足导致凭据获取失败。
步骤一:配置网络放行
Sandbox 访问 Credential Provider 获取 STS 凭据、通过 TLS 隧道访问 AgenticFS AccessPoint 读写数据均需要显式放行。使用 TrafficPolicy 控制 Pod 层出入方向流量,使用安全组控制 ECS 网卡层流量,二者需同步配置。
本文的 TrafficPolicy、Agent Identity 相关 CR、SandboxSet、SandboxClaim 与 Sandbox 需位于同一命名空间,下文统一以 <YOUR-NAMESPACE> 表示,请替换为实际命名空间。
TrafficPolicy 示例
参考如下 TrafficPolicy,放行 Sandbox Gateway、Sandbox Manager、Sandbox Controller、CoreDNS 及 Credential Provider。TrafficPolicy 的完整配置方法,请参见使用TrafficPolicy管理Agent网络访问。
apiVersion: network.alibabacloud.com/v1alpha1
kind: TrafficPolicy
metadata:
name: sandbox-policy
namespace: <YOUR-NAMESPACE>
spec:
priority: 100
selector:
matchLabels:
app: sandbox
ingress:
rules:
# 允许来自 Sandbox Gateway、Manager 和 Controller 的访问
- action: allow
from:
- service:
name: sandbox-gateway
namespace: sandbox-system
- service:
name: sandbox-manager
namespace: sandbox-system
- service:
name: sandbox-controller-manager-webhook-service
namespace: sandbox-system
# 禁止其他所有来源
- action: deny
from:
- cidr: 0.0.0.0/0
egress:
rules:
# 禁止访问云产品元数据服务
- action: deny
to:
- cidr: 100.100.100.200/32
# 允许 DNS 服务,用于解析 Credential Provider 与 AgenticFS AccessPoint 服务域名
- action: allow
to:
- service:
namespace: kube-system
name: kube-dns
# 允许访问 Credential Provider 服务,用于获取 STS Token
- action: allow
to:
- service:
namespace: ack-agent-identity
name: credential-provider
# 允许访问 AgenticFS(放行到 AgenticFS IP的出方向,用于 TLS 隧道挂载)
# 说明:AgenticFS AccessPoint 通过 VPC 内网可达,若上面已放行 0.0.0.0/0 可省略;
# 若做了内网 CIDR 收紧,请单独放行 AgenticFS 所在网段。
# 将 <AgenticFS-ACCESSPOINT-IP> 替换为接入点挂载地址的内网 IP,每个挂载地址加一条
- action: allow
to:
- cidr: <AgenticFS-ACCESSPOINT-IP>/32
# 禁止访问私有网络(防止 Sandbox 探测内网,此规则必须位于上面的 allow 之后)
- action: deny
to:
- cidr: 10.0.0.0/8
- action: deny
to:
- cidr: 172.16.0.0/12
- action: deny
to:
- cidr: 192.168.0.0/16
# 允许访问公网
- action: allow
to:
- cidr: 0.0.0.0/0
AgenticFS AccessPoint 的挂载地址通常是 VPC 内网的具体 IP(如 192.168.x.x),数量取决于 AccessPoint 关联的 vswitch。放行规则需精确到这些 IP。这些 IP 落在 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 之内,若 egress 中已对上述私有网段配置 deny,必须把这些 IP 的 allow 规则置于 deny 规则之前,否则 TLS 隧道无法建立,挂载失败。
安全组规则示例
安全组的完整配置方法,请参见Agent Sandbox网络规划与扩容。
Sandbox 安全组入方向规则
来源 | 协议/端口 | 用途 | 策略 |
集群托管组件网段 | TCP/9090、TCP/9100、TCP/10254 | Prometheus、node-exporter、Ingress metrics | 允许 |
集群托管组件网段 | ICMP | 健康探测 | 允许 |
集群托管组件网段 | TCP/49983 | sandbox-controller 访问 Sandbox Pod(envd) | 允许 |
集群非托管组件网段 | TCP/49983、TCP/49999 | sandbox-manager 和 sandbox-gateway 访问 Sandbox Pod(envd、jupyter) | 允许 |
Sandbox 安全组出方向规则
目标 | 协议/端口 | 用途 | 策略 | 优先级 |
| TCP/80、TCP/443 | ECS 元数据服务 | 拒绝 | 1 |
集群托管组件网段 | TCP/6443 | API Server | 允许 | 1 |
集群托管组件网段 | TCP/9082 | Poseidon 托管组件 | 允许 | 1 |
集群托管组件网段 | TCP/53、UDP/53 | 内网 DNS(PrivateZone)和 DNS 上游 | 允许 | 1 |
集群托管组件网段 | TCP/8443 | Credential Provider(获取 STS) | 允许 | 1 |
集群托管或非托管组件网段 | TCP/53、UDP/53 | Sandbox 访问 CoreDNS Pod | 允许 | 1 |
AgenticFS AccessPoint 所在 IP | TCP/12049 | AgenticFS AccessPoint TLS 隧道挂载(AgenticFS 场景必需) | 允许 | 5 |
| ALL | 私有网络(防止 Sandbox 探测内网) | 拒绝 | 10 |
| ALL | 公网出口(按需开放) | 允许 | 20 |
完成配置后,可在 Sandbox 内验证到 Credential Provider 和 AgenticFS AccessPoint 的连通性:
# 验证到 Credential Provider 的连通性
telnet credential-provider.ack-agent-identity.svc 8443
# 验证到 AgenticFS AccessPoint 12049 端口的连通性(<AgenticFS-ACCESSPOINT-IP> 为 AccessPoint 挂载地址)
telnet <AgenticFS-ACCESSPOINT-IP> 12049步骤二:创建 RAM 角色并配置信任策略
Agent Identity 组件依赖 RRSA(RAM Roles for Service Account,服务账户角色)扮演 RAM 角色获取 STS 临时凭据。此处配置的 RAM 角色权限是最大权限边界,实际每个 Sandbox 获得的权限还会被步骤三的 CredentialProvider 策略进一步收缩。建议将此角色配置为覆盖所有 Sandbox 可能访问的 AgenticFS 文件系统范围。
在目标集群信息页的基本信息页签中的安全与审计区域开启 RRSA OIDC。将鼠标悬浮至 RRSA OIDC 右侧的已开启上,即可查看提供商的 URL 链接和 ARN 信息。
访问 RAM 控制台-创建角色页面,选择**信任主体类型**为**身份提供商类型**,替换以下模板中的
<oidc_issuer_url>为提供商 URL,<oidc_provider_arn>为提供商 ARN:重要在大规模应用场景下,为避免 STS Token 反复轮转,建议在角色创建完成后,在角色详情页更改最大会话时间,调整至 12 小时以上。若当前 RAM 用户没有创建角色或策略的相关权限,请联系阿里云账号管理员为当前用户授予
AliyunRAMFullAccess等相关权限。{ "Statement": [ { "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "oidc:aud": "sts.aliyuncs.com", "oidc:iss": "<oidc_issuer_url>", "oidc:sub": [ "system:serviceaccount:ack-agent-identity:credential-provider" ] } }, "Effect": "Allow", "Principal": { "Federated": [ "<oidc_provider_arn>" ] } } ], "Version": "1" }oidc:sub中的ack-agent-identity:credential-provider是ack-agent-identity组件使用的 ServiceAccount,不支持自定义。为该 RAM 角色创建自定义权限策略。根据业务需求选择只读或读写策略,将
<YOUR-REGION>、<YOUR-ACCOUNT-ID>、<YOUR-FILESYSTEM-ID>替换为实际值。nas:AccessPointArn条件将权限约束到指定的 AccessPoint,<YOUR-ACCESSPOINT-ID>替换为实际 AccessPoint ID(如需覆盖多个可列举或使用通配符)。只读策略
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "nas:ClientMount", "nas:ClientRootAccess" ], # REGIONID(cn-hangzhou) & ACCOUNT-ID 不能写 * "Resource": "acs:nas:<YOUR-REGION>:<YOUR-ACCOUNT-ID>:filesystem/*", "Condition": { "StringEquals": { "nas:AccessPointArn": [ # REGIONID(cn-hangzhou) & ACCOUNT-ID 不能写 * "acs:nas:<YOUR-REGION>:<YOUR-ACCOUNT-ID>:accesspoint/<YOUR-ACCESSPOINT-ID>" ] } } } ] }读写策略
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "nas:ClientMount", "nas:ClientWrite", "nas:ClientRootAccess" ], # REGIONID(cn-hangzhou) & ACCOUNT-ID 不能写 * "Resource": "acs:nas:<YOUR-REGION>:<YOUR-ACCOUNT-ID>:filesystem/*", "Condition": { "StringEquals": { "nas:AccessPointArn": [ # REGIONID(cn-hangzhou) & ACCOUNT-ID 不能写 * "acs:nas:<YOUR-REGION>:<YOUR-ACCOUNT-ID>:accesspoint/<YOUR-ACCESSPOINT-ID>" ] } } } ] }AgenticFS 客户端权限 Action 说明:
nas:ClientMount(挂载/读,只读必需)、nas:ClientWrite(写)、nas:ClientRootAccess(以 root 身份访问,按需)。只读场景仅保留nas:ClientMount;写场景追加nas:ClientWrite。访问 RAM 控制台-角色页面,在 RAM 角色列表的操作列,单击目标角色对应的新增授权,将上一步创建的权限策略授权给该 RAM 角色。
步骤三:创建 Agent Identity 相关 CR
创建 AgentIdentity、CredentialProvider、AgentRole、AgentRoleBinding 四种 CR,完成 Sandbox 身份与凭据的授权绑定。
将以下 YAML 保存为
agent-identity.yaml,定义 Agent 身份标识:apiVersion: agentidentity.alibabacloud.com/v1alpha1 kind: AgentIdentity metadata: name: my-storage-agent # Agent 身份名称 namespace: <YOUR-NAMESPACE> spec: description: "用于 AgenticFS 存储挂载的 Agent 身份"将以下 YAML 保存为
credential-provider.yaml,定义每个 Sandbox 实际获得的 STS 凭据权限范围。可按业务场景创建多个 CredentialProvider 作为不同的权限模板,本文提供只读和读写两种。CredentialProvider 的策略需在步骤二 RAM 角色的权限范围内,超出部分不会生效。
将
<YOUR-RAM-ROLE-NAME>替换为步骤二创建的 RAM 角色名称,<YOUR-REGION>、<YOUR-ACCOUNT-ID>替换为实际值。${ack:agent-identity/storage-auth/agenticfs-ap-id}无需替换,sandbox-controller 会按每个 Sandbox 声明的 AccessPoint 自动填充为实际 AccessPoint ID,从而将权限收缩到该 Sandbox 挂载的 AccessPoint。只读 CredentialProvider
apiVersion: agentidentity.alibabacloud.com/v1alpha1 kind: CredentialProvider metadata: name: agenticfs-read-only # 只读场景的 CredentialProvider namespace: <YOUR-NAMESPACE> spec: type: RAM ram: source: provider: RRSA rrsa: roleName: <YOUR-RAM-ROLE-NAME> tokenValidity: 1h policy: | { "Version": "1", "Statement": [ { "Effect": "Allow", "Action": ["nas:ClientMount", "nas:ClientRootAccess"], "Resource": {{ build_policy_nas_resource() }}, "Condition": { "StringEquals": { "nas:AccessPointArn": {{ build_policy_nas_ap_arn_condition() }} } } } ] }读写 CredentialProvider
apiVersion: agentidentity.alibabacloud.com/v1alpha1 kind: CredentialProvider metadata: name: agenticfs-read-write # 读写场景的 CredentialProvider namespace: <YOUR-NAMESPACE> spec: type: RAM ram: source: provider: RRSA rrsa: roleName: <YOUR-RAM-ROLE-NAME> tokenValidity: 1h policy: | { "Version": "1", "Statement": [ { "Effect": "Allow", "Action": ["nas:ClientMount", "nas:ClientWrite", "nas:ClientRootAccess"], "Resource": {{ build_policy_nas_resource() }}, "Condition": { "StringEquals": { "nas:AccessPointArn": {{ build_policy_nas_ap_arn_condition() }} } } } ] }tokenValidity指定 STS 临时凭据有效期。挂载后 csi-agent 会在凭据过期前(约tokenValidity - 5min)自动轮转,无需重新挂载,业务无感知。将以下 YAML 保存为
agent-role.yaml,通过 AgentRole 引用所有存储相关的 CredentialProvider,并通过 AgentRoleBinding 将角色绑定到 Agent 身份:apiVersion: agentidentity.alibabacloud.com/v1alpha1 kind: AgentRole metadata: name: agenticfs-storage-role namespace: <YOUR-NAMESPACE> spec: rules: - effect: Allow action: "GetResourceCredential" resource: "CredentialProvider/agenticfs-read-only" # 引用只读 CredentialProvider - effect: Allow action: "GetResourceCredential" resource: "CredentialProvider/agenticfs-read-write" # 引用读写 CredentialProvider --- apiVersion: agentidentity.alibabacloud.com/v1alpha1 kind: AgentRoleBinding metadata: name: my-agent-agenticfs-binding namespace: <YOUR-NAMESPACE> spec: agentRoleRef: apiGroup: agentidentity.alibabacloud.com kind: AgentRole name: agenticfs-storage-role subjects: - authorizationType: "Agent" agentAuthorizationConfiguration: agentName: my-storage-agent # 与 AgentIdentity name 一致依次应用以上所有 YAML 文件:
kubectl apply -f agent-identity.yaml kubectl apply -f credential-provider.yaml kubectl apply -f agent-role.yaml应用后确认四种 CR 均处于可用状态:
kubectl get agentidentity,credentialprovider,agentrole,agentrolebinding -n <YOUR-NAMESPACE>
权限收缩示例
假设 RAM 角色允许 nas:ClientMount + nas:ClientWrite 访问某文件系统的所有 AccessPoint。Sandbox A 的 SandboxClaim 引用 agenticfs-read-only,Sandbox B 引用 agenticfs-read-write。最终 Sandbox A 仅能只读访问其声明的 AccessPoint,Sandbox B 可读写其声明的 AccessPoint,两者互不可见。
步骤四:配置 SandboxSet 和创建 PV
在 SandboxSet 中启用 CSI 和 agent-runtime 能力,并创建声明 authType: agent-identity 的 PersistentVolume 对象。
将以下 YAML 保存为
sandboxset.yaml(注意dnsPolicy必须为ClusterFirst),执行kubectl apply -f sandboxset.yaml进行应用:apiVersion: agents.kruise.io/v1alpha1 kind: SandboxSet metadata: name: code-interpreter-agenticfs-agent-identity namespace: <YOUR-NAMESPACE> spec: replicas: 3 runtimes: - name: csi # 启用 CSI 挂载能力 - name: agent-runtime # 注入 envd 等环境管理工具 template: metadata: annotations: network.alibabacloud.com/wait-clusterip-ready: "*" labels: alibabacloud.com/acs: "true" alibabacloud.com/compute-class: agent-sandbox alibabacloud.com/compute-qos: default spec: automountServiceAccountToken: false dnsPolicy: ClusterFirst # 必须为 ClusterFirst containers: - image: registry-cn-hangzhou-vpc.ack.aliyuncs.com/acs/code-interpreter:v1.6 imagePullPolicy: IfNotPresent name: sandbox resources: requests: cpu: "1" memory: 1Gi limits: cpu: "1" memory: 1Gi terminationGracePeriodSeconds: 30建议启用
network.alibabacloud.com/wait-clusterip-ready注解,确保 Sandbox 执行动态存储挂载时能够准确解析到 Credential Provider 和 AgenticFS 服务端的地址。将以下 YAML 保存为
agenticfs-pv.yaml,替换 AccessPoint 域名和 Region 为实际值,执行kubectl apply -f agenticfs-pv.yaml创建资源。Agent Identity 方式下 PV 无需
nodePublishSecretRef,也无需创建 Secret。apiVersion: v1 kind: PersistentVolume metadata: labels: alicloud-pvname: agenticfs-pv-sandbox-system name: agenticfs-pv-sandbox-system spec: accessModes: - ReadWriteMany capacity: storage: 50Gi csi: driver: nasplugin.csi.alibabacloud.com volumeAttributes: authType: agent-identity # 固定值,声明使用 Agent Identity 认证 mountProtocol: alinas # 固定值,使用 aliagenticfs 客户端(NFSv3 over TLS) server: <YOUR-ACCESSPOINT-DOMAIN> # AccessPoint 域名,如 ap-xxxx.<fsid>-xxx.<region>.agenticfs.aliyuncs.com path: / # 挂载点相对 AccessPoint 根目录的路径 options: nolock,tcp,noresvport,tls,ram,vers=3 volumeHandle: agenticfs-pv-sandbox-system # 必须与 PV 的名称一致 persistentVolumeReclaimPolicy: Retain storageClassName: test volumeMode: Filesystem重要PV 的
volumeAttributes创建后不可修改。如需变更鉴权方式,需删除并重建 PV。此操作会导致未升级的 Sandbox AgenticFS 访问失败,请谨慎操作。关键字段说明如下:
参数
说明
authType固定为
agent-identity,表示使用 Agent Identity 认证。mountProtocol固定为
alinas,使用 aliagenticfs 客户端以 NFSv3 over TLS 方式挂载 AccessPoint。serverAgenticFS AccessPoint 的域名。
path挂载点相对于 AccessPoint 根目录的路径,默认为
/。optionsaliagenticfs 挂载选项。AccessPoint 挂载必须包含
tls、ram与vers=3。
步骤五:挂载存储卷
在 Sandbox 上指定挂载配置时,需通过 attributes.credentialProviderName 指定使用的 CredentialProvider,并通过 security.agents.kruise.io/agent-name 关联步骤三创建的 AgentIdentity。ACS 支持以下两种触发挂载的方式:应用以编程方式创建 Sandbox 时使用 E2B SDK,在集群内声明式管理 Sandbox 时使用 SandboxClaim。
subPath 自动创建:在挂载配置中声明 subPath 时,若该子目录在 AgenticFS 远端尚不存在,CSI 会自动创建该子目录后再挂载,无需提前手动创建。通过 E2B SDK 挂载
使用 e2b.agents.kruise.io/csi-volume-config 参数以 JSON 数组格式指定挂载配置。注意:security.agents.kruise.io/agent-name 配置必须与 AgentIdentity 名称完全一致:
import json
from e2b_code_interpreter import Sandbox
sbx = Sandbox.create(
template="code-interpreter-agenticfs-agent-identity",
timeout=600,
metadata={
"e2b.agents.kruise.io/csi-volume-config": json.dumps([
{
"pvName": "agenticfs-pv-sandbox-system",
"mountPath": "/data-agenticfs",
"subPath": "user-a-data",
"attributes": {
"credentialProviderName": "agenticfs-read-only"
}
}
]),
"security.agents.kruise.io/agent-name": "my-storage-agent"
}
)
print(f"sandbox id: {sbx.sandbox_id}")
通过 SandboxClaim 挂载
在 SandboxClaim 的 spec.dynamicVolumesMount 字段声明挂载卷列表。注意:security.agents.kruise.io/agent-name 配置必须与 AgentIdentity 名称完全一致。以下示例演示 2 个只读子目录和 1 个读写子目录的混合权限挂载:
apiVersion: agents.kruise.io/v1alpha1
kind: SandboxClaim
metadata:
name: code-interpreter-claim
namespace: <YOUR-NAMESPACE>
spec:
templateName: code-interpreter-agenticfs-agent-identity # 关联的 SandboxSet 名称
replicas: 1
claimTimeout: 5m
ttlAfterCompleted: 15m
annotations:
# 必须与 AgentIdentity 名称完全一致
security.agents.kruise.io/agent-name: my-storage-agent
dynamicVolumesMount:
# 公司只读子目录 1
- pvName: agenticfs-pv-sandbox-system
mountPath: "/office-skill-readonly"
subPath: "office-skill-readonly"
readOnly: true
attributes:
credentialProviderName: "agenticfs-read-only"
# 公司只读子目录 2
- pvName: agenticfs-pv-sandbox-system
mountPath: "/bu-office-skill-sub"
subPath: "bu-office-skill-sub-readonly"
readOnly: true
attributes:
credentialProviderName: "agenticfs-read-only"
# 每个用户独立的读写子目录
- pvName: agenticfs-pv-sandbox-system
mountPath: "/user-owner-dir-rw"
subPath: "user-a-owner-dir-rw"
attributes:
credentialProviderName: "agenticfs-read-write"
挂载字段说明如下:
字段 | 类型 | 说明 |
| String | PersistentVolume 对象名称。 |
| String | 挂载到容器内的目录路径,必须为一个空目录。 |
| String | 远端存储的子目录名(相对路径),可选。若远端不存在会自动创建。 |
| Boolean | 是否以只读方式挂载,可选,默认为 |
| String | 指定该挂载点使用的 CredentialProvider 名称。Agent Identity 方式下必填。 |
步骤六:验证挂载结果
以下命令以步骤五中的 SandboxClaim 方式为例验证。若通过 E2B SDK 挂载,请将命令中的目录替换为该示例声明的挂载路径。
Sandbox 创建成功后,
status变为Running即表示 Claim 与挂载流程已完成。查询已分配出的 Sandbox:kubectl get sandbox -n <YOUR-NAMESPACE> -l agents.kruise.io/claim-name=code-interpreter-claim预期输出:
NAME STATUS AGE CLAIMED code-interpreter-agenticfs-agent-identity-6vh94 Running 45s true替换
<POD_NAME>为上一步输出中的 Pod 名称,进入容器验证只读挂载目录可列举、读写挂载目录可写入:kubectl exec -it <POD_NAME> -n <YOUR-NAMESPACE> -- ls /office-skill-readonly kubectl exec -it <POD_NAME> -n <YOUR-NAMESPACE> -- sh -c "echo 'hello agent identity' > /user-owner-dir-rw/test.txt && cat /user-owner-dir-rw/test.txt"若
ls可正常列出 AgenticFS AccessPoint 子目录下的文件,且读写挂载目录写入成功,即表示 Agent Identity 认证的 AgenticFS 存储卷挂载生效。只读挂载目录写入失败属预期行为;读写挂载目录写入失败则说明权限配置有问题,排查方法请参见常见问题中的第三层。也可在容器内确认挂载点走的是 TLS(端口
12049):kubectl exec -it <POD_NAME> -n <YOUR-NAMESPACE> -- sh -c "mount | grep agenticfs" # 预期见到 type nfs (rw,...,port=12049,...) 说明走 aliagenticfs TLS 隧道
常见问题
Agent Identity 挂载 AgenticFS 的完整链路可以拆解为三层:Sandbox 通过网络访问 CredentialProvider → CredentialProvider 签发 STS Token → 使用 Token 通过 TLS 隧道挂载 AgenticFS AccessPoint。三层问题的定位方式和排查手段各不相同,可按以下顺序逐层排查。
逐层排查挂载链路
# 查看 token 签发状态
kubectl get pod <POD_NAME> -n <YOUR-NAMESPACE> -o jsonpath='{.metadata.annotations.security\.agents\.kruise\.io/token-status}'
# 查看 csi-sidecar 日志,定位挂载报错与 mount options
kubectl -n <YOUR-NAMESPACE> logs <POD_NAME> -c csi-sidecar
# 查看 csi-agent-sidecar 日志与 aliagenticfs 挂载详情
kubectl -n <YOUR-NAMESPACE> logs <POD_NAME> -c csi-agent-sidecar
kubectl -n <YOUR-NAMESPACE> exec <POD_NAME> -c csi-agent-sidecar -- tail -50 /var/log/aliyun/aliagenticfs/mount.log
# 在 Sandbox 内验证连通性
telnet credential-provider.ack-agent-identity.svc 8443
telnet <NAS-ACCESSPOINT-IP> 12049
判断当前进度可看 csi-sidecar 日志中的 mount options:
kubectl -n <YOUR-NAMESPACE> logs <POD_NAME> -c csi-sidecar | grep -oE 'options=\[[^]]+\]' | tail -1
无
sandboxId=:卡在链路早期(CLI 未注入 sandboxId)。有
sandboxId=<hash>,sandboxCredProviderName=<cp>但报 endpoint 错误:卡在第二层(Credential Provider 未配置)。出现
tls,ram,<masked>,<masked>,<masked>(STS 三元组已注入):已过凭据链路,卡在第三层(AgenticFS 挂载)。
第一层:Sandbox 无法访问 CredentialProvider(网络不通)
现象:csi-agent-sidecar 日志出现网络访问超时、DNS 解析失败或连接被拒绝;Sandbox 已 Running 但挂载目录未生成,或挂载超时失败。
排查步骤
在 Sandbox 内执行
telnet credential-provider.ack-agent-identity.svc 8443,根据返回结果定位:报
could not resolve host:DNS 解析问题,进入步骤 2。报
Connection refused或Connection timed out:网络出方向被拦截,进入步骤 3。返回
Connected to ...:网络层正常,跳转至第二层排查。
排查 DNS 解析:
检查 SandboxSet 定义:
spec.template.spec.dnsPolicy必须为ClusterFirst,且spec.template.metadata.annotations包含network.alibabacloud.com/wait-clusterip-ready: "*"。检查 CoreDNS 状态:
kubectl -n kube-system get pod -l k8s-app=kube-dns。参考步骤一:配置网络放行章节,确认 TrafficPolicy 已放行
kube-system/kube-dns,安全组出方向已放行 TCP/UDP 53。
排查网络出方向:
参考步骤一:配置网络放行章节,确认 TrafficPolicy 已放行到
ack-agent-identity/credential-provider的出方向流量。确认安全组出方向已放行 TCP/8443 到集群托管组件网段。
第二层:CredentialProvider 服务签发 Token 失败
现象:Sandbox 已能访问 CredentialProvider,但服务返回错误或未正常运行。日志出现 Token 获取失败报错,或 mount options 缺少 sandboxId= / 报 jwtauth config error。
排查步骤
参考适用范围章节,确认
ack-agent-identity、ack-agent-sandbox-controller、ack-sandbox-manager组件版本和配置勾选情况。检查 Pod 是否携带
token-statusannotation:kubectl get pod <POD_NAME> -n <YOUR-NAMESPACE> -o jsonpath='{.metadata.annotations.security\.agents\.kruise\.io/token-status}'无输出:Sandbox 创建时未传入
security.agents.kruise.io/agent-name,或该 annotation 未透传到 Pod。请核对 SandboxClaim 的metadata.annotations或 E2B SDKSandbox.create的metadata参数中是否包含security.agents.kruise.io/agent-name。有输出但状态异常:传入的
agent-name与集群内AgentIdentity资源不匹配(区分大小写),请核对两者名称完全一致。
若 mount options 报
jwtauth config error: endpoint could not be resolved:确认 csi-agent 已配置 Credential Provider endpoint(组件安装勾选 identityProvider 后由组件注入)。若日志出现
AssumeRoleWithOIDC相关错误,前往 RAM 控制台核对。目标角色信任策略中
oidc:iss与集群提供商 URL 完全一致。oidc:sub为system:serviceaccount:ack-agent-identity:credential-provider,不支持自定义。oidc:aud为sts.aliyuncs.com。Principal.Federated为集群提供商 ARN。
若并发创建大量 Sandbox 时出现偶发失败,请前往配额中心申请
AssumeRoleWithOIDC接口的访问配额。
第三层:使用 STS Token 挂载 AgenticFS 失败
Token 已签发正常(mount options 出现 tls,ram,<masked> 三元组),但 aliagenticfs 挂载失败。AgenticFS 场景最常见两类:权限不足与 TLS 端口不通。
现象一:mount.nfs: Unknown error 521(exit status 32)
这是 AgenticFS 场景最典型的报错,通常伴随 .credentials is not found 警告(该警告非根因):
根因:RAM/CredentialProvider 权限不足
STS 已注入但权限不覆盖目标 AccessPoint 的 nas:Client*。
前往 RAM 控制台,核对步骤二角色的权限策略:
Action是否包含nas:ClientMount(读)/nas:ClientWrite(写),Condition.nas:AccessPointArn是否覆盖目标 AccessPoint。核对 CredentialProvider 的
policy:与 RAM 角色策略取交集后必须仍覆盖目标 AccessPoint 的nas:Client*。任一层缺失都会导致挂载被拒。若为只读 CredentialProvider 执行写入,将挂载配置的
credentialProviderName改为读写模板并去掉readOnly: true。
现象二:mount point does not exist / subPath 挂载失败
声明的 subPath 在远端不存在时,CSI 会自动创建后再挂载。若报此类错误,请确认:
使用的组件版本支持 subPath 自动创建(见适用范围组件版本要求)。
CredentialProvider 权限包含
nas:ClientWrite(自动创建目录需要写权限)。仅nas:ClientMount的只读凭据无法创建不存在的 subPath。