Kubernetes 网络策略(NetworkPolicy)深度解析
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
什么是 Kubernetes 网络策略
Kubernetes 网络策略(NetworkPolicy)是一种用于控制 Pod 之间以及 Pod 与外部网络之间通信的机制。它允许管理员在 IP 地址或端口层面(OSI 第 3 层或第 4 层)定义精细的网络流量规则。
为什么需要网络策略
在 Kubernetes 集群中,默认情况下所有 Pod 之间是可以自由通信的。这种开放的通信模式虽然方便,但在生产环境中可能存在安全隐患。网络策略可以帮助我们:
- 实现最小权限原则,只允许必要的网络通信
- 保护重要应用,防止未授权访问
- 满足安全合规需求
- 防止横向渗透攻击
网络策略的工作原理
基本概念
网络策略通过标签选择器(Label Selector)来指定策略适用的 Pod。每个策略可以定义:
- 入站规则(Ingress):控制哪些流量可以进入 Pod
- 出站规则(Egress):控制 Pod 可以发起哪些出站连接
策略类型
网络策略支持三种策略类型:
- Ingress:仅控制入站流量
- Egress:仅控制出站流量
- Ingress + Egress:同时控制入站和出站流量
网络策略的核心组件
podSelector
用于选择策略适用的 Pod。例如:
podSelector:
matchLabels:
role: db
policyTypes
指定策略类型,可以是 Ingress、Egress 或两者。
ingress
定义允许的入站规则,可以基于:
- podSelector:选择允许访问的源 Pod
- namespaceSelector:选择允许访问的命名空间
- ipBlock:指定允许的 IP 地址范围
egress
定义允许的出站规则,结构与 ingress 类似。
实际应用示例
数据库访问控制
假设我们有一个数据库服务(标签 role=db),只允许前端服务(标签 role=frontend)访问其 3306 端口:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-access
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 3306
多租户隔离
在多租户环境中,我们可以限制不同命名空间之间的访问:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: tenant-isolation
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- podSelector: {}
- namespaceSelector:
matchLabels:
tenant: team-a
默认策略
Kubernetes 提供了两种默认策略模式:
默认拒绝所有入站
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
spec:
podSelector: {}
policyTypes:
- Ingress
默认拒绝所有出站
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-egress
spec:
podSelector: {}
policyTypes:
- Egress
最佳实践
- 从默认拒绝所有流量开始,然后逐步添加必要的允许规则
- 使用标签进行逻辑分组,便于管理
- 为关键服务创建明确的访问规则
- 定期审核网络策略,确保其符合安全要求
- 测试策略变更对应用的影响
注意事项
- 网络策略需要网络插件支持,不是所有网络方案都支持 NetworkPolicy
- 策略是叠加的,不会相互覆盖
- 要允许连接,源和目的地的策略都必须允许
- 节点与 Pod 的通信总是被允许的
通过合理使用网络策略,可以显著提高 Kubernetes 集群的网络安全性,实现精细的访问控制。
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考