k8s-NetworkPolicy

在 Kubernetes 中,NetworkPolicy 是一种资源对象,用于定义 Pod 之间的网络通信策略。它允许你控制哪些 Pod 可以相互通信,以及如何通信。通过使用 NetworkPolicy,可以实现更细粒度的网络访问控制,增强集群的安全性。
1.NetworkPolicy 的作用

NetworkPolicy 主要用于以下场景:

限制 Pod 之间的通信:指定哪些 Pod 可以相互通信,哪些不能通信。

控制入站和出站流量:定义哪些流量可以进入 Pod,哪些流量可以从 Pod 发出。

基于标签的策略:通过 Pod 的标签选择器来定义策略,使得策略的管理更加灵活。

2.NetworkPolicy 的工作原理

NetworkPolicy 本身并不直接实现网络策略,而是依赖于支持网络策略的网络插件(如 Calico、Cilium、Weave 等)。这些插件会根据 NetworkPolicy 的定义,动态地配置网络规则,从而实现流量的控制。

3.NetworkPolicy 的基本配置

NetworkPolicy 的配置文件是一个 YAML 文件,定义了策略的规则。以下是一个简单的例子:

bash 复制代码
apiVersion: networking.k8s.io/v1   # 指定API版本
kind: NetworkPolicy				   # 指定资源类型为 NetworkPolicy。
metadata:						   # 定义了策略的名称和命名空间。
  name: allow-specific-pods
  namespace: default
spec:
  podSelector:    # 定义了哪些 Pod 受此策略影响。在这个例子中,所有带有 role: frontend 标签的 Pod 会受到此策略的限制。
    matchLabels:
      role: frontend
  policyTypes:  # 定义了策略的类型,可以是 Ingress(入站流量)、Egress(出站流量)或两者。
  - Ingress
  - Egress
  ingress:   # 定义了允许进入 Pod 的流量规则。在这个例子中,只有带有 role: backend 标签的 Pod 可以向带有 role: frontend 标签的 Pod 发送流量。
  - from:
    - podSelector:
        matchLabels:
          role: backend
  egress: # 定义了允许从 Pod 发出的流量规则。在这个例子中,带有 role: frontend 标签的 Pod 只能向带有 role: backend 标签的 Pod 发送流量。
  - to:
    - podSelector:
        matchLabels:
          role: backend

4.NetworkPolicy 的主要字段

podSelector:选择受此策略影响的 Pod。如果没有指定,则默认选择命名空间中的所有 Pod。

policyTypes:定义策略的类型,可以是 Ingress、Egress 或两者。

ingress:定义入站流量的规则。

from:定义允许流量的来源。

podSelector:基于 Pod 的标签选择器。

namespaceSelector:基于命名空间的标签选择器。

ipBlock:基于 IP 范围。

egress:定义出站流量的规则。

to:定义允许流量的目的地。

podSelector:基于 Pod 的标签选择器。

namespaceSelector:基于命名空间的标签选择器。

ipBlock:基于 IP 范围。

ports:定义允许的端口和协议。如果没有指定,则默认允许所有端口。

5.示例 限制 Pod 之间的通信

假设我们有两个服务:

frontend:运行前端应用,带有标签 role: frontend。

backend:运行后端应用,带有标签 role: backend。

我们希望:

frontend 只能从 backend 接收流量。

frontend 只能向 backend 发送流量。

创建 Pod

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: frontend
  labels:
    role: frontend
spec:
  containers:
  - name: frontend
    image: my-frontend-image
---
apiVersion: v1
kind: Pod
metadata:
  name: backend
  labels:
    role: backend
spec:
  containers:
  - name: backend
    image: my-backend-image

创建 NetworkPolicy

bash 复制代码
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-specific-pods
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: frontend
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          role: backend
  egress:
  - to:
    - podSelector:
        matchLabels:
          role: backend

6.注意事项

默认策略:如果没有定义任何 NetworkPolicy,则默认允许所有 Pod 之间的通信。

网络插件支持:NetworkPolicy 的实现依赖于网络插件。确保你的 Kubernetes 集群使用了支持 NetworkPolicy 的网络插件(如 Calico、Cilium 等)。

