网络策略是关于pod之间,pod与其他网络端点之间相互通信的规范。
NetworkPolicy资源使用标签来选择pod,并定义pod之间的通信规则,这些规则规定了哪些流量是允许的。
网络策略是由网络插件实现的,所以必须使用支持NetworkPolicy
的网络解决方案。
隔离的pod
默认情况下,pod不是隔离的; 它们接受任何来源的流量。
网络策略可以选择一组pod,形成隔离的pod组,该组pod将遵守网络策略中定义的规范,拒绝任何规范不允许的通信。
没有被网络策略选择的pod不受影响,将继续接受所有流量。
示例:限制对nginx服务的访问
假设你希望限制对nginx服务的访问,只有具有access:true
标签的pod才能访问。
可以创建一个网络政策:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: access-nginx
spec:
podSelector:
matchLabels:
app: nginx
ingress:
- from:
- podSelector:
matchLabels:
access: "true"
将策略分配给服务
使用kubectl从上面的nginx-policy.yaml文件创建一个网络策略:
kubectl apply -f nginx-policy.yaml
networkpolicy.networking.k8s.io/access-nginx created
测试网络策略
如果我们试图从一个没有标签(access:true
)的pod访问nginx服务,请求将超时:
kubectl run --generator=run-pod/v1 busybox --rm -ti --image=busybox -- /bin/sh
Waiting for pod default/busybox-472357175-y0m47 to be running, status is Pending, pod ready: false
Hit enter for command prompt
/ # wget --spider --timeout=1 nginx
Connecting to nginx (10.100.0.16:80)
wget: download timed out
/ #
定义标签并再次测试
用正确的标签(access:true
)创建一个pod,可以正常访问nginx服务:
kubectl run --generator=run-pod/v1 busybox --rm -ti --labels="access=true" --image=busybox -- /bin/sh
Waiting for pod default/busybox-472357175-y0m47 to be running, status is Pending, pod ready: false
Hit enter for command prompt
/ # wget --spider --timeout=1 nginx
Connecting to nginx (10.100.0.16:80)
/ #