You need to enable JavaScript to run this app.
导航

使用 NetworkPolicy 进行网络访问控制

最近更新时间2024.03.01 14:07:17

首次发布时间2023.08.03 18:46:05

Kubernetes 网络策略(NetworkPolicy)提供基于策略的网络控制。您可以通过 NetworkPolicy 从 IP 地址或网络端口层面控制 Pod 级别的网络流量。本文介绍 NetworkPolicy 和配置方法和使用场景。

说明

使用限制

  • 仅支持在 VPC-CNI 网络模型的集群中使用。
  • VPC-CNI 集群中的 vpc-cni 组件版本需要 v1.6.4 及以上版本。

    说明

    邀测·申请试用】:vpc-cni 组件的 v1.6.4 及以上版本目前也处于 邀测 阶段,请一并提交申请。

  • 暂不支持在弹性容器实例(VCI)场景中使用。
  • 使用 NetworkPolicy 控制网络流量时,对集群规模有如下限制:
    限制项最大支持规模
    Pod 数量10000
    Workload 数量10000

前提条件

  • 已创建 VPC-CNI 网络模型的集群。具体操作,请参见 创建集群
  • VPC-CNI 集群中的 vpc-cni 组件版本已满足使用限制。

步骤一:开启 NetworkPolicy

  1. 登录 容器服务控制台
  2. 在左侧导航栏中选择 集群,单击目标 VPC-CNI 集群。
  3. 在集群管理页面的左侧导航栏中,选择 组件管理
  4. 网络 页签找到 vpc-cni 组件,单击 配置,开启 NetworkPolicy 功能。

    说明

    开启(或关闭)NetworkPolicy 功能后,需要近 1 分钟时间生效。

    alt

步骤二:使用 NetworkPolicy

  1. 在集群管理页面的左侧导航栏中,单击 工作负载 > 对象浏览器
  2. 单击 使用 Yaml 创建 ,创建自定义资源。
    参数描述
    类型在下拉菜单中选择类型,本文中选择 NetworkPolicy
    Yaml参考本文下方 配置示例,输入 YAML 内容。
  3. 单击 确定,创建完 NetworkPolicy 资源。
  4. (可选)在 API Group 分类下,找到 networking.k8s.io,单击名称,查看 NetworkPolicy 资源详情。
    alt

配置示例

下文列出使用集群 NetworkPolicy 能力时,常见的几种配置示例:

  • default 命名空间(Namespace)下的 Pod 可互相访问,但不能被其他命名空间的 Pod 访问。
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: demo-1  # NetworkPolicy 资源名称。
      namespace: default  # Pod 所属命名空间。
    spec:
      ingress:
      - from:
        - podSelector: {}
      podSelector: {}
      policyTypes:
      - Ingress
    
  • default 命名空间下的 Pod 不能被任何 Pod 访问。
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: demo-2  # NetworkPolicy 资源名称。
      namespace: default  # Pod 所属命名空间。
    spec:
      podSelector: {}
      policyTypes:
      - Ingress
    
  • default 命名空间下的 Pod,只能被标签为name: demo-namespace的命名空间下的 Pod,通过 TCP 协议的 6379 端口访问。
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: demo-3  # NetworkPolicy 资源名称。
      namespace: default  # Pod 所属命名空间。
    spec:
      ingress:
      - from:
        - namespaceSelector:  # 命名空间选择器。
            matchLabels:  # 命名空间标签匹配。
              name: demo-namespace
        ports:  # 指定端口。
        - protocol: TCP  # 端口协议。
          port: 6379  # 端口号。
      podSelector: {}
      policyTypes:
      - Ingress
    
  • default 命名空间下的 Pod,只能访问 CIDR 为172.16.0.0/16、协议为 TCP、端口号为 8080 的网络端口,不能访问其他网络端口。
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: demo-4  # NetworkPolicy 资源名称。
      namespace: default  # Pod 所属命名空间。
    spec:
      egress:
      - to:
        - ipBlock:
            cidr: 172.16.0.0/16  # Pod CIDR。
        ports:  # 指定端口。
        - protocol: TCP  # 端口协议。
          port: 8080  # 端口号。
      podSelector: {}
      policyTypes:
      - Egress
    
  • default 命名空间下的 Pod,通过 TCP 协议的 80 端口,只能被 CIDR 为172.16.0.0/16的网络端口访问,不能被其他任何网络端口访问。
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: demo-5  # NetworkPolicy 资源名称。
      namespace: default  # Pod 所属命名空间。
    spec:
      ingress:
      - from:
        - ipBlock:
            cidr: 172.16.0.0/16  # Pod CIDR。
        ports:  # 指定端口。
        - protocol: TCP  # 端口协议。
          port: 80  # 端口号。
      podSelector: {}
      policyTypes:
      - Ingress
    
  • default 命名空间下 Pod 的出流量,可以访问带app: tesyallowall标签的命名空间下的 Pod。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: demo-6  # NetworkPolicy 资源名称。
  namespace: default  # Pod 所属命名空间。
spec:
  egress:
  - to:
    - namespaceSelector:  # 命名空间标签匹配。
        matchLabels:
          app: testallowall
  podSelector: {}
  policyTypes:
  - Egress