WEBKT

精细化掌控:Kubernetes NetworkPolicy限制Pod间通信实战指南

20 0 0 0

精细化掌控:Kubernetes NetworkPolicy限制Pod间通信实战指南

什么是 NetworkPolicy?

NetworkPolicy 的核心概念

如何定义 NetworkPolicy 规则

拒绝所有流量的默认策略

实际案例:限制数据库 Pod 的访问

进阶用法:使用 Namespace Selector

总结

精细化掌控:Kubernetes NetworkPolicy限制Pod间通信实战指南

在云原生应用的世界里,Kubernetes (K8s) 已经成为了容器编排的事实标准。随着应用规模的增长,集群内部的网络安全也变得越来越重要。默认情况下,Kubernetes 集群中的所有 Pod 都可以相互通信,这在某些情况下可能会带来安全风险。例如,一个被攻破的 Pod 可能会横向渗透到其他 Pod,扩大攻击范围。

这时候,Kubernetes 的 NetworkPolicy 就派上用场了。它允许你定义 Pod 之间的网络流量规则,实现更精细化的网络隔离,只允许特定的 Pod 之间进行通信,从而提高集群的安全性。

什么是 NetworkPolicy?

NetworkPolicy 是一种 Kubernetes API 对象,它定义了 Pod 之间以及 Pod 与网络端点之间的允许的网络策略。你可以使用 NetworkPolicy 来控制哪些 Pod 可以访问哪些 Pod,以及哪些流量可以进入或离开 Pod。

需要注意的是,NetworkPolicy 本身只是一个策略定义,它需要由网络插件(例如 Calico, Cilium, Weave Net 等)来实现。因此,在使用 NetworkPolicy 之前,请确保你的 Kubernetes 集群已经安装并配置了支持 NetworkPolicy 的网络插件。

NetworkPolicy 的核心概念

在深入了解如何使用 NetworkPolicy 之前,我们需要先了解几个核心概念:

  • Pod Selector: NetworkPolicy 使用 Pod Selector 来选择应用策略的 Pod。你可以使用 matchLabelsmatchExpressions 来匹配 Pod 的标签。
  • Ingress: Ingress 规则定义了允许哪些流量进入 Pod。你可以指定允许来自哪些 Pod、哪些命名空间或哪些 IP 地址段的流量。
  • Egress: Egress 规则定义了允许 Pod 发出哪些流量。你可以指定允许 Pod 访问哪些 Pod、哪些命名空间或哪些 IP 地址段。
  • Policy Types: NetworkPolicy 可以指定 IngressEgress 或两者都指定。如果只指定 Ingress,则只应用 Ingress 规则。如果只指定 Egress,则只应用 Egress 规则。如果两者都指定,则同时应用 Ingress 和 Egress 规则。

如何定义 NetworkPolicy 规则

NetworkPolicy 的定义使用 YAML 格式,以下是一个简单的 NetworkPolicy 示例:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-app-a
namespace: default
spec:
podSelector:
matchLabels:
app: app-b # 应用此策略的 Pod,拥有 app=app-b 标签
policyTypes:
- Ingress # 指定策略类型为 Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: app-a # 允许来自拥有 app=app-a 标签的 Pod 的流量
ports:
- protocol: TCP
port: 8080 # 允许 TCP 8080 端口的流量

这个 NetworkPolicy 名为 allow-from-app-a,它应用到 default 命名空间下所有具有 app=app-b 标签的 Pod 上。它只允许来自具有 app=app-a 标签的 Pod 的 TCP 8080 端口的流量进入。

规则详解:

  • apiVersionkind 指定了 API 版本和对象类型。
  • metadata.name 指定了 NetworkPolicy 的名称。
  • metadata.namespace 指定了 NetworkPolicy 所属的命名空间。
  • spec.podSelector 使用 matchLabels 来选择应用策略的 Pod。在这个例子中,选择了所有具有 app=app-b 标签的 Pod。
  • spec.policyTypes 指定了策略类型。在这个例子中,只指定了 Ingress,表示只应用 Ingress 规则。
  • spec.ingress 定义了 Ingress 规则。from 字段指定了允许的流量来源。在这个例子中,允许来自具有 app=app-a 标签的 Pod 的流量。ports 字段指定了允许的端口和协议。在这个例子中,允许 TCP 8080 端口的流量。

拒绝所有流量的默认策略

为了实现更严格的网络隔离,你可以先创建一个默认拒绝所有流量的 NetworkPolicy。这样,只有显式允许的流量才能通过,可以有效防止未授权的访问。

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

这个 NetworkPolicy 名为 default-deny,它应用到 default 命名空间下所有 Pod 上(podSelector: {} 表示选择所有 Pod)。它同时指定了 IngressEgress 策略类型,但没有定义任何 ingressegress 规则。这意味着它会拒绝所有进入和离开 Pod 的流量。

注意: 在应用 default-deny 策略之前,请确保你已经创建了允许必要流量的 NetworkPolicy,否则可能会导致应用无法正常工作。

实际案例:限制数据库 Pod 的访问

假设你的 Kubernetes 集群中有一个数据库 Pod,你只想允许特定的应用 Pod 访问它。你可以使用 NetworkPolicy 来实现这个目标。

  1. 创建数据库 Pod:
apiVersion: v1
kind: Pod
metadata:
name: db-pod
namespace: default
labels:
app: database
spec:
containers:
- name: db
image: busybox
ports:
- containerPort: 3306

这个 Pod 名为 db-pod,它有一个标签 app=database,并且监听 3306 端口。

  1. 创建应用 Pod:
apiVersion: v1
kind: Pod
metadata:
name: app-pod
namespace: default
labels:
app: application
spec:
containers:
- name: app
image: busybox
command: ['sleep', '3600']

这个 Pod 名为 app-pod,它有一个标签 app=application

  1. 创建 NetworkPolicy 允许应用 Pod 访问数据库 Pod:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-app-to-db
namespace: default
spec:
podSelector:
matchLabels:
app: database # 应用到拥有 app=database 标签的 Pod 上
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: application # 允许来自拥有 app=application 标签的 Pod 的流量
ports:
- protocol: TCP
port: 3306 # 允许 TCP 3306 端口的流量

这个 NetworkPolicy 名为 allow-app-to-db,它应用到所有具有 app=database 标签的 Pod 上,并且只允许来自具有 app=application 标签的 Pod 的 TCP 3306 端口的流量进入。

现在,只有 app-pod 可以访问 db-pod 的 3306 端口。其他 Pod 尝试访问 db-pod 的 3306 端口将会被拒绝。

进阶用法:使用 Namespace Selector

除了使用 Pod Selector,你还可以使用 Namespace Selector 来指定允许的流量来源或目标。这在你需要允许来自整个命名空间的流量时非常有用。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-namespace
namespace: default
spec:
podSelector:
matchLabels:
app: app-b
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
environment: production # 允许来自具有 environment=production 标签的命名空间的流量
ports:
- protocol: TCP
port: 8080

这个 NetworkPolicy 允许来自具有 environment=production 标签的命名空间中的所有 Pod 访问具有 app=app-b 标签的 Pod 的 TCP 8080 端口。

总结

NetworkPolicy 是 Kubernetes 中一个强大的网络安全工具,它可以帮助你实现更精细化的网络隔离,提高集群的安全性。通过定义 IngressEgress 规则,你可以控制哪些 Pod 可以访问哪些 Pod,以及哪些流量可以进入或离开 Pod。掌握 NetworkPolicy 的使用方法,对于构建安全可靠的 Kubernetes 集群至关重要。

希望本文能够帮助你理解并掌握 NetworkPolicy 的配置方法,并在你的 Kubernetes 集群中应用起来。记住,安全无小事,防患于未然!

网络安全小能手 KubernetesNetworkPolicy网络安全

评论点评

打赏赞助
sponsor

感谢您的支持让我们更好的前行

分享

QRcode

https://www.webkt.com/article/10081