文章目录
Kubernetes 基本网络模型
Kubernetes 网络模型定义了 Pod、节点和服务之间的网络通信规则和要求。其目标是为容器化应用提供一致、灵活的网络环境。
基本要求
-
每个 Pod 有唯一的 IP 地址:
- Kubernetes 分配给每个 Pod 一个独立的 IP 地址(Pod IP),Pod 内的所有容器共享这个网络命名空间(netns)。
- Pod 可以直接通过 IP 地址与其他 Pod 通信,无需 NAT。
-
所有 Pod 都可以直接相互通信:
- 不论 Pod 是否在同一节点上,都可以通过 Pod IP 实现无障碍通信。
-
节点上的所有 Pod 可以访问外部网络:
- Kubernetes 提供出口 NAT(SNAT),使 Pod 可以访问集群外部资源。
-
服务抽象(Service)提供了 Pod 的稳定访问:
- Kubernetes 使用 ClusterIP、NodePort 或 LoadBalancer 等机制,确保服务可以被其他服务或外部流量访问。
Kubernetes 网络实现的三个层次
- Node-to-Node 通信:
- 不同节点上的 Pod 能够通过 Overlay 网络或路由实现直接通信。
- Pod-to-Pod 通信:
- 在同一节点或跨节点,Pod 可以通过虚拟网络接口(veth pair)或其他网络插件实现通信。
- Service-to-Pod 通信:
- 服务通过 kube-proxy 或其他负载均衡机制将流量路由到目标 Pod。
Netns 探秘
Linux 的网络命名空间(Netns)是实现 Kubernetes 网络隔离的核心机制。
Netns 的定义
- Netns 是 Linux 内核的一种隔离机制,它允许创建多个独立的网络堆栈实例,包括网络接口、路由表、iptables 等。
- 每个容器或 Pod 都运行在一个独立的 Netns 中,实现网络环境的隔离。
Netns 的工作原理
-
主机网络命名空间(Root Netns):
- 主机的默认网络命名空间,包含所有物理网卡和主机的网络堆栈。
-
容器网络命名空间:
- 每个容器有自己的网络命名空间,内含虚拟网络接口(veth pair),通过它与宿主机或其他网络命名空间通信。
-
veth pair 机制:
- veth pair 是一对虚拟网络接口,类似一根网线的两端,一端连接容器的 Netns,另一端连接主机或网络插件。
- 数据包在容器与主机之间通过 veth pair 传递。
-
CNI 插件与 Netns:
- Kubernetes 使用 CNI(Container Network Interface) 插件创建和配置容器的网络命名空间。
- 插件会负责为容器分配 IP 地址、设置路由和防火墙规则。
主流网络方案简介
Kubernetes 提供了网络插件架构,支持多种第三方网络方案来满足不同场景需求。
主流网络方案
-
Flannel:
- 特点:简单、轻量级的 Overlay 网络,适合小型集群。
- 实现方式:使用 VXLAN 或 Host-GW 进行 Pod 网络的 Overlay 实现。
- 场景:适用于简单的 Pod 网络隔离场景。
-
Calico:
- 特点:高性能的路由网络,支持网络策略(Network Policy),无 Overlay。
- 实现方式:基于 BGP 实现路由分发,也支持 eBPF。
- 场景:高性能、大规模集群,复杂的网络策略需求。
-
Cilium:
- 特点:基于 eBPF 技术,性能优越,支持动态流量管理和细粒度的安全控制。
- 实现方式:通过 eBPF 实现网络数据包的拦截和处理。
- 场景:需要高性能和复杂网络安全控制的环境。
-
Weave Net:
- 特点:支持跨云平台的 Overlay 网络,自动发现节点和 Pod。
- 实现方式:通过 VXLAN 实现 Pod 网络连接。
- 场景:多云环境或需要简单配置的场景。
-
Kube-Router:
- 特点:集成网络路由、服务代理和网络策略功能的插件。
- 实现方式:基于 IPVS 提供高效路由。
- 场景:对路由和服务代理性能要求较高的集群。
-
NSX-T(VMware 提供):
- 特点:企业级网络方案,支持多租户和高级网络功能。
- 实现方式:通过虚拟化和软件定义网络(SDN)技术实现。
- 场景:需要多租户和复杂网络控制的企业环境。
Network Policy 的用处
Network Policy 是 Kubernetes 提供的一种网络安全机制,用于控制 Pod 之间的网络通信以及 Pod 与外部服务的访问。
Network Policy 的功能
-
限制 Pod 间的流量:
- 默认情况下,Kubernetes 中 Pod 之间是完全开放的。通过 Network Policy,可以限制哪些 Pod 可以与特定 Pod 通信。
-
管理 Pod 与外部网络的访问:
- 可以定义规则控制 Pod 是否允许访问外部网络或被外部网络访问。
-
提高集群的安全性:
- 防止未经授权的访问和潜在的网络攻击,尤其在多租户环境中。
-
实现多租户隔离:
- 在同一个集群中,确保不同租户的 Pod 流量彼此隔离。
Network Policy 的主要组件
-
Pod Selector:
- 定义哪些 Pod 受该策略影响。
-
Ingress(入站规则):
- 定义允许哪些流量进入受策略影响的 Pod。
-
Egress(出站规则):
- 定义允许哪些流量从受策略影响的 Pod 发出。
-
规则作用范围:
- 规则可以基于命名空间、IP 地址范围、标签等。
示例
以下示例定义了一个 Network Policy,允许某些 Pod(具有 app: frontend
标签)只能接收来自 app: backend
的流量:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-backend
namespace: default
spec:
podSelector:
matchLabels:
app: frontend
ingress:
- from:
- podSelector:
matchLabels:
app: backend
总结
- Kubernetes 网络模型 强调 Pod IP 的统一性和直接通信,支持通过 CNI 插件实现灵活的网络架构。
- Netns 提供容器化环境下的网络隔离能力,通过 veth pair 和 CNI 插件实现连接。
- 主流网络方案(如 Flannel、Calico、Cilium)提供多样化选择,以适应不同的集群规模和性能需求。
- Network Policy 是实现网络安全的核心工具,用于精细控制 Pod 的网络流量,提高集群的安全性和隔离性。