K8s 微服务容器网络规划规范

在 Kubernetes (K8s) 中,一个健壮的网络规划是构建高效、安全且可维护的微服务架构的基石。本指南将通过交互式的方式,带您了解 K8s 网络的核心概念和最佳实践,帮助您为微服务应用设计出色的网络方案。

本应用将引导您探索从基础的网络模型选择,到服务间的通信机制,再到至关重要的网络安全策略和可观测性建设。请使用顶部导航栏来探索不同主题,深入理解每个概念如何协同工作,共同构成一个强大的云原生网络环境。

1. 集群网络模型

K8s 的核心是一个**扁平网络模型**,要求集群中所有 Pod 都能通过 IP 地址直接通信,无需网络地址转换 (NAT)。为实现此模型,您需要选择一个容器网络接口 (CNI) 插件。不同的 CNI 插件在性能、功能和安全性上各有侧重。点击下方按钮比较主流的 CNI 插件。

Calico

Calico 是一个功能强大的网络和网络安全解决方案。它利用 BGP 协议在三层网络上路由数据包,性能极高。其最突出的特点是提供了丰富且精细的网络策略(Network Policy)功能,非常适合对安全有严格要求的生产环境。

  • 核心技术: BGP 协议
  • 最佳场景: 对网络安全和隔离有高要求的复杂环境。
  • 优点: 强大的网络策略,高性能,可扩展性好。

2. 服务发现与通信

在 K8s 中,Pod 的 IP 地址是动态变化的,不应直接用于通信。我们使用 **Service** 对象作为服务的稳定抽象。Service 提供一个固定的虚拟 IP(ClusterIP)和 DNS 名称,将流量转发到后端的 Pod。选择合适的 Service 类型对于服务的暴露至关重要。

ClusterIP

默认类型。在集群内部分配一个虚拟 IP,只能从集群内部访问。这是实现微服务之间通信的**首选方式**,确保了服务的内部隔离和安全。

[ Pod A ] ---> [ Service DNS ] ---> [ Cluster IP ] ---> [ Pod B ]

3. 网络安全策略 (Network Policy)

默认情况下,K8s 集群中所有 Pod 之间都可以自由通信,这存在安全风险。**Network Policy** 是一种定义 Pod 间访问规则的资源,是实现微服务网络隔离的“防火墙”。最佳实践是采用**默认拒绝**策略,然后按需开放必要的流量。

默认允许所有流量 启用默认拒绝策略

三层应用通信示意图

🌐 外部
Ingress
Frontend
Pod
Backend
Pod
Database
Pod

所有服务之间都可以自由通信,存在安全隐患。

潜在可利用的通信路径数量

4. 外部网络访问

将集群内部的服务暴露给外部网络,主要有两种方式:**Ingress** 和 **LoadBalancer** 类型的 Service。它们适用于不同的场景。

Ingress

Ingress 是管理外部访问的 API 对象,通常用于暴露 HTTP 和 HTTPS 服务。它工作在应用层(L7),可以根据主机名或 URL 路径将流量路由到不同的 Service,非常灵活。

  • 场景: 暴露多个 Web 服务,需要基于域名的虚拟主机。
  • 优点: 成本效益高(一个公网 IP 服务多个应用),配置灵活,支持 SSL 终止。
  • 需要: 集群中必须部署一个 Ingress 控制器(如 Nginx, Traefik)。

Service (LoadBalancer 类型)

当 Service 类型设置为 `LoadBalancer` 时,在云环境中,它会自动创建一个云厂商提供的外部负载均衡器。它工作在传输层(L4),将流量直接转发到 Service。

  • 场景: 暴露单个 TCP/UDP 服务,或需要直接使用云厂商 LB 的高级功能。
  • 优点: 简单直接,性能高,由云平台管理。
  • 缺点: 每个 Service 需要一个独立的公网 IP,成本较高。

5. 可观测性与故障排查

有效的网络可观测性对于维护微服务应用的健康至关重要。这包括对网络流量的监控、日志记录和快速的故障排查能力。

📈

网络流量监控

使用 Prometheus 收集网络指标(如流量、延迟、错误率),并通过 Grafana 进行可视化。这有助于主动发现性能瓶颈和异常行为。

📋

日志记录

确保 CNI 插件和 Ingress 控制器启用了详细的日志记录。将日志集中收集(如使用 EFK 或 Loki 栈),以便在出现连接问题时进行审计和排查。

🛠️

网络工具 Pod

在集群中常备一个包含常用网络工具(如 `ping`, `telnet`, `curl`, `nslookup`)的 "netshoot" Pod。这可以帮助您从集群内部的视角快速诊断连通性和 DNS 解析问题。