解析 Kubernetes NetworkPolicy:保护您的集群流量

在这里插入图片描述

Kubernetes 网络策略

Kubernetes中的网络策略(NetworkPolicies)允许控制特定应用程序在TCP、UDP协议下的IP地址或端口级别的流量。这些策略是以应用程序为中心的,用于指定如何允许Pod通过网络与其他网络“实体”(即不同的端点和服务)进行通信。网络策略主要适用于有Pod参与的连接。

Pod通信实体标识符

Pod可以与以下三种实体之一通信:

  1. Pod(注意:Pod无法阻止对自身的访问)
  2. 命名空间
  3. IP块(即使Pod或节点的IP地址发生变化,运行Pod的节点的流量始终被允许)

在定义基于Pod或命名空间的网络策略时,可以使用选择器来指定允许哪些流量进出选定的Pod。同时,基于IP的网络策略通过CIDR范围定义。

先决条件

网络策略由网络插件实现。要使用网络策略,必须采用支持NetworkPolicy的网络解决方案。如果没有实现NetworkPolicy的控制器,创建NetworkPolicy资源将不起作用。

两种Pod隔离

Pod隔离有两种类型:出口隔离和入口隔离。它们涉及允许哪些连接:

  1. 出口隔离

    • 默认:Pod允许所有出站连接。
    • 策略:如果有任何NetworkPolicy选择Pod并在其policyTypes中包含“Egress”,则Pod被隔离为出口。此时,仅允许符合出口策略规则的连接。
  2. 入口隔离

    • 默认:Pod允许所有入站连接。
    • 策略:如果有任何NetworkPolicy选择Pod并在其policyTypes中包含“Ingress”,则Pod被隔离为入口。此时,仅允许符合入口策略规则的连接。

网络策略是叠加的。如果任何策略适用于某个方向,则该方向上的允许连接是所有适用策略允许连接的并集。

NetworkPolicy资源

一个示例NetworkPolicy如下所示:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: example-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: database
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 192.168.1.0/24
    - namespaceSelector:
        matchLabels:
          env: production
    - podSelector:
        matchLabels:
          app: web
    ports:
    - protocol: TCP
      port: 3306
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 8080

解释

  • 必填字段:包括apiVersion、kind和metadata。
  • spec:包含定义特定网络策略的所有信息。
  • podSelector:选择应用策略的Pod。此示例选择标签为role=database的Pod。
  • policyTypes:指示策略适用于入口、出口或两者。
  • ingress:定义允许进入Pod的流量规则。
  • egress:定义允许Pod外出的流量规则。

上述示例策略:

  • 隔离了default命名空间中标签为role=database的Pod的入口和出口流量。
  • 允许default命名空间中标签为role=database的Pod接受来自以下三种来源的TCP端口3306的流量:
    1. IP块192.168.1.0/24
    2. 标签为env=production的命名空间中的所有Pod
    3. 标签为app=web的Pod
  • 允许default命名空间中标签为role=database的Pod向IP块10.0.0.0/24的TCP端口8080发送流量。
网络流量过滤

NetworkPolicy主要用于控制第4层连接(TCP、UDP和SCTP)。对于其他协议(如ARP或ICMP),行为可能因网络插件而异。

默认策略

  • 默认情况下,命名空间中不存在任何策略时,允许所有入口和出口流量。
  • 可以创建默认拒绝所有入口或出口流量的策略。

示例

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-ingress
  namespace: default
spec:
  podSelector: {}
  policyTypes:
  - Ingress

该策略默认拒绝default命名空间中所有Pod的所有入口流量。

网络策略高级功能
  • 按标签选择多个命名空间
    可以通过命名空间标签选择多个命名空间中的Pod:

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: egress-namespaces
      namespace: default
    spec:
      podSelector:
        matchLabels:
          app: myapp
      policyTypes:
      - Egress
      egress:
      - to:
        - namespaceSelector:
            matchExpressions:
            - key: namespace
              operator: In
              values: ["frontend", "backend"]
    
  • 按名称选择命名空间
    Kubernetes控制平面为所有命名空间设置不可变标签kubernetes.io/metadata.name,可通过此标签选择特定命名空间。

通过上述方法和策略,Kubernetes网络策略可以有效地管理和控制Pod之间及其与外部世界的网络流量,确保集群内的安全和高效通信。

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值