1、NetworkPolicy
默认情况下,Pod 是非隔离的,它们接受任何来源的流量。
Pod 在被某 NetworkPolicy 选中时进入被隔离状态。 一旦名称空间中有 NetworkPolicy 选择了特定的 Pod,该 Pod 会拒绝该 NetworkPolicy 所不允许的连接。 (名称空间下其他未被 NetworkPolicy 所选择的 Pod 会继续接受所有的流量)
网络策略不会冲突,它们是累积的。 如果任何一个或多个策略选择了一个 Pod, 则该 Pod 受限于这些策略的 入站(Ingress)/出站(Egress)规则的并集。因此评估的顺序并不会影响策略的结果。
为了允许两个 Pods 之间的网络数据流,源端 Pod 上的出站(Egress)规则和 目标端 Pod 上的入站(Ingress)规则都需要允许该流量。 如果源端的出站(Egress)规则或目标端的入站(Ingress)规则拒绝该流量, 则流量将被拒绝。
2、NetworkPolicy参数说明
podSelector:用于定义该网络策略作用于的Pod。
namespaceSelector:此选择器将选择特定的命名空间,并将所有Pod 用作其入站流量来源。
policyTypes:网络策略的类型,包括 ingress 和 egress 两种,用于设置目标 Pod 的入站和出站的网络限制。
ingress:定义允许访问目标 Pod 的入站白名单规则,满足 from 条件的客户端才能访问 ports 定义的目标 Pod 端口号。
- from:对符合条件的客户端 Pod 进行网络放行,规则包括基于客户端 Pod 的 Label、基于客户端 Pod 所在的 Namespace 的 Label 或者客户端的 IP 范围。
- ipBlock:此选择器将选择特定的IP CIDR范围以用作允许访问。
- except:此选择器将选择特定的IP CIDR范围以用作限制访问。
- ports:允许访问的目标 Pod 监听的端口号。
egress:定义目标 Pod 允许访问的 "出站" 白名单规则,目标 Pod 仅允许访问满足 to 条件的服务端 IP 范围和 ports 定义的端口号。
- to: 允许访问的服务端信息,可以基于服务端 Pod 的Label、基于服务端 Pod 所在的 Namespace 的 Label 或者服务端 IP 范围。
- ports:允许访问的服务端的端口号。
3、限制Pod访问某个外网域名
说明:限制pod访问外部域名www.baidu.com,可以正常访问其他外网域名
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
app: nginx
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 0.0.0.0/0
except:
- 220.181.38.149/32
- 220.181.38.150/32
- to: # 配置了去向规则(Egress),限制应用的对外访问。在这里需配置允许UDP请求,否则无法做DNS解析。
- ipBlock:
cidr: 0.0.0.0/0
- namespaceSelector: {}
ports:
- protocol: UDP
port: 53
4、限制Pod只能访问外网的80和443端口
说明:限制pod访问外部域名www.baidu.com,只能访问其他外网域名的80和443端口
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
app: nginx
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 0.0.0.0/0
except:
- 220.181.38.149/32
- 220.181.38.150/32
ports:
- protocol: TCP
port: 80
- protocol: TCP
port: 443
- to:
- ipBlock:
cidr: 0.0.0.0/0
- namespaceSelector: {}
ports:
- protocol: UDP
port: 53
5、默认禁止所有入pod流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
- Ingress
说明:上例中没有定义pod选择器,表示如果namespace下的某个pod没有被任何Network Policy对象选中,则应用此对象,如果被其它Network Policy先中则不应用此对象。
policyTypes的值为Ingress,表示本例启用Ingress规则。但是本例没有定义具体的Ingress,那就应用默认规则。默认规则禁止所有入pod流量,但例外情况是如果source就是pod运行的节点,则允许通过。
6、默认允许所有入pod流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all
spec:
podSelector: {}
ingress:
- {}
说明:同样没有定义pod选择器,意义与上例同。注意ingress的定义,这个是有规则的,只是规则中的条目为空,与默认规则不同,表示全部允许通过。
7、默认禁止所有出pod流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
- Egress
8、默认允许所有出pod流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all
spec:
podSelector: {}
egress:
- {}
policyTypes:
- Egress
9、默认禁止所有入出pod流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
说明:pod与所运行节点之间流量不受Network Policy限制
10、Default namespace 下的 Pod 可互相访问,而不能被其他任何 Pod 访问
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-other-ns-pod-in
namespace: default
spec:
ingress:
- from:
- podSelector: {}
podSelector: {}
policyTypes:
- Ingress
11、Default namespace 下的 Pod 不能被任何 Pod 访问
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test
namespace: default
spec:
ingress:
- from:
- podSelector: {}
podSelector: {}
policyTypes:
- Ingress
12、default命名空间下的Pod的80端口,只允许test命名空间的Pod来访问
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network
namespace: default
spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
test: test
ports:
- protocol: TCP
port: 80
podSelector: {}
policyTypes:
- Ingress
13、default命名空间下的 pod 出口 只能访问 CIDR 为14.215.0.0/16的80端口
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network
namespace: default
spec:
egress:
- to:
- ipBlock:
cidr: 14.215.0.0/16
ports:
- protocol: TCP
port: 80
podSelector: {}
policyTypes:
- Egress
评论区