网络策略简介

在默认情况下,Kubernetes 集群网络没有任何限制,所有 Pod 可以相互通信。在某些场景下,需要进行网络控制以减少攻击面,提高安全性,这时就需要使用网络策略。

网络策略(Network Policy) 是 Kubernetes 资源,用于限制 Pod 的入站和出站流量。网络策略可以基于 Pod 和 Namespace 提供网络访问控制。

网络策略的应用场景:

  • 应用程序间的访问控制,例如项目 A 不能访问项目 B 的 Pod。
  • 开发环境命名空间不能访问测试环境命名空间的 Pod。
  • 当 Pod 暴露到外部时,需要做 Pod 白名单。
  • 多租户网络环境隔离。

网络策略示例

一个网络策略示例如下:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 172.17.0.0/16
        except:
        - 172.17.1.0/24
    - namespaceSelector:
        matchLabels:
          project: myproject
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 6379
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 5978

解析:

  • metadata: 定义网络策略的名称和命名空间。
  • podSelector: 目标 Pod,通过标签选择器确定应用策略的 Pod。
  • policyTypes: 策略类型,指定策略用于入站和出站流量控制。
  • ingress: 入站流量规则,from 定义允许访问的来源,可以是 IP 段、命名空间或 Pod 标签。ports 定义可以访问的端口。
  • egress: 出站流量规则,to 定义可以访问的目标 IP 段和端口。

案例1:拒绝命名空间下所有Pod出入站流量

这个策略将禁止所有Pod的入站和出站流量,确保该命名空间内的Pod无法与外部通信。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all-traffic
  namespace: your-namespace
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

案例2:拒绝其他命名空间Pod访问

这个策略将禁止其他命名空间内的Pod访问指定命名空间内的Pod。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-other-namespaces
  namespace: your-namespace
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          name: your-namespace

案例3:允许其他命名空间Pod访问指定应用

这个策略允许其他命名空间内的Pod访问指定命名空间内某一应用的Pod。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-specific-app
  namespace: your-namespace
spec:
  podSelector:
    matchLabels:
      app: your-app
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector: {}

案例4:同一个命名空间下应用之间限制访问

这个策略将限制同一命名空间下不同应用之间的访问。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: restrict-app-communication
  namespace: your-namespace
spec:
  podSelector:
    matchLabels:
      app: appA
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: appB

案例5:只允许指定命名空间中的应用访问

这个策略将只允许特定命名空间中的应用访问该命名空间内的Pod。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-specific-namespace
  namespace: your-namespace
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          name: specific-namespace

这些策略示例展示了如何使用Kubernetes网络策略来实现不同的访问控制需求。通过合理配置网络策略,可以增强集群的安全性,确保不同命名空间和应用之间的通信符合预期的安全要求。

本文由mdnice多平台发布


逼格高的汤圆
10 声望2 粉丝