在 Kubernetes 中,Network Policies(网络策略)提供了一种机制来控制 Pod 之间的通信。通过定义网络策略,集群管理员可以指定哪些 Pod 可以相互通信,以及这些通信的具体规则。网络策略基于标签选择器和端口来定义允许的流量,并且默认情况下是拒绝所有未明确允许的流量。
网络策略的工作原理
- 命名空间隔离:网络策略是在命名空间中定义的,因此它们仅适用于同一命名空间中的 Pod。
- 标签选择器:网络策略使用标签选择器来匹配目标 Pod 和源 Pod。
- 入站/出站规则:可以为入站(ingress)和出站(egress)流量分别定义规则。
- 协议和端口:可以指定特定的协议(如 TCP 或 UDP)和端口号。
- CIDR 范围:除了 Pod 之外,还可以基于 IP 地址或 CIDR 范围来定义规则。
定义网络策略
网络策略的定义通常包括以下几个部分:
spec.podSelector
:定义了受此策略影响的 Pod。spec.ingress
:定义了允许进入目标 Pod 的流量。spec.egress
:定义了允许从目标 Pod 发出的流量。
每个 ingress
和 egress
规则都可以包含多个 from
或 to
条目,用于指定源或目标的选择器、命名空间选择器、IP 块等。
示例配置
以下是一个简单的网络策略示例,它允许带有标签 role=db
的 Pod 接收来自带有标签 role=frontend
的 Pod 的流量,但只限于 TCP 协议的 6379 端口。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 6379
如何应用网络策略
-
创建网络策略:
使用kubectl apply
命令将网络策略应用到集群中。kubectl apply -f network-policy.yaml
-
验证网络策略:
应用网络策略后,可以通过kubectl get networkpolicies
查看已定义的网络策略。kubectl get networkpolicies
-
测试网络策略:
可以通过创建测试 Pod 并尝试与受保护的 Pod 通信来验证网络策略是否生效。例如,如果网络策略阻止了某个 Pod 的访问,那么相应的连接请求应该会被拒绝。
注意事项
- CNI 插件支持:并非所有的 CNI(Container Network Interface)插件都支持网络策略。常见的支持网络策略的 CNI 插件包括 Calico、Cilium、Weave Net 等。
- 默认行为:如果没有定义任何网络策略,Kubernetes 默认允许所有 Pod 之间的通信。
- 命名空间作用域:网络策略的作用范围是命名空间级别的,这意味着你需要在每个需要网络策略的命名空间中单独定义策略。
- 更新和删除:网络策略可以随时更新或删除。当删除一个网络策略时,相关的限制也会被移除。
通过合理地使用网络策略,你可以增强 Kubernetes 集群的安全性,确保只有授权的服务才能相互通信,从而减少潜在的安全风险。