NetworkPolicy
是 Kubernetes 中用于控制 Pod 之间或 Pod 与外部资源之间网络流量的一种资源对象。它允许用户定义规则,限制或允许网络访问。通过 NetworkPolicy
,你可以精细化地控制 Kubernetes 集群内部的网络流量,例如只允许特定的 Pod 或 IP 地址访问某些 Pod。
NetworkPolicy 的作用
在k8s集群中如果,没有
NetworkPolicy
时,Kubernetes 集群默认允许所有 Pod 之间的相互通信。启用NetworkPolicy
后,可以自定义规则来允许或阻止特定的网络流量。
使用场景
控制同一命名空间内 Pod 之间的网络通信。
限制不同命名空间中的 Pod 之间的访问。
限制外部 IP 地址或服务对 Pod 的访问
NetworkPolicy组成
podSelector:定义哪些 Pod 会受到该网络策略的影响。可以通过 Pod 标签选择器来匹配目标 Pod。
ingress和 egress 规则:分别控制入站(Ingress)和出站(Egress)流量。你可以指定允许哪些流量源或目的地、协议、端口等。
policyTypes:定义该策略是用于控制入站流量(Ingress)、出站流量(Egress),还是两者兼顾。
NetworkPolicy创建
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-backend-ingress
namespace: default
spec:
podSelector:
matchLabels:
app: frontend # 应用于具有 app=frontend 标签的 Pod
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: backend # 只允许来自 app=backend 的 Pod 访问
只允许带有 app: frontend
标签的 Pod 可以接受带有 app: backend
标签的 Pod 的流量,并且限制其他所有入站流量。
podSelector
选择了所有带有app: frontend
标签的 Pod。
ingress
规则规定了只有带有app: backend
标签的 Pod 可以访问这些frontend
Pod。
policyTypes
定义策略类型为Ingress
,仅控制入站流量。
应用
kubectl apply -f networkpolicy.yaml
验证是否成功创建
kubectl get networkpolicy -n default
如果能够看到 NetworkPolicy
列表,且没有报错,则说明网络策略功能已经启用。
检查网络策略的支持情况
kubectl get networkpolicies --all-namespaces
主要功能
控制入站流量:你可以指定哪些 Pod 或 IP 地址能够访问目标 Pod。如,只允许某些服务访问数据库。
控制出站流量:你可以限制 Pod 发出网络请求的目标范围。如,禁止应用 Pod 访问外部互联网,保证安全性。
命名空间隔离:通过定义跨命名空间的规则,可以限制不同命名空间中的 Pod 是否可以相互通信。
注意事项
Kubernetes 本身不会直接实现 NetworkPolicy
,而是依赖网络插件来支持这一功能。首先,检查你的 Kubernetes 集群是否安装了支持 NetworkPolicy
的网络插件。常见支持 NetworkPolicy
的插件包括:Calico、Cilium和Weave等。
查询是否支持
kubectl get pods -n kube-system
查看是否有 Calico、Cilium、Weave 等网络插件相关的 Pod 在运行,如果没有显示支持 NetworkPolicy
的网络插件,说明你的集群可能没有启用 NetworkPolicy
。