第278篇:K8s Ingress 与 Service Mesh 网络
关键词
Ingress Controller、Service Mesh、Istio、Sidecar、Envoy Proxy、流量管理、mTLS、可观测性
一、从 Service 到 Ingress
1.1 Service 的局限
Service 提供集群内服务的访问,但对南北向流量支持有限:
Service 访问方式对比:
┌──────────────────────────────────────────┐
│ Cluster IP │
│ 10.96.0.10:80 │
│ ┌─ 只有集群内部可访问 │
│ └─ 不能从外部访问 │
│ │
│ NodePort │
│ Node1:31080, Node2:31080 │
│ ┌─ 外部可访问 │
│ ├─ 端口范围固定(30000-32767) │
│ ├─ 每个 Service 占用节点端口 │
│ └─ 不适合生产环境(需配合 LB) │
│ │
│ LoadBalancer │
│ ┌─ 云厂商 LB + 公网 IP │
│ ├─ 每个 Service 一个 LB(成本高) │
│ └─ L4 负载均衡(7 层路由需 Ingress) │
└──────────────────────────────────────────┘
问题:
每个 Service 分配公网 IP → 成本高
无 URL 路由 → 只能按端口区分
无 TLS 终结 → 需要额外配置
无高级流量管理 → 无灰度发布/金丝雀
1.2 Ingress 的作用
Ingress——K8s 的 7 层流量入口:
| Internet 203.0.113.1:443 (HTTPS) ┌───┴──────────────────────────┐ | Ingress Controller (Nginx / Traefik / HAProxy) /api/ → Service A:8080 /web/ → Service B:80 /admin/* → Service C:8080 TLS 终结:证书管理 速率限制、IP 黑白名单 | |
|---|---|---|
Ingress 资源定义示例:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: ingressClassName: nginx tls: - hosts: - myapp.example.com secretName: myapp-tls rules: - host: myapp.example.com http: paths: - path: /api pathType: Prefix backend: service: name: api-service port: number: 8080 - path: / pathType: Prefix backend: service: name: web-service port: number: 80
二、Ingress Controller 对比
主流 Ingress Controller:
| 特性 | Nginx | Traefik | HAProxy | Kong |
|---|---|---|---|---|
| 性能(PPS) 配置热更新 支持 TCP/UDP 金丝雀发布 Service Mesh 可观测性 插件生态 配置方式 | 高 ✓ 部分 插件 关联 中 丰富 注解 | 中 ✓ ✓ ✓ 可选 强 丰富 CRD | 很高 ✓ ✓ ✓ 可选 中 有限 注解 | 中 ✓ ✓ ✓ K8s 插件 强 丰富 CRD |
生产环境推荐: Nginx Ingress Controller——最成熟、社区最大 Traefik——云原生、自动发现、简单配置 HAProxy——极致性能(40Gbps+)
三、Service Mesh 概述
3.1 Service Mesh 是什么
Service Mesh 是微服务通信的专用基础设施层,将网络功能从应用代码中剥离:
Service Mesh 架构:
没有 Service Mesh: | Pod A ┌─────────────────────────┐ | 微服务代码 + 重试/超时/熔断/发现 + TLS/认证 | | ← 网络逻辑在代码中 | | --- | --- | --- | --- |
有 Service Mesh(Sidecar): | Pod A ┌─────────────────────────┐ └──────────┬──────────────┘ ┌──────────┴──────────────┐ | 微服务代码(仅业务逻辑) localhost Sidecar Proxy(Envoy) 重试/超时/熔断/发现 mTLS/认证/可观测性 | | ← 网络逻辑剥离 ← 控制网络 | | --- | --- | --- | --- |
Service Mesh 的三大功能: 1. 流量管理——路由、灰度、熔断、重试 2. 安全——mTLS、RBAC、认证 3. 可观测性——指标、日志、链路追踪
3.2 Sidecar 代理
Sidecar 代理的数据流:
Pod A Pod B | 微服务 A connect("B",8080) ┌───┴────────┐ | Sidecar (Envoy) 截获所有 出入流量 | 微服务 B ┌───────────┐ | | | Sidecar (Envoy) 截获所有 出入流量 | | | --- | --- | --- | --- | --- | --- | --- | │ │ │ mTLS + HTTP/2 │ └──────────────────────────────┘
Envoy 代理的处理链: 入站流量: Ingress Listener → TLS → RBAC → 路由 → Cluster → 上游
出站流量:
Egress Listener → 路由 → Cluster → TLS → 上游
iptables 流量拦截: Pod 的流量被 iptables 规则透明重定向到 Sidecar 应用代码无需修改
四、Istio 架构
4.1 组件
Istio 是当前最流行的 Service Mesh 实现:
┌──────────────────────────────────────────┐ │ 控制面(istiod) │ │ │ │ Pilot —— 流量管理 │ │ Citadel —— 安全(证书签发) │ │ Galley —— 配置验证 │ └──────────────────┬───────────────────────┘ │ │ xDS API(发现配置) ▼ | 数据面(Envoy Proxy × N Pod) ┌─────┐ ┌─────┐ ┌─────┐ | Pod1 Envoy | | Pod2 Envoy | | Pod3 Envoy | | | --- | --- | --- | --- | --- | --- | --- |
Istio 资源:
VirtualService:流量路由规则 DestinationRule:负载均衡、熔断、TLS Gateway:南北向流量入口 ServiceEntry:外部服务注册 PeerAuthentication:服务间 mTLS AuthorizationPolicy:访问控制
4.2 流量管理示例
Istio 流量管理——金丝雀发布:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: myapp
spec:
hosts:
- myapp
http:
- match:
- headers:
version:
exact: v2 # Header: version=v2 → 新版本
route:
- destination:
host: myapp
subset: v2
- route:
- destination:
host: myapp
subset: v1
weight: 90 # 90% 流量到 v1
- destination:
host: myapp
subset: v2
weight: 10 # 10% 流量到 v2
---
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: myapp
spec:
host: myapp
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
outlierDetection:
consecutive5xxErrors: 5 # 熔断:5 次 5xx 断开
interval: 30s
baseEjectionTime: 60s
五、Service Mesh 的优势与代价
5.1 优势
Service Mesh 带来的核心价值:
1. 流量管理
金丝雀发布、蓝绿部署
基于 Header/Cookie 的路由
超时/重试/熔断/限流
2. 安全
服务间 mTLS(自动证书轮换)
细粒度授权(AuthorizationPolicy)
双向 TLS 认证
3. 可观测性
分布式追踪(Jaeger/Zipkin)
服务指标(Prometheus)
访问日志(结构化日志)
4. 无侵入
应用代码零修改
通过 Sidecar 透明注入
5.2 代价
Service Mesh 的代价:
- 性能开销 | 场景 | 无 Mesh | 有 Mesh | | --- | --- | --- | | 延迟 P50 CPU 开销 内存开销 | 1ms 0 0 | 2-3ms 5-10% 50MB/代理 |
每个 Pod 多一个 Envoy Sidecar 每个请求多两次代理跳转(入口 + 出口)
-
复杂度 引入新的控制面组件 运维团队需要学习 Istio CRD 排错复杂(多了一层代理)
-
资源消耗 100 Pod → 100 个 Envoy 实例 每个 Envoy 50MB 内存 总内存消耗:5GB
是否选择 Service Mesh: 小规模(< 20 微服务)→ 不需要(Spring Cloud 等方案足够) 中规模(20-100 微服务)→ 考虑引入 大规模(100+ 微服务)→ 强烈推荐
六、总结
| 知识点 | 核心要点 |
|---|---|
| Ingress | 7 层流量入口,URL 路由、TLS 终结、域名转发 |
| Ingress Controller | Nginx/Traefik/HAProxy/Kong,热更新、插件生态 |
| Service Mesh | 微服务通信基础设施层,剥离网络逻辑 |
| Sidecar | Envoy 代理透明拦截所有 Pod 流量 |
| Istio | 控制面(istiod)+ 数据面(Envoy) |
| 流量管理 | VirtualService + DestinationRule 定义路由规则 |
| mTLS | 服务间双向 TLS,自动证书管理 |
| 优势/代价 | 功能丰富 vs 性能开销 5-10% |
七、思考
- Ingress 和 Service Mesh 中的 Gateway 有什么异同?它们分别处理哪类流量?
- Sidecar 代理如何透明地拦截 Pod 的所有流量?iptables 转发规则是怎样的?
- Istio 的金丝雀发布如何实现?10% 的流量到 v2 是基于什么粒度(请求数/连接数)?
- Service Mesh 引入的性能开销主要来自哪里?延迟和资源消耗大约是多少?
- 在一个 200 个微服务的生产集群中,是否需要引入 Service Mesh?你的选择是什么,为什么?
下篇预告:第279篇《容器网络的多租户隔离方案》——K8s 集群中的多租户网络隔离需求,Namespace 隔离、网络策略、租户 VPC 方案与实践。