命名空间隔离:NetworkPolicy 仅在定义它的命名空间内生效。如果需要跨命名空间的策略,需要使用 namespaceSelector。

7.示例:限制外部流量

假设我们希望限制外部流量只能访问特定的 Pod,可以使用以下 NetworkPolicy:

bash 复制代码
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-external-traffic
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: frontend
  policyTypes:
  - Ingress
  ingress:
  - from:
    - ipBlock:
        cidr: 192.168.0.0/16

在这个例子中,只有来自 192.168.0.0/16 网段的外部流量可以访问带有 role: frontend 标签的 Pod。

8.示例:限制特定端口

假设我们希望限制 Pod 只能通过特定端口通信,可以使用以下 NetworkPolicy:

bash 复制代码
apiVersion: networking.k8s.io/v1  # 指定了 Kubernetes API 的版本
kind: NetworkPolicy			# :指定了资源类型
metadata:
  name: allow-specific-ports	# 定义了这个网络策略的名称
  namespace: default		# 定义了这个网络策略所在的命名空间
spec:
  podSelector:	# 定义了哪些 Pod 受此策略影响
    matchLabels:
      role: frontend
  policyTypes:	# :定义了策略的类型
  - Ingress
  - Egress
  ingress:	# 定义了入站流量的规则。
  - from:	# 定义了允许流量的来源。
    - podSelector:	# 指定了流量来源的 Pod。这里通过 matchLabels 指定了带有 role: backend 标签的 Pod。
        matchLabels:
          role: backend
    ports:	# 定义了允许的端口和协议。
    - protocol: TCP	# 指定了协议类型,这里是 TCP。
      port: 80	# 指定了端口号,这里是 80。
 # 解释:这个规则表示:只有带有 role: backend 标签的 Pod 可以通过 TCP 端口 80 向带有 role: frontend 标签的 Pod 发送流量。
  egress: # 定义了出站流量的规则。
  - to:	# 定义了允许流量的目的地。
    - podSelector:	# 指定了流量目的地的 Pod。这里通过 matchLabels 指定了带有 role: backend 标签的 Pod。
        matchLabels:
          role: backend
    ports: # 定义了允许的端口和协议。
    - protocol: TCP # 指定了协议类型,这里是 TCP。
      port: 80 # 指定了端口号,这里是 80。
# 这个规则表示:带有 role: frontend 标签的 Pod 只能通过 TCP 端口 80 向带有 role: backend 标签的 Pod 发送流量。

在这个例子中,带有 role: frontend 标签的 Pod 只能通过 TCP 端口 80 与带有 role: backend 标签的 Pod 通信。

总结

NetworkPolicy 是 Kubernetes 中用于控制 Pod 之间网络通信的强大工具。通过合理配置 NetworkPolicy,可以实现细粒度的网络访问控制,增强集群的安全性。

相关推荐
IT大白鼠5 小时前
Ingress 与 Ingress-Controller:K8s 七层 HTTP 反向代理技术详解与实践
http·容器·kubernetes
java_logo6 小时前
Docker 部署 Rocky Linux:轻松搭建 RHEL 兼容企业级基础镜像平台
linux·docker·容器·rocky linux·基础镜像·轩辕镜像·rhel 兼容
阿里云云原生9 小时前
论坛剧透丨当企业有 1000 个智能体后怎么跑怎么管?
云原生
Henry-SAP10 小时前
GPT-6Astra开启AI自主执行新时代
人工智能·云原生·sap·erp
IT大白鼠12 小时前
Istio 结合 K8s 实现流量管理:服务网格灰度、熔断、限流实战
云原生·kubernetes·istio
鹤落晴春12 小时前
【K8s】认识Kubernetes API:从CRD出发的一次梳理
云原生·容器·kubernetes
yanwumuxi14 小时前
Docker记录:误删宿主机挂载目录导致 PostgreSQL 数据丢失
docker·postgresql·容器
cui_hao_nan16 小时前
Docker 学习 5
docker·容器
A黄俊辉A16 小时前
两分钟上手docker
运维·docker·容器
努力努力再努力wz18 小时前
【Docker入门系列】:从架构演进到容器化:一文建立 Docker、虚拟化与 Namespace 的底层心智模型
运维·开发语言·数据结构·c++·docker·容器·架构