【每日一个云原生小技巧 #9】Kubernetes 中的 Network Policies

Network Policies 是 Kubernetes 中用于控制 Pod 之间通信的规则。默认情况下,大多数 Kubernetes Pods 可以与其他 Pods 进行自由通信。Network Policies 允许你定义白名单规则,指定哪些 Pod 可以与其他 Pod 通信。

使用场景

  1. 隔离环境: 在一个 Kubernetes 集群中,可能存在生产环境和开发环境的 Pods。为了安全性,可能希望防止开发环境的 Pods 访问生产环境。
  2. 数据库访问控制: 你可能只允许特定的应用服务访问数据库,而防止其他 Pods 访问。
  3. 限制外部访问: 对于暴露到外部的服务,可能希望限制哪些源可以访问这些服务。
  4. 细粒度的服务访问控制: 在基于微服务的架构中,你可能想要控制哪些服务可以访问其他服务。

使用技巧

  1. 明确默认行为: 在没有 Network Policies 的情况下,默认所有 Pod 之间是可以通信的。定义策略时,默认拒绝所有连接,然后明确允许所需的连接。
  2. 使用标签: Network Policies 使用标签选择器来选择 Pods 和定义规则。充分利用标签可以使策略更加有组织。
  3. 使用命名空间: 你可以使用命名空间选择器来限制跨命名空间的通信。
  4. 审计 & 测试: 创建策略后,确保进行足够的测试来验证通信是否如预期那样工作。
  5. 逐步实施: 在大型集群上实施 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。

代码语言:javascript
复制
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。

代码语言:javascript
复制
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 环境的安全性。