CNI 网络分析 2. Kubernetes NetworkPolicy

NetworkPolicy

为集群中特定应用使用 Kubernetes 网络策略(NetworkPolicy),在 IP 地址或端口层面(OSI 第 3 层或第 4 层)控制网络流量。

Kubernetes NetworkPolicy

Kubernetes 只是定义了 networkPolicy API,实现上还是要依赖各个网络插件 cni;
Networkpolicy 定义 一组 pod 的访问规则。所以通过 selector 对所生效的 pod 做一个选择。

Pod 隔离类型

Pod 隔离分 egress 隔离和 ingress 隔离,默认情况下,都是非隔离的,所有进出的流量都是允许的。
网络策略是相加的,所以不会产生冲突。要允许从源 Pod 到目的 Pod 的连接,源 Pod 的出口策略和目的 Pod 的入口策略都需要允许连接。 如果任何一方不允许连接,建立连接将会失败。

NetworkPolicy 资源

Networkpolicy 对一组 pod 生效,通过 podSelector 进行选择

  podSelector:
    matchLabels:
      role: pod1
      team: test

Pod label 中 role: pod1 且 team: test 的 pod 生效
不止 matchLabels,同样支持 matchExpressions

matchLabels: {} 代表所有

规则内容

规则生效部分有三种类型:

  • namespaceSelector:匹配 namespace,通过给 namespace 打 label,然后选择对应的 namespace;
  • podSelector:一组 pod;
  • ipBlock:地址段,可以通过 except 剥离某个段;
    除了上面三种类型,还有 ports 选项,指定协议和端口号;协议有 TCP,UDP,SCTP;端口号也可以写一个或范围(通过 endPort 设置)

policyType

每个 NetworkPolicy 都包含一个 policyTypes 列表,其中包含 Ingress 或 Egress 或两者兼具。policyTypes 字段表示给定的策略是应用于进入所选 Pod 的入站流量还是来自所选 Pod 的出站流量,或两者兼有。
注意:如果 NetworkPolicy 未指定 policyTypes 则默认情况下始终设置 Ingress; 如果 NetworkPolicy 有任何出口规则的话则设置 Egress。
是指根据实际的 ingress,egress 配置来显示 policyTypes,如果有对应的 规则,则会更新上对应的 policyTypes

Ingress

每个 NetworkPolicy 可包含一个 ingress 规则的白名单列表。 每个规则都允许同时匹配 from 和 ports 部分的流量。

Egress

每个 NetworkPolicy 可包含一个 egress 规则的白名单列表。 每个规则都允许匹配 to 和 port 部分的流量。

示例说明

  1. Ingress
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: app-to-app
spec:
  podSelector:
    matchLabels:
      app: nginx
  policyTypes:
    - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          role: pod1
    ports:
    - protocol: TCP
      port: 443

白名单,只有从 role:pod1 且访问 443 端口才能访问;role:pod1 来的流量访问其他端口不通过,在 role:pod1 以外的 pod 也访问不了;

  1. Egress
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: app-to-app
spec:
  podSelector:
    matchLabels:
      role: pod1
  policyTypes:
    - Egress
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: nginx
    ports:
    - protocol: TCP
      port: 80

白名单:从 role:pod1 出来的流量,只能到 app:nginx 的 80 端口,到其他的流量全不通;包括非集群内。

  1. Ingress + namespaceselector
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: app-to-app
spec:
  podSelector:
    matchLabels:
      app: nginx
  policyTypes:
    - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          user: xujunjie
    ports:
    - protocol: TCP
      port: 80

只有从 user:xujunjie 下的 pod 才可以访问 app:nginx 80 端口;

  1. Ingress + ipBlock
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: app-to-app
spec:
  podSelector:
    matchLabels:
      app: nginx
  policyTypes:
    - Ingress
  ingress:
  - from:
    - ipBlock:
        cidr: 10.244.0.1/16
        except:
          - 10.244.153.192/26

只有在 10.244.0.1/16 且除了 10.244.153.192/26 的源 IP 才可以访问

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

所有 pod Ingress 空白名单,即所有 pod 都拒绝访问

Calico NetworkPolicy

Calico 实现 Kubernetes NetworkPolicy 的所有规范,且可以和 Kubernetes NetworkPolicy 混用;
Calico NetworkPolicy 可以作用在 host interface 额外支持 host 和 vm;
和 Istio,Envoy 集成可以支持作用 L5-L7 ;
可以在策略规则中使用 FQDN/域名来限制对特定外部服务的访问;

Calico networkpolicy 可以通过 crd networkpolicies.crd.projectcalico.org 去使用,除了支持自己的命名空间的 networkpolicy 也可以支持非命名空间的 全局networkpolicy。
支持

  • 策略排序/优先级
  • 拒绝并记录规则中的操作
  • 更灵活的匹配标准用于应用策略和策略规则,L5-L7,加密等
  • 引用非Kubernetes pod,配合 NetworkSet 实现,如 vm,主机接口等
  • order,应用顺序,越大越后应用,后应用会覆盖前应用的

具体如何实现 networkPolicy 的功能在 Calico CNI 介绍章节中继续

NetworkPolicy 使用场景:

  • 使用 ingress 保护 pod
  • 使用少量适用于所有pod的全局策略,然后使用单个pod特定策略来定义特定于该pod的所有入口和出口规则
  • 开全局 deny,然后只开允许的流量
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值