目录
一、 介绍
在 Kubernetes 中,NetworkPolicy 是一种用于控制 Pod 之间网络通信的资源对象。它允许用户定义一组规则,规定哪些 Pod 可以相互通信,从而实现网络隔离和安全性。NetworkPolicy 基于标签选择器来识别应用策略的 Pod,并使用入站(Ingress)和出站(Egress)规则来控制流量,提供Pod级别和 Namespace级别网络访问控制
NetworkPolicy 的主要特点包括:
- 基于标签选择器:通过标签选择器来选择应用策略的 Pod。
- 入站和出站规则:定义允许的入站和出站流量规则。
- 命名空间级别:NetworkPolicy 作用于特定的命名空间内。
- 默认拒绝:未被显式允许的流量将被默认拒绝。
二、使用方法
要使用 NetworkPolicy,需要满足以下条件:
- 集群必须使用支持 NetworkPolicy 的网络插件,如 Calico、Cilium 等,Flannel不支持。
- 在 Pod 的元数据中添加相应的标签,用于 NetworkPolicy 的选择。
NetworkPolicy 的示例:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: example-policy
namespace: default
spec:
podSelector:
matchLabels:
app: backend
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 80
这个 NetworkPolicy 的作用是:
- 应用于带有标签
app=backend
的 Pod。 - 允许带有标签
app=frontend
的 Pod 访问backend
Pod 的 80 端口
三、应用场景
NetworkPolicy 适用于以下场景:
-
微服务架构:在微服务架构中,不同的服务通常部署在不同的 Pod 中。使用 NetworkPolicy 可以控制服务之间的网络访问,提高安全性。
-
多租户环境:在多租户环境中,不同租户的应用可能部署在同一个集群中。使用 NetworkPolicy 可以实现租户之间的网络隔离,防止互相干扰,如开发环境命名空间不能访问测试环境命名空间服务
-
敏感数据保护:对于处理敏感数据的应用,可以使用 NetworkPolicy 限制对这些 Pod 的访问,减少数据泄露的风险,特别是一些需要暴露到外网的Pod
四、示例
以下是一些常见的 NetworkPolicy 示例:
1、对于test命名空间的Pod,拒绝所有入站流量:
写法一:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-ingress
namespace: test
spec:
podSelector: {}
policyTypes:
- Ingress
写法二:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all # 策略名称
namespace: test # 策略所在的命名空间
spec:
podSelector: {} # 空的podSelector,意味着策略适用于所有Pods
policyTypes:
- Ingress # 指定策略类型为Ingress,表示这是一个入站流量策略
ingress:
- from: # from数组定义了允许进入的流量源
- podSelector: {} # 空的podSelector表示不允许任何Pod的入站流量
2、对于test命名空间的Pod,允许特定命名空间的入站流量:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-namespace
namespace: test
spec:
podSelector:
matchLabels:
app: backend
ingress:
- from:
- namespaceSelector:
matchLabels:
purpose: frontend
3、对于test命名空间的Pod,允许特定 IP 地址范围的入站流量:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-ip-range
namespace: test
spec:
podSelector:
matchLabels:
app: backend
ingress:
- from:
- ipBlock:
cidr: 192.168.1.0/24
五、注意事项
在使用 NetworkPolicy 时,需要注意以下几点:
- NetworkPolicy 的应用顺序很重要,策略按照创建的顺序进行评估。
- 如果多个 NetworkPolicy 应用于同一个 Pod,则最终的网络策略是这些策略的叠加。
- 在使用 NetworkPolicy 时,要确保网络插件支持并正确配置。
- NetworkPolicy 只能控制 Pod 之间的流量,对于 Pod 与外部资源之间的流量,需要使用其他机制进行控制。
-
策略写到哪个命名空间就对哪个命名空间的pod做隔离
六、实战经验
在实际使用 NetworkPolicy 时,以下经验可供参考:
- 为 Pod 设置合适的标签,便于 NetworkPolicy 的选择和管理。
- 从最小权限原则出发,只允许必要的网络访问。
- 将 NetworkPolicy 与命名空间结合使用,实现更细粒度的网络控制。
- 定期审查和更新 NetworkPolicy,确保策略与应用架构保持一致。
- 使用自动化工具(如 Helm、Kustomize)管理 NetworkPolicy,提高部署效率。