Kubernetes学习之NetworkPolicy

应用场景

在IP地址或端口级别控制流量

限制pod可以与其他哪些pod通信,来确保pod之间的网络安全

控制粒度

  • 是否允许其他pod(例外:自身pod不能组织自身的访问)
  • 是否允许其他命令空间
  • IP块

可使用选择器:Labels and Selectors | Kubernetes

先决条件

k8s使用的网络插件必须支持NetworkPolicy

隔离类型

要允许从源 pod 到目标 pod 的连接,源 pod 上的出口策略和目标 pod 上的入口策略都需要允许连接。如果任何一方不允许连接,则不会发生。

出口隔离

默认情况下,Pod的出口是非隔离的,允许所有出站连接。

policyTypes:
- Egress

入口隔离

policyTypes:
- Ingress

样例

样例一

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  # 使用标签来选择networkpolicy作用的pod
  # 空的标签选择器匹配命名空间中的所有pod
  podSelector:
    matchLabels:
      role: db
  # 若未指定,默认是ingress    
  policyTypes:
    - Ingress
    - Egress
  ingress:
    - from:
        # ip块选择
        - ipBlock:
            cidr: 172.17.0.0/16
            except:
              - 172.17.1.0/24
        # 命名空间选择
        - namespaceSelector:
            matchLabels:
              project: myproject
        # pod标签选择      
        - podSelector:
            matchLabels:
              role: frontend
      ports:
        - protocol: TCP
          port: 6379
  egress:
    - to:
        - ipBlock:
            cidr: 10.0.0.0/24
      ports:
        - protocol: TCP
          port: 5978

含义是:

  1. 在“默认”命名空间中为入口和出口流量隔离“role=db”pod(如果它们尚未隔离)
  2. (入口规则)允许连接到 TCP 端口 6379 上带有标签“role=db”的“默认”命名空间中的所有 Pod:
    • “默认”命名空间中带有标签“role=frontend”的任何 pod
    • 命名空间中带有“project=myproject”标签的任何 pod
    • IP 地址在 172.17.0.0–172.17.0.255 和 172.17.2.0–172.17.255.255 范围内(即除 172.17.1.0/24 之外的所有 172.17.0.0/16)
  1. (出口规则)允许从“default”命名空间中带有标签“role=db”的任何 pod 连接到 TCP 端口 5978 上的 CIDR 10.0.0.0/24

样例二

默认拒绝所有入口流量

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

这确保即使没有被任何其他 NetworkPolicy 选择的 pod 仍将被隔离以进行入口。此策略不影响任何 pod 的出口隔离。

允许所有入口流量

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

有了这个策略,任何额外的策略都不会导致到这些 pod 的任何传入连接被拒绝。此策略对任何 pod 的出口隔离没有影响。


默认拒绝所有出口流量

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

这确保了即使没有被任何其他 NetworkPolicy 选择的 Pod 也不会被允许出口流量。该策略不会改变任何 pod 的入口隔离行为。

允许所有出口流量

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all-egress
spec:
  podSelector: {}
  egress:
  - {}
  policyTypes:
  - Egress

有了这个策略,任何额外的策略都不会导致来自这些 pod 的任何传出连接被拒绝。此策略对进入任何 pod 的隔离没有影响。

默认拒绝所有入口和所有出口流量

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

这确保了即使没有被任何其他 NetworkPolicy 选择的 Pod 也不会被允许进入或流出流量。

样例三(针对于 Kubernetes v1.22 [beta])

针对一系列端口而不是单个端口

前提

您的集群必须使用CNI支持endPortNetworkPolicy 规范中的字段的插件。如果您的网络插件 不支持该endPort字段并且您使用该字段指定了 NetworkPolicy,则该策略将仅应用于单个port字段。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: multi-port-egress
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Egress
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 32000
      endPort: 32768

上述规则允许role=db命名空间上带有标签的任何 Pod 通过 TCPdefault与范围内的任何 IP 进行通信10.0.0.0/24,前提是目标端口在范围 32000 和 32768 之间。

使用此字段时适用以下限制:

  • 作为 Beta 功能,默认情况下启用此功能。要在集群级别禁用该字段,您(或您的 集群endPort管理员)需要 NetworkPolicyEndPort 使用--feature-gates=NetworkPolicyEndPort=false,….
  • 该endPort字段必须等于或大于该port字段。
  • endPortport如果也定义了,则只能定义。
  • 两个端口都必须是数字。
  • 23
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值