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

容器服务

复制全文
下载 pdf
网络
使用 NetworkPolicy 实现 VCI Pod 网络访问控制
复制全文
下载 pdf
使用 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 端口和端口范围。
关于 Kubernetes NetworkPolicy 的基础概念、字段含义与 YAML 完整语法,请参见 Kubernetes 社区文档
使用说明
  • VCI NetworkPolicy 支持的能力说明如下。
  • Ingress 与 Egress 双向策略,支持通过podSelectornamespaceSelectoripBlock(CIDR)选择流量来源与目的。
  • 基于 TCP、UDP 协议的端口与端口范围匹配。
  • 在同一策略中组合多个from/to规则,同一规则中同时指定ipBlockpodSelectornamespaceSelector,规则之间为“或”的关系。
  • VCI NetworkPolicy 与 VCI 业务中的 VPC 安全组、网络 ACL 属于不同层级的访问控制,流量需依次通过多层检查,三者相互配合、不能互相替代:
  • NetworkPolicy:作用于 VCI Pod 级,贴近应用语义,动态跟随 VCI Pod 生命周期。
  • 安全组:作用于 VCI 实例(ENI)级,粒度到实例。
  • 网络 ACL:作用于子网级,粒度最粗。
  • Web 应用防护(WAF)、边界防火墙(Cloud Firewall)等专项能力,建议使用对应的专业云安全产品,NetworkPolicy 聚焦集群内部的 L3/L4 流量。
  • VCI NetworkPolicy 与 Kubernetes 社区行为保持一致,采用以下默认行为:
  • Pod 在某方向 (Ingress/Egress) 无策略选中时,该方向流量全放行。
  • Pod 在某方向 (Ingress/Egress) 一旦有策略选中并定义该方向时,仅放行明确符合“allow”规则的流量,其余全部拒绝。
前提条件
  • 集群中已安装 vci-virtual-kubelet 组件。详细操作,请参见 vci-virtual-kubelet
操作步骤
步骤一:在工作负载中开启 NetworkPolicy
需要在您的以 VCI 方式部署的工作负载中通过 Pod Annotation 开启 VCI NetworkPolicy 功能。
注意
VCI NetworkPolicy 仅支持完全使用 VCI 方式部署的工作负载,不支持 VCI 和 ECS 混部场景。
控制台配置
YAML 配置
创建或更新以 弹性容器实例 VCI 方式部署的工作负载时,在 高级配置 步骤,添加 实例注解vci.volcengine.com/network-policy-enabled: "true"。详细操作,请参见 创建工作负载管理工作负载
步骤二:编写 NetworkPolicy YAML
按业务需求编写标准的 Kubernetes NetworkPolicy YAML 文件,字段完整语义与 YAML 语法请参见 Kubernetes NetworkPolicy 官方文档
以下示例以 AI Agent 生产环境命名空间 ai-agent-prod 为例,演示常见策略组合。请根据实际业务标签,替换app等选择器取值。示例中的 IP 地址均为占位符,请替换为您真实的目标 CIDR。
场景一:默认拒绝所有流量
场景二:多 Agent 通信
场景三:限制访问外部服务
场景四:隔离不同环境数据
在开始定义精细化策略之前,作为零信任(一种中安全架构)基线,可以先将工作负载置于一个隔离的环境中,保证业务安全性。
示例策略如下,该策略选中 ai-agent-prod 命名空间下所有 Pod,声明了 Ingress 和 Egress 两个方向但不提供任何放通规则,因此该命名空间下所有 Pod 的出入流量都会被拒绝。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all # NetworkPolicy 对象名称。
namespace: ai-agent-prod # NetworkPolicy 策略生效的目标命名空间。
spec:
podSelector: {} # Pod 标签选择器,{} 表示目标命名空间下的所有 Pod。
policyTypes: # 策略模式,本示例定义了 Ingress 和 Egress 两种策略类型,但没有提供任何 allow 规则。因此根据 VCI NetworkPolicy 默认行为,此策略会拒绝该命名空间中所有 Pod 的所有出入流量。
- Ingress
- Egress
步骤三:下发策略到集群
  1. 使用 kubectl 连接目标 VCI 业务集群。详情请参见 连接集群
  1. 执行以下命令,将策略下发到目标命名空间。
  • kubectl apply -f <policy.yaml> -n <namespace>
    #将 <policy.yaml> 替换为您步骤一编写的 YAML 文件名称,将 <namespace> 替换为目标命名空间名称。
  • 下发后,策略会在集群中对已添加 Pod Annotation:vci.volcengine.com/network-policy-enabled: "true"的 VCI Pod 生效;新调度到 VCI 的 Pod 会在网络初始化阶段自动匹配已存在的策略规则。
步骤四:验证策略生效
  1. 执行以下命令,确认策略是否已创建。
  • kubectl get networkpolicy -n <namespace>
    #将 <namespace> 替换为目标命名空间名称。
  • 预期返回结果如下,返回结果中应包含目标策略名称,且POD-SELECTOR与您期望选中的目标 Pod 标签一致。
  • NAME POD-SELECTOR AGE
    allow-access-to-backend app=backend 2m
  1. 执行以下命令,确认规则是否符合预期。
  • kubectl describe networkpolicy <policy-name> -n <namespace>
    #将 <policy-name> 替换为您步骤一编写的 YAML 文件中 NetworkPolicy 对象名称,将 <namespace> 替换为目标命名空间名称。
  • 预期返回结果如下,返回结果中应包含PodSelector、允许的 Ingress/Egress 流量、流量来源或目的选择器,以及端口信息。
  • Name: allow-access-to-backend
    Namespace: ai-agent-prod
    PodSelector: app=backend
    Policy Types: Ingress
    Ingress:
    To Port: 8080/TCP
    From:
    PodSelector: app=frontend
  1. 执行以下命令,确认规则选中的 Pod 有哪些。
  • kubectl get pods -l <POD-SELECTOR> -n <namespace> -o wide --show-labels
    #将 <POD-SELECTOR> 替换为实际 Pod 标签,将 <namespace> 替换为目标命名空间名称。
  • 预期返回结果如下:
  • NAME READY STATUS RESTARTS AGE IP NODE LABELS
    backend-0 1/1 Running 0 10m 10.XX.XX.12 <none> app=backend
  1. 执行以下命令,验证被选中的 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-name> 替换为实际 Pod 名称,将 <namespace> 替换为目标命名空间名称。
  • 预期返回true字段。
  1. 从策略预期允许的来源 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
    #将 <namespace> 替换为目标命名空间名称。<allowed-source-pod-ip> 替换为允许的来源 Pod IP。
  • 预期返回200,则表示访问成功。
  1. 从策略预期拒绝的来源 Pod 发起访问,确认连接超时或被拒绝。
  • kubectl exec -n <namespace> other-0 -- \
    curl -m 5 -v \
    http://<deny-source-pod-ip>:8080/healthz
    #将 <namespace> 替换为目标命名空间名称。<deny-source-pod-ip> 替换为会被拒绝的来源 Pod IP。
  • 预期返回结果应表现为连接超时、无响应或连接被拒绝。
后续操作
变更策略
  1. 直接更新对应的 YAML。
  1. 执行以下命令,重建策略。 策略会在集群中重新计算并作用到受影响的 Pod。
注意
变更“默认拒绝”类基线策略时建议先在测试环境验证,避免误拦截线上流量。
  • kubectl apply -f <policy.yaml> -n <namespace>
    #将 <policy.yaml> 替换为策略 YAML 文件名称,<namespace> 替换为策略生效的命名空间名称。
删除策略
注意
  • 删除策略后,被该策略限制的流量可能恢复为放行状态。
  • 如果存在其他策略仍选中同一 Pod,则最终效果以所有策略合并后的允许规则为准。请确认删除操作不会扩大到生产环境流量访问。
NetworkPolicy 是 Kubernetes 标准资源,资源删除操作如下:
  • 删除命名空间会自动清理其下所有 NetworkPolicy 资源。
  • 使用以下命令,可以删除单条 NetworkPolicy 资源。
  • kubectl delete networkpolicy <name> -n <namespace>
    #将 <name> 替换为 NetworkPolicy 资源名称,<namespace> 替换为策略生效的命名空间名称。
最近更新时间:2026.08.25 11:09:11
这个页面对您有帮助吗?
有用
有用
无用
无用