介绍
所谓得隔离Pod网络就是通过限制 pod 可以与其他哪些 pod 通信,通讯分为入站与出站两个方向来确保 pod 之间的网络安全。是否可以进行这些配置取决于集群中使用的容器网络插件。如果网络插件支持,可以通过 NetworkPolicy 资源配置网络隔离。
NetworkPolicy
一个 NetworkPolicy 会应用在匹配它的标签选择器的 pod 上,指明这些允许访问这些 pod 的源地址,或者这些pod 可以访问的目标地址。这些分别由入向( ingress) 和出向( egress )规则指定。这两种规则都可以匹配由标签选择器选出的 pod ,或者一个 namespac 中的所有 pod ,或者通过无类别域间路由(Classless Inter-Domain Routing, CIDR )指定的 IP 地址段。
注意: 1、入向规则与 负载均衡中的 Ingress 资源无关。
2、networkpolicy 也是命名空间层面的资源,所有关联pod 的时候必须指定在pod 所在的命名空间创建,如果不与Pod在同一个命名空间就不会关联成功。
限制关联pod 的所有入站访问
1、命名空间中所有pod禁止所有外部访问
限制所有外部pod 访问这个命名空间下的所有 pod ,不限制出。
vi np.yaml apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny #这个名字不可变,只有这个名字有限制入站访问的功能 spec: podSelector: matchLabels: {} #不指定标签,标识对此命名空间下所有的pod 都生效 kubectl create -f np.yaml -n kzf #指定命名空间下创建
2、只允许同一命名空间中的部分pod 访问
虽然只添加了允许访问的pod ,但是此情况下默认拒绝所有其他的pod 的访问。
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-allow spec: podSelector: matchLabels: app : centos-lb #此策略确保了标签app:centos-lb 的pod 的安全性 ingress: - from: - podSelector: #只是允许标签app:webserver pod 的访问 matchLabels: app: webserver ports: - port: 5432 #只能访问此端口
3、通过命名空间标签选择器对指定命名空间下的pod进行网络隔离
View Code
4、使用CIDR 隔离网络段
除了通过在pod选择器或命名空间选择器定义哪些pod可以访问NetworkPolicy 资源中指定的目标pod, 还可以通过CIDR表示法指定一 个IP段。
apiVersion: networking.k8s.io/vl kind: NetworkPolicy metadata: name: shoppingcart-netpolicy spec: podSelector: matchLabels: app: market-server ingress: - from: - ipBlock: cidr: 192.168.1.0/24 #整个网段能够访问app:market-server 的pod portS: - port: 80
限制pod的对外访问流量
之前的所有例子中,已经通过入向规则限制了进入pod的访问流量。然而,也可以通过出向规则限制pod的对外访问流量。以下代码清单展示了 一个例子。
... spec: podSelector: matchLabels: app: webserver egress: - to: - podSelector: matchLabels: app: database
这个策略应用于包含 app=webserver标签的pod。webserver的pod只能与有app=database 标签的pod通信 ,不能与其他的pod 通讯。而app=database 标签的pod 的入站访问在这里的配置对他无任何影响。此处只是限制的是webserver的
pod 的出站访问控制策略。