NetworkPolicy访问控制
NetworkPolicy是Kubernetes中一种用于控制Pod之间以及Pod与外部网络之间流量的资源对象。它可以帮助你在 IP 地址或端口层面(OSI 第 3 层或第 4 层)控制网络流量。NetworkPolicy 资源使用标签选择 Pod,并定义选定 Pod 所允许的通信规则。它可以控制 Pod 的入站(Ingress)和出站(Egress)流量。
使用场景
微服务架构:在微服务架构中,不同的服务通常部署在不同的Pod中。使用NetworkPolicy可以控制服务之间的网络访问,提高安全性。
敏感数据保护:对于处理敏感数据的应用,可以使用NetworkPolicy限制对这些Pod的访问,减少数据泄露的风险,特别是一些需要暴露到外网的Pod。
东西向流量控制:在云原生和微服务场景下,内部网络的东西向通信流量剧增。NetworkPolicy可以帮助控制这些流量,确保只有授权的流量可以通过。
基于命名空间的隔离:通过NetworkPolicy,可以基于命名空间的标签来控制网络访问。只允许特定命名空间的Pod访问某些服务。
要在 Kubernetes 中创建一个 NetworkPolicy:
apiVersion: networking.k8s.io/v1 # API 版本
kind: NetworkPolicy # 资源类型是 NetworkPolicy
metadata:
name: example-network-policy # NetworkPolicy 的名称
namespace: default # NetworkPolicy 所在的命名空间
spec:
podSelector:
matchLabels:
role: db # 选择具有标签 "role=db" 的 Pod
policyTypes:
- Ingress # 定义入站规则
- Egress # 定义出站规则
ingress:
- from:
- ipBlock:
cidr: 172.17.0.0/16 # 允许来自 172.17.0.0/16 网段的流量
except:
- 172.17.1.0/24 # 但排除 172.17.1.0/24 网段
- namespaceSelector:
matchLabels:
project: myproject # 允许来自具有标签 "project=myproject" 的命名空间的流量
- podSelector:
matchLabels:
role: frontend # 允许来自具有标签 "role=frontend" 的 Pod 的流量
ports:
- protocol: TCP # 允许的协议是 TCP
port: 6379 # 允许的端口是 6379
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24 # 允许流向 10.0.0.0/24 网段
ports:
- protocol: TCP # 允许的协议是 TCP
port: 5978 # 允许的端口是 5978
应用配置文件: 使用 kubectl 命令将配置文件应用到 Kubernetes 集群中:
kubectl apply -f example-network-policy.yaml
验证 NetworkPolicy: 确认 NetworkPolicy 已正确创建并生效:
kubectl get networkpolicy -n default