Kubernetes网络自学系列 | Kubernetes网络策略:为你的应用保驾护航

Posted COCOgsta

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes网络自学系列 | Kubernetes网络策略:为你的应用保驾护航相关的知识,希望对你有一定的参考价值。

素材来源:《Kubernetes网络权威指南》

一边学习一边整理内容,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:Kubernetes网络自学系列 | 汇总_COCOgsta的博客-CSDN博客


3.8 Kubernetes网络策略:为你的应用保驾护航

在默认情况下,Kubernetes底层网络是“全连通”的,即在同一集群内运行的所有Pod都可以自由通信。但是也支持用户根据实际需求以不同方式限制集群内Pod的连接。

例如,我们需要实现图3-22中的需求,即只允许访问default namespace的Label是app=web的Pod,default namespace的其他Pod都不允许外部访问。这个隔离需求在多租户的场景下十分普遍。Kubernetes的解决方案是Network Policy,即网络策略。

图3-22 一个需要网络策略的典型场景

网络策略就是基于Pod源IP(所以Kubernetes网络不能随随便便做SNAT)的访问控制列表,限制的是Pod之间的访问。通过定义网络策略,用户可以根据标签、IP范围和端口号的任意组合限制Pod的入站/出站流量。网络策略作为Pod网络隔离的一层抽象,用白名单实现了一个访问控制列表(ACL),从Label Selector、namespace selector、端口、CIDR这4个维度限制Pod的流量进出。

值得一提的是,Kubernetes的网络策略采用了比较严格的单向流控制,即假如允许服务A访问服务B,反过来服务B并不一定能访问服务A。这与Docker内置的Network命令实现的隔离有很大不同。

3.8.1 网络策略应用举例

让我们先来见识几个默认的网络策略,如图3-23所示。

图3-23 几个Kubernetes默认的网络策略

注:代表允许所有。[]代表拒绝所有。

如果拒绝所有流量进入,例如图3-24所示的场景。

图3-24 拒绝所有流量进入的网络策略场景

那么Network Policy对象应该定义成:

如果限制部分流量进入,例如图3-25所示的场景。

图3-25 限制部分流量进入的网络策略场景

那么,Network Policy对象应该定义成:

如果只允许特定namespace的Pod流量进入,例如图3-26所示的场景。

图3-26 只允许特定namespace的Pod流量进入的网络策略场景

那么Network Policy对象应该定义成:

如果限制流量从指定端口进入,例如图3-27所示的场景。

图3-27 限制流量从指定端口进入的网络策略场景

那么,Network Policy对象应该定义成:

再举一个同时限定入站(Ingress)和出站(Egress)的例子:

该例子的效果如下:default namespace下Labels包含role=db的Pod,都会被隔绝,它们只能建立满足Network Policy的Ingress和Egress描述的连接。即:

(1)所有属于172.17.0.0/16网段的IP,除了172.17.1.0/24中的IP,其他的都可以与上述Pod的6379端口建立TCP连接。

(2)所有包含project=myproject Labels的namespace中的Pod可以与上述Pod的6379端口建立TCP连接。

(3)所有default namespace下的包含role=frontend Labels的Pod可以与上述Pod的6379端口建立TCP连接。

(4)允许上述Pod访问网段为10.0.0.0/24的目的IP的5978端口。

3.8.2 小结

最后,让我们梳理Kubernetes网络策略的知识点。

· Egress表示出站流量,即Pod作为客户端访问外部服务,Pod地址作为源地址。策略可以定义目的地址和目的端口,可以根据ports和to定义规则。ports字段用来指定目的端口和协议。to(目的地址)分为IP地址段、Pod selector和Kubernetes namespace selector;

· Ingress表示入站流量,Pod地址和服务作为服务端(目的地址),提供外部访问。与Egress类似,策略可以定义源地址和端口,可以根据ports和from定义规则。ports字段同样用来指定目的端口和协议。from(源地址)分为IP地址段、Pod selector和Kubernetes namespace selector;

· podSelector用于指定网络策略在哪些Pod上生效,用户可以配置单个Pod或者一组Pod。可以定义单方向。空podSelector选择命名空间中的Pod。podSelector定义Network Policy的限制范围,就是规则应用到哪个Pod上。如上所示,podSelector:留空就是定义对Kubernetes当前namespace下的所有Pod生效。没有定义白名单的话,默认就是Deny ALL(拒绝所有);

· policyTypes:指定策略类型,包括Ingress和Egress,不指定默认就是Ingress。默认情况下,一个policyTypes的值一定会包含Ingress。

说到匹配规则,namespaceSelector和podSelector是彼此独立的两个单独的匹配规则。你可以使用ipBlock字段允许来自或者到达特定IP地址段范围的Ingress或Egress流量。

最后,介绍Kubernetes网络策略与一些安全组(例如Neutron的安全组)的区别。一般来说,安全组的规则记录在上层网关,而不是每一个节点上。而Kubernetes网络是应用到每个节点上的,实现Network Policy的agent需要在每个节点上都List/Watch Kubernetes的Network Policy、namespace、Pod等资源对象,因此在实现上可能会有较大的性能影响。Network Policy agent一般通过Kubernetes DaemonSet实现每个节点上都有一个部署。

以上是关于Kubernetes网络自学系列 | Kubernetes网络策略:为你的应用保驾护航的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes网络自学系列 | 前方高能:Kubernetes网络故障定位指南

Kubernetes网络自学系列 | iptables

Kubernetes网络自学系列 | Kubernetes网络策略:为你的应用保驾护航

Kubernetes网络自学系列 | Linux隧道网络的代表:VXLAN

Kubernetes网络自学系列 | 容器基础设施的代言人:Kubernetes

Kubernetes网络自学系列 | 最常用的Docker网络技巧