使用场景
- 隔离环境: 在一个 Kubernetes 集群中,可能存在生产环境和开发环境的 Pods。为了安全性,可能希望防止开发环境的 Pods 访问生产环境。
- 数据库访问控制: 你可能只允许特定的应用服务访问数据库,而防止其他 Pods 访问。
- 限制外部访问: 对于暴露到外部的服务,可能希望限制哪些源可以访问这些服务。
- 细粒度的服务访问控制: 在基于微服务的架构中,你可能想要控制哪些服务可以访问其他服务。
使用技巧
- 明确默认行为: 在没有 Network Policies 的情况下,默认所有 Pod 之间是可以通信的。定义策略时,默认拒绝所有连接,然后明确允许所需的连接。
- 使用标签: Network Policies 使用标签选择器来选择 Pods 和定义规则。充分利用标签可以使策略更加有组织。
- 使用命名空间: 你可以使用命名空间选择器来限制跨命名空间的通信。
- 审计 & 测试: 创建策略后,确保进行足够的测试来验证通信是否如预期那样工作。
- 逐步实施: 在大型集群上实施 Network Policies 时,逐步实施,并密切监控应用程序的行为。
使用示例
默认拒绝所有入站连接
此策略拒绝所有没有 Network Policy 的命名空间中的 Pods 的入站连接。
代码语言:javascript复制apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
spec:
podSelector: {}
policyTypes:
- Ingress
允许特定命名空间的通信
只允许 billing
命名空间的 Pods 访问 database
命名空间中带有 app=database
标签的 Pods。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-billing-to-database
spec:
podSelector:
matchLabels:
app: database
ingress:
- from:
- namespaceSelector:
matchLabels:
project: billing
允许特定的 Pods 通信
只允许带有 role=frontend
标签的 Pods 访问带有 app=api-server
标签的 Pods。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-api
spec:
podSelector:
matchLabels:
app: api-server
ingress:
- from:
- podSelector:
matchLabels:
role: frontend
通过这些策略,你可以看到 Network Policies 如何提供细粒度的网络访问控制,以确保 Kubernetes 环境的安全性。