- 文档首页
容器服务
弹性容器实例 VCI
用户指南
网络
使用 NetworkPolicy 实现 VCI Pod 网络访问控制
网络
使用 NetworkPolicy 实现 VCI Pod 网络访问控制
使用 NetworkPolicy 实现 VCI Pod 网络访问控制
Kubernetes 网络策略(NetworkPolicy)提供基于策略的网络控制。本文介绍 VCI 场景下使用 NetworkPolicy 实现 Pod 网络访问控制相关方法。
由于 VCI 采用 Nodeless(无节点)架构,Pod 不运行在您可见和可管理的节点上,传统依赖节点 DaemonSet(如 calico-node)实现的 NetworkPolicy 方案在 VCI 场景下无法直接使用。VCI NetworkPolicy 基于中心化控制面与 Cello/Cilium 的能力,在 Pod 网络层面直接注入并执行访问策略,为您提供以下能力:
- 对齐 Kubernetes 标准:完全兼容networking.k8s.io/v1版本的 NetworkPolicy 资源,支持从其他 Kubernetes 环境零成本迁移已有策略。
- 适配 Nodeless 架构:策略随 Pod 生命周期动态生效,无需您在 Pod 或节点上部署额外的 Agent。
- 支持 L3/L4 访问控制:支持基于 Pod 标签、命名空间标签以及 CIDR 的 Ingress、Egress 规则,可指定 TCP/UDP 端口和端口范围。
- VCI NetworkPolicy 支持的能力说明如下。
- Ingress 与 Egress 双向策略,支持通过podSelector、namespaceSelector、ipBlock(CIDR)选择流量来源与目的。
- 基于 TCP、UDP 协议的端口与端口范围匹配。
- 在同一策略中组合多个from/to规则,同一规则中同时指定ipBlock、podSelector、namespaceSelector,规则之间为“或”的关系。
- VCI NetworkPolicy 与 VCI 业务中的 VPC 安全组、网络 ACL 属于不同层级的访问控制,流量需依次通过多层检查,三者相互配合、不能互相替代:
- NetworkPolicy:作用于 VCI Pod 级,贴近应用语义,动态跟随 VCI Pod 生命周期。
- 安全组:作用于 VCI 实例(ENI)级,粒度到实例。
- Web 应用防护(WAF)、边界防火墙(Cloud Firewall)等专项能力,建议使用对应的专业云安全产品,NetworkPolicy 聚焦集群内部的 L3/L4 流量。
- VCI NetworkPolicy 与 Kubernetes 社区行为保持一致,采用以下默认行为:
- Pod 在某方向 (Ingress/Egress) 无策略选中时,该方向流量全放行。
- Pod 在某方向 (Ingress/Egress) 一旦有策略选中并定义该方向时,仅放行明确符合“allow”规则的流量,其余全部拒绝。
步骤一:在工作负载中开启 NetworkPolicy
需要在您的以 VCI 方式部署的工作负载中通过 Pod Annotation 开启 VCI NetworkPolicy 功能。
注意
VCI NetworkPolicy 仅支持完全使用 VCI 方式部署的工作负载,不支持 VCI 和 ECS 混部场景。
创建或更新以 弹性容器实例 VCI 方式部署的工作负载时,在 高级配置 步骤,添加 实例注解:vci.volcengine.com/network-policy-enabled: "true"。详细操作,请参见 创建工作负载、管理工作负载。
创建或更新完全使用 VCI 方式部署(vke.volcengine.com/burst-to-vci: enforce)的工作负载时,添加 Pod Annotation:vci.volcengine.com/network-policy-enabled: "true"。下文以 Deployment YAML 文件为例,更多工作负载类型及 YAML 文件的创建/更新方法,请参见 创建工作负载、管理工作负载。
完整 YAML 文件示例如下所示。
vke.volcengine.com/burst-to-vci: enforce
vke.volcengine.com/preferred-subnet-ids: subnet-3tispp1nai****
vci.vke.volcengine.com/preferred-instance-family: vci.u1
vci.volcengine.com/network-policy-enabled: "true"
image: doc-cn-beijing.cr.volces.com/vke/nginx-demo:v1.0
步骤二:编写 NetworkPolicy YAML
以下示例以 AI Agent 生产环境命名空间 ai-agent-prod 为例,演示常见策略组合。请根据实际业务标签,替换app等选择器取值。示例中的 IP 地址均为占位符,请替换为您真实的目标 CIDR。
场景一:默认拒绝所有流量
场景二:多 Agent 通信
场景三:限制访问外部服务
场景四:隔离不同环境数据
在开始定义精细化策略之前,作为零信任(一种中安全架构)基线,可以先将工作负载置于一个隔离的环境中,保证业务安全性。
示例策略如下,该策略选中 ai-agent-prod 命名空间下所有 Pod,声明了 Ingress 和 Egress 两个方向但不提供任何放通规则,因此该命名空间下所有 Pod 的出入流量都会被拒绝。
apiVersion: networking.k8s.io/v1
namespace: ai-agent-prod
多 Agent 之间不希望直接互访的场景,可以通过 NetworkPolicy 策略配置中控服务,限制 Agent 间的直接访问。
示例策略如下,该策略假设analyzer-agent、retriever-agent两组 Agent,通过control-center中控服务交互。策略精确放通两组 Agent 访问control-center的 8080 端口,其他任何 Pod 都无法访问control-center。配合场景一的默认拒绝策略,两个 Agent 之间也无法直接通信。
apiVersion: networking.k8s.io/v1
name: allow-access-to-control-center
namespace: ai-agent-prod
AI Agent 需要访问外部的 LLM Endpoint、向量数据库等场景中,为防止 Agent 访问恶意网站或泄露数据,可以通过配置 NetworkPolicy 策略限制其出向流量。
示例策略如下,该策略限制 AI Agent:analyzer-agent的出向流量,仅允许访问内部中控服务control-center、DNS、指定的外部 LLM Endpoint 和向量数据库,其他出向流量一律拒绝。
注意
DNS 相关的 Egress 规则在几乎所有 Egress 白名单场景中都是必需的,遗漏该规则会导致域名解析失败,进而使业务连接异常。
apiVersion: networking.k8s.io/v1
name: allow-egress-for-analyzer-agents
namespace: ai-agent-prod
NetworkPolicy 是白名单模型,通过只允许放通来自白名单的命名空间策略,隐式拒绝不在白名单的其他所有命名空间的访问,实现严格数据隔离。
示例策略如下,该策略仅放通ai-agent-prod命名空间内的 Pod 访问生产环境数据prod-database,跨命名空间的流量将被自动拒绝。
apiVersion: networking.k8s.io/v1
name: deny-staging-access-to-prod-db
namespace: ai-agent-prod
kubernetes.io/metadata.name: ai-agent-prod
- 使用 kubectl 连接目标 VCI 业务集群。详情请参见 连接集群。
kubectl apply -f <policy.yaml> -n <namespace>
- 下发后,策略会在集群中对已添加 Pod Annotation:vci.volcengine.com/network-policy-enabled: "true"的 VCI Pod 生效;新调度到 VCI 的 Pod 会在网络初始化阶段自动匹配已存在的策略规则。
kubectl get networkpolicy -n <namespace>
- 预期返回结果如下,返回结果中应包含目标策略名称,且POD-SELECTOR与您期望选中的目标 Pod 标签一致。
allow-access-to-backend app=backend 2m
kubectl describe networkpolicy <policy-name> -n <namespace>
- 预期返回结果如下,返回结果中应包含PodSelector、允许的 Ingress/Egress 流量、流量来源或目的选择器,以及端口信息。
Name: allow-access-to-backend
Namespace: ai-agent-prod
PodSelector: app=backend
PodSelector: app=frontend
kubectl get pods -l <POD-SELECTOR> -n <namespace> -o wide --show-labels
NAME READY STATUS RESTARTS AGE IP NODE LABELS
backend-0 1/1 Running 0 10m 10.XX.XX.12 <none> app=backend
- 执行以下命令,验证被选中的 Pod 是否具备 VCI NetworkPolicy Annotation。
kubectl describe networkpolicy <policy-name> -n <namespace>
kubectl get pod <pod-name> -n <namespace> \
-o jsonpath='{.metadata.annotations["vci.volcengine.com/network-policy-enabled"]}{"\n"}'
- 从策略预期允许的来源 Pod 发起访问,确认是否连接成功。
kubectl exec -n <namespace> frontend-0 -- \
curl -m 5 -s -o /dev/null -w "%{http_code}\n" \
http://<allowed-source-pod-ip>:8080/healthz
- 从策略预期拒绝的来源 Pod 发起访问,确认连接超时或被拒绝。
kubectl exec -n <namespace> other-0 -- \
http://<deny-source-pod-ip>:8080/healthz
- 预期返回结果应表现为连接超时、无响应或连接被拒绝。
- 执行以下命令,重建策略。 策略会在集群中重新计算并作用到受影响的 Pod。
注意
变更“默认拒绝”类基线策略时建议先在测试环境验证,避免误拦截线上流量。
kubectl apply -f <policy.yaml> -n <namespace>
注意
- 删除策略后,被该策略限制的流量可能恢复为放行状态。
- 如果存在其他策略仍选中同一 Pod,则最终效果以所有策略合并后的允许规则为准。请确认删除操作不会扩大到生产环境流量访问。
NetworkPolicy 是 Kubernetes 标准资源,资源删除操作如下:
- 删除命名空间会自动清理其下所有 NetworkPolicy 资源。
- 使用以下命令,可以删除单条 NetworkPolicy 资源。
kubectl delete networkpolicy <name> -n <namespace>
最近更新时间:2026.08.25 11:09:11