You need to enable JavaScript to run this app.
文档中心
容器服务

容器服务

复制全文
下载 pdf
VCI Agent Sandbox
网络隔离策略
复制全文
下载 pdf
网络隔离策略
本文主要介绍 VCI Agent Sandbox 的网络隔离策略,包括相关机制、使用限制、两种创建方式以及对应场景操作步骤。​
背景信息​
网络隔离是 Sandbox 安全模型的核心组成部分,通过网络策略(NetworkPolicy)能力,在 Pod 网络层面控制 Sandbox 实例的入方向(Ingress)和出方向(Egress)流量。该机制确保只有经过授权的组件能够访问 Sandbox,同时限制 Sandbox 的出站访问范围。​
使用限制​
  • NetworkPolicy 暂不支持在普通节点(ECS 节点)和虚拟节点混部场景中使用,具体表现为:​
  • 当 NetworkPolicy 中设置了namespaceSelector或podSelector规则白名单时,策略不会作用于 ECS 节点上的 Pod。​
  • 来自 ECS Pod 的请求,或访问 ECS Pod 的请求,仍会被拦截。如需放行,需通过 ipBlock 方式显式声明 Pod IP。​
  • 若安装 VKE agent-sandbox 组件时一并启用 E2B 能力,则建议将该组件以 VCI 方式部署。​
  • 对于需要进行网络隔离的 Pod,除了设置 NetworkPolicy 外,还需要在 Pod Annotation 中添加vci.volcengine.com/network-policy-enabled: "true",表示启用网络隔离能力,否则隔离策略不会生效。​
使用方式​
您可以通过 SandboxTemplate Managed 和直接创建 NetworkPolicy 两种方式建立网络隔离策略。两种网络隔离方式的详细介绍如下所示。​
​
SandboxTemplate Managed(推荐)
直接创建 NetworkPolicy
​
SandboxTemplate(API 版本:extensions.agents.x-k8s.io/v1alpha1)是定义 Sandbox 实例模板的资源。沙箱控制器(Sandbox Controller)根据 SandboxTemplate 批量或动态创建沙箱时,会自动在底层生成对应的原生 Kubernetes NetworkPolicy 资源。​
在 SandboxTemplate 中通过networkPolicyManagement字段和networkPolicy字段控制 NetworkPolicy 的管理模式。​
​
参数​
是否必选​
说明​
networkPolicyManagement​
本场景必选​
NetworkPolicy 的管理模式,取值如下:​
  • Managed:Controller 自动管理 NetworkPolicy 的创建与更新。​
  • Unmanaged:Controller 不创建也不管理 NetworkPolicy,由外部系统接管。​
networkPolicy​
本场景可选​
定义入站和出站规则,其完全复用了标准 Kubernetes NetworkPolicy 的语义和结构。主要包含以下两个控制方向:​
  • spec.networkPolicy.ingress:取值为 Object 类型,表示入站规则,限制哪些外部资源可以连接、访问沙箱,例如只允许特定的 Agent 路由 Pod 访问沙箱的特定端口。​
  • spec.networkPolicy.egress:取值为 Object 类型,表示出站规则,限制沙箱内的代码可以访问哪些外部网络。通常用于阻止沙箱访问集群内其他服务,或者建立公网访问白名单。​
注意​
  • 启用networkPolicyManagement但是未设置networkPolicy时,SandboxController 自动生成默认 NetworkPolicy(仅包含sandbox-router和data-plane的 Ingress 准入,Egress 不限行)。生产场景不建议使用此方式。​
  • Sandbox Controller 生成的 NetworkPolicy 策略类型是 Ingress 和 Egress 双边的。若只设置一侧规则,另一侧默认全拒绝(若期望放通,可将对应方向 (Ingress/Egress) 取值设置为- {},表示该方向全放通。​
  • 请勿手动修改自动生成的底层策略,因为控制器的调谐机制(Reconcile)会将其覆盖重置。​
​
​
两种方式对比如下表所示。​
​
对比维度​
SandboxTemplate Managed(推荐)​
直接创建 NetworkPolicy​
策略生命周期​
随 SandboxTemplate 自动同步。​
需手动维护,易产生孤立策略。​
podSelector 维护​
Sandbox Controller 自动管理,无需关心内部标签。​
需手动匹配 Sandbox 标签,易写错。​
默认入口规则​
自动生成sandbox-router、data-plane入口。​
需手动逐条添加,易遗漏。​
被覆盖风险​
无(Controller 以 SandboxTemplate 为准)。​
Managed 模式下手动修改有被 Controller 覆盖的风险。​
适用场景​
通过 SandboxClaim 方式申领 Sandbox 的标准用法。​
​
  • 直接创建 Sandbox,不依赖 SandboxTemplate。​
  • 集群维度统一维护和管理工作负载,不区分工作负载类型。​
​
前提条件​
  • 集群中已安装 vci-virtual-kubelet 组件。详细操作,请参见 vci-virtual-kubelet。​
  • 集群中已安装 agent-sandbox 组件。详细操作,请参见 agent-sandbox。​
操作步骤​
说明​
以下操作步骤以通过 SandboxTemplate Managed 方式自定义 NetworkPolicy 为例。​
步骤一:(可选)创建以 VCI 方式部署的工作负载​
创建用于测试访问连通性的 VCI Pod,若已有相关 VCI Pod,可跳过本步骤。​
  1. 使用 kubectl 连接目标 VCI 业务集群。详情请参见 连接集群。​
  1. 创建工作负载的 YAML 文件。示例文件vci-deployment-demo.yaml代码如下:​
  • ​
    apiVersion: apps/v1​
    kind: Deployment​
    metadata:​
    name: vci-deployment-demo # 无状态负载名称。​
    namespace: default # 无状态负载所在的命名空间。​
    spec:​
    replicas: 1 # 无状态负载的副本(Pod)数量。​
    selector:​
    matchLabels:​
    app: vci-deployment-demo​
    template:​
    metadata:​
    annotations:​
    vke.volcengine.com/burst-to-vci: enforce # 强制使用 VCI。​
    vci.vke.volcengine.com/preferred-instance-family: vci.u1 #指定 VCI 的规格族。​
    labels:​
    app: vci-deployment-demo​
    spec:​
    containers:​
    - name: vci-demo # 容器名称。​
    image: doc-cn-beijing.cr.volces.com/vke/nginx-demo:v1.0 # 容器镜像的地址和版本,请配置为您自己的镜像地址。若使用公网镜像,请确保您的集群能够访问公网​
    ports:​
    - containerPort: 80 # 容器开放的端口号。​
    resources:​
    requests: # 指定容器的 vCPU 和内存。 ​
    cpu: "500m" ​
    memory: "1024Mi"​
    limits:​
    cpu: "1" ​
    memory: "2048Mi"​
    ​
  1. 执行以下命令,创建工作负载。​
  • ​
    kubectl apply -f vci-deployment-demo.yaml​
    ​
  1. 执行以下命令,获取 Pod IP 和 Pod 名称,以备后续连通测试中使用。​
  • ​
    # 将 vci-deployment-demo 替换为实际 Deployment 名称。​
    kubectl get pods -o wide |grep ^vci-deployment-demo​
    ​
  • 预期返回结果如下:​
  • ​
    vci-deployment-demo-**** 1/1 Running 0 2d3h 10.xx.xx.xx node-1​
    ​
步骤二:使用 NetworkPolicy​
下文提供三个使用 NetworkPolicy 的场景示例,覆盖最常见的入站白名单与出站白名单组合,可按业务需要选用:​
  • 场景一:按应用标签放行入站访问,适用于已知调用方具备稳定标签的场景。​
  • 场景二:按来源 IP 放行入站访问,适用于调用方无法通过标签稳定选中、但 IP 可控的场景。​
  • 场景三:按应用标签或 IP 放行出站访问,适用于需要限制沙箱对外访问范围的场景。​
​
场景一
场景二
场景三
​
本场景通过入站规则,仅允许特定标签对应的 Pod 访问 Sandbox,其他来源一律拒绝。​
  1. 创建 SandboxTemplate,并在 podTemplate 的 Annotations 中通过vci.volcengine.com/network-policy-enabled开启 NetworkPolicy。示例 SandboxTemplate YAML 文件sandbox-template-demo1.yaml内容如下所示。​
  • ​
    apiVersion: extensions.agents.x-k8s.io/v1alpha1​
    kind: SandboxTemplate​
    metadata:​
    name: sandbox-template-demo1 # SandboxTemplate 名称。​
    namespace: default # SandboxTemplate 所属命名空间。​
    spec:​
    networkPolicyManagement: Managed # NetworkPolicy 的管理模式,取值:Managed(Controller 托管 NetworkPolicy 的创建与更新)、Unmanaged(外部系统接管 NetworkPolicy)。​
    networkPolicy:​
    ingress:​
    - from: ​
    - podSelector: # 通过指定标签放行步骤一中创建的 VCI Pod 的访问。​
    matchLabels:​
    app: vci-deployment-demo​
    egress:​
    - {}​
    podTemplate:​
    metadata:​
    annotations:​
    vke.volcengine.com/burst-to-vci: enforce # 强制调度到 VCI。​
    vci.volcengine.com/network-policy-enabled: "true" # 是否开启 VCI NetworkPolicy 功能。取值:true(开启)、false(不开启)。​
    labels:​
    app: sandbox-demo​
    spec:​
    containers:​
    - image: doc-cn-beijing.cr.volces.com/vke/nginx-demo:v1.0 # 容器镜像的地址和版本,请配置为您自己的镜像地址。若使用公网镜像,请确保您的集群能够访问公网。​
    imagePullPolicy: IfNotPresent​
    name: sandbox​
    ports:​
    - containerPort: 80​
    dnsPolicy: ClusterFirst​
    restartPolicy: Always​
    ​
  1. 执行以下命令,创建 SandboxTemplate。​
  • ​
    kubectl create -f sandbox-template-demo1.yaml​
    ​
  1. 创建 SandboxClaim 的 YAML 文件。示例 YAML 文件sandbox-claim-demo1.yaml内容如下所示。​
  • ​
    apiVersion: extensions.agents.x-k8s.io/v1alpha1​
    kind: SandboxClaim​
    metadata:​
    name: sandbox-claim-demo1 # SandboxClaim 名称。​
    namespace: default # SandboxClaim 所属命名空间。​
    spec:​
    sandboxTemplateRef:​
    name: sandbox-template-demo1 # 申领沙箱所使用的 SandboxTemplate 名称。​
    ​
  1. 执行以下命令,创建 SandboxClaim。​
  • ​
    kubectl apply -f sandbox-claim-demo1.yaml​
    ​
  1. 执行以下命令,从 SandboxClaim 资源的status.sandbox.podIPs中获取 Sandbox Pod 的 IP。​
  • ​
    # 将 sandbox-claim-demo1 替换为实际的 SandboxClaim 名称。​
    kubectl get sandboxclaim sandbox-claim-demo1 -oyaml​
    ​
  1. 从放行的 Pod 访问 Sandbox Pod,验证连通性。​
  • ​
    # 将 vci-deployment-demo-**** 替换为实际的 Pod 名称。​
    kubectl exec -it vci-deployment-demo-**** -- /bin/sh​
    ​
    # 将 xx.xx.xx.xx 替换为上一步获取的 Sandbox Pod 的 IP。​
    curl --connect-timeout 5 --max-time 10 xx.xx.xx.xx:80 ​
    ​
  • 预期输出如下所示:​
  • ​
    <!DOCTYPE html>​
    <html>​
    <head>​
    <title>Welcome to nginx!</title>​
    <style>​
    html { color-scheme: light dark; }​
    body { width: 35em; margin: 0 auto;​
    font-family: Tahoma, Verdana, Arial, sans-serif; }​
    </style>​
    </head>​
    <body>​
    <h1>Welcome to nginx!</h1>​
    <p>If you see this page, the nginx web server is successfully installed and​
    working. Further configuration is required.</p>​
    ​
    <p>For online documentation and support please refer to​
    <a href="http://nginx.org/">nginx.org</a>.<br/>​
    Commercial support is available at​
    <a href="http://nginx.com/">nginx.com</a>.</p>​
    ​
    <p><em>Thank you for using nginx.</em></p>​
    </body>​
    </html>​
    ​
  1. 创建未放行的示例 Pod 并对目标 Sandbox 发起入站请求。​
  • ​
    kubectl run -it --rm --image=doc-cn-beijing.cr.volces.com/vke/nginx-demo:v1.0 nginx-tmp -- /bin/sh​
    ​
    # 将 xx.xx.xx.xx 替换为前面获取的 Sandbox Pod 的 IP。​
    curl --connect-timeout 5 --max-time 10 xx.xx.xx.xx:80​
    ​
  • 预期输出如下所示:​
  • ​
    curl: (28) Connection timed out after 5000 milliseconds​
    ​
​
最近更新时间:2026.10.23 19:26:52
这个页面对您有帮助吗?
有用
有用
无用
无用