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,可以实现细粒度的网络访问控制,增强集群的安全性。

相关推荐
無名之輩16 分钟前
Nvidia Device Plugin入门二之envvar策略
kubernetes
云和数据.ChenGuang2 小时前
微服务技术栈
微服务·云原生·架构
syty20202 小时前
K8s是什么
容器·kubernetes·dubbo
江团1io03 小时前
微服务雪崩问题与系统性防御方案
微服务·云原生·架构
Evan Wang4 小时前
使用Terraform管理阿里云基础设施
阿里云·云原生·terraform
向上的车轮5 小时前
基于go语言的云原生TodoList Demo 项目,验证云原生核心特性
开发语言·云原生·golang
灵犀物润5 小时前
Kubernetes 配置检查与发布安全清单
安全·容器·kubernetes
360智汇云6 小时前
k8s交互桥梁:走进Client-Go
golang·kubernetes·交互
xy_recording6 小时前
Day20 K8S学习
学习·容器·kubernetes
衍余未了6 小时前
k8s 内置的containerd配置阿里云个人镜像地址及认证
java·阿里云·kubernetes