k8s中的NetworkPolicy使用详解

 更新时间:2025年10月14日 09:37:36   作者:火星MARK  
这篇文章主要介绍了k8s中的NetworkPolicy使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

在 Kubernetes (k8s) 中,NetworkPolicy 是一种用于控制 Pod 之间网络流量的资源对象,它基于 Pod 标签(Labels)和命名空间(namespace)来定义网络访问规则,实现了对 Pod 进出流量的精细化控制。

核心作用

  • 隔离网络流量:默认情况下,k8s 集群中所有 Pod 之间可以自由通信,NetworkPolicy 可限制这种通信,只允许符合规则的流量通过。
  • 定义访问策略:通过规则指定 “哪些 Pod 可以被谁访问” 或 “哪些 Pod 可以访问谁”。
  • 增强安全性:遵循最小权限原则,只开放必要的网络访问,减少攻击面。

工作原理

NetworkPolicy 依赖 网络插件(CNI) 实现(如 Calico、Cilium、Weave Net 等),不同插件对策略的支持可能存在差异。

其核心逻辑是:

  1. 基于 Pod 标签和命名空间筛选目标 Pod(策略作用的对象)。
  2. 对目标 Pod 的入站(Ingress)和出站(Egress)流量定义允许 / 拒绝规则。
  3. 规则匹配的维度包括:源 / 目标 Pod 标签、命名空间标签、IP 地址段、端口等。

关键概念

Pod 选择器(podSelector)用于指定策略作用于哪些 Pod(通过标签匹配)。若为空,则匹配命名空间内所有 Pod。

命名空间选择器(namespaceSelector)用于匹配特定命名空间(通过标签),常与 podSelector 结合使用,限定跨命名空间的流量。

入站规则(Ingress)控制流入目标 Pod 的流量,可定义:

  • 允许的源(来自哪些 Pod / 命名空间 / IP)。
  • 允许的端口和协议(TCP/UDP/SCTP)。

出站规则(Egress)控制从目标 Pod 流出的流量,可定义:

  • 允许的目标(到哪些 Pod / 命名空间 / IP)。
  • 允许的端口和协议。

默认策略

  • 若未定义任何 NetworkPolicy,所有流量默认允许。
  • 若定义了策略,未被规则允许的流量将被默认拒绝。

基本示例

1. 拒绝所有入站流量(默认拒绝)

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-ingress
  namespace: default
spec:
  podSelector: {}  # 匹配命名空间内所有 Pod
  policyTypes:
  - Ingress  # 只控制入站流量

该策略会拒绝 default 命名空间内所有 Pod 的入站流量(无任何允许规则)。

2. 允许特定 Pod 访问

假设有标签为 app: frontend 的 Pod 需要访问标签为 app: backend 的 Pod(端口 8080):

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: backend-allow-frontend
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: backend  # 策略作用于 backend Pod
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend  # 允许 frontend Pod 访问
    ports:
    - protocol: TCP
      port: 8080  # 只允许 8080 端口

3. 允许跨命名空间访问

允许 prod 命名空间(标签 env: prod)中的 Pod 访问 default 命名空间中 app: db 的 Pod(端口 5432):

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: db-allow-prod
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: db
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          env: prod  # 匹配 prod 命名空间
    ports:
    - protocol: TCP
      port: 5432

4. 控制出站流量

限制 app: backend 的 Pod 只能访问 app: db 的 Pod(端口 5432)和外部 IP 段 10.0.0.0/24

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: backend-egress-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
  - Egress
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: db
    ports:
    - protocol: TCP
      port: 5432
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24  # 允许访问该 IP 段

注意事项

  1. 顺序无关:NetworkPolicy 规则没有优先级,只要有一条规则匹配,流量就会被允许。
  2. 命名空间隔离:策略仅作用于所在命名空间的 Pod,跨命名空间需通过 namespaceSelector 配置。
  3. 状态性:部分网络插件(如 Calico)支持基于连接状态的规则(如允许已建立的连接)。
  4. 默认策略建议:生产环境中通常先配置 “默认拒绝所有流量”,再按需开放必要规则,即 “白名单模式”。

通过 NetworkPolicy,Kubernetes 实现了 Pod 级别的网络隔离,是构建安全集群网络的核心工具之一。实际使用时需结合具体网络插件的特性进行配置。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • kubernetes日志备份解决ELK中日志丢失问题

    kubernetes日志备份解决ELK中日志丢失问题

    这篇文章主要为大家介绍了kubernetes日志备份方案的细节探究分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • k8s跨服务调用入门到实战示例详解

    k8s跨服务调用入门到实战示例详解

    这篇文章主要为大家介绍了k8s跨服务调用入门到实战示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • kubeadm部署k8s集群全过程

    kubeadm部署k8s集群全过程

    本文详细描述了如何在VMware虚拟机上基于CentOS8操作系统搭建Kubernetes集群,包括环境准备、Docker安装、Kubernetes组件安装、网络插件配置以及KuboardUI的安装和访问
    2025-01-01
  • k8s容器反复重启问题及解决

    k8s容器反复重启问题及解决

    这篇文章主要介绍了k8s容器反复重启问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-07-07
  • k8s搭建nfs共享存储实践

    k8s搭建nfs共享存储实践

    本文介绍NFS服务端搭建与客户端配置,涵盖安装工具、目录设置及服务启动,随后讲解K8S中NFS动态存储部署,包括创建命名空间、ServiceAccount、RBAC权限和StorageClass,实现存储验证
    2025-09-09
  • 举例详解k8s是如何实现自动扩缩的

    举例详解k8s是如何实现自动扩缩的

    Kubernetes(简称k8s)是一个开源的,用于自动部署、扩展和管理容器化应用程序的系统,这篇文章主要介绍了k8s是如何实现自动扩缩的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-07-07
  • CentOS 7.9 升级内核 kernel-ml-5.6.14版本的方法

    CentOS 7.9 升级内核 kernel-ml-5.6.14版本的方法

    这篇文章主要介绍了CentOS 7.9 升级内核 kernel-ml-5.6.14版本,默认内核版本为3.10.0,现升级到 5.6.14 版本,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • 在AWS-EC2中安装Minikube集群的详细过程

    在AWS-EC2中安装Minikube集群的详细过程

    这篇文章主要介绍了在AWS-EC2中安装Minikube集群,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • 详解Rainbond云原生平台简化Kubernetes业务问题排查

    详解Rainbond云原生平台简化Kubernetes业务问题排查

    这篇文章主要介绍了详解Rainbond云原生平台简化Kubernetes业务问题排查,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • KVM虚拟化技术之virt-manager使用及KVM虚拟化平台网络模型介绍

    KVM虚拟化技术之virt-manager使用及KVM虚拟化平台网络模型介绍

    这篇文章主要介绍了KVM虚拟化技术之virt-manager使用及KVM虚拟化平台网络模型介绍,需要的朋友可以参考下
    2016-10-10

最新评论