第六章 Server Mesh服务网格
一、服务网格核心概念
1.1 服务网格定义
作用:解决微服务间通信的复杂性,提供统一流量管理、安全认证、监控追踪等能力。
特点:
- 基础设施层透明代理(Sidecar模式)
- 与业务代码解耦
- 支持多语言服务治理
二、Istio架构详解
2.1 架构组成
- Pilot:流量管理核心,将路由规则转换为Envoy配置。
- Mixer:策略执行和指标收集(已逐渐被Telemetry V2替代)。
- Citadel:服务间TLS证书管理。
- Envoy:Sidecar代理,拦截所有进出流量。
三、Istio安装与Sidecar注入
3.1 自动注入配置
通过命名空间标签实现自动注入:
apiVersion: v1
kind: Namespace
metadata:
name: myapp
labels:
istio-injection: enabled # 关键标签
四、流量管理实战
4.1 请求路由(VirtualService)
场景:将80%流量分给v1版本,20%给v2。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
weight: 80
- destination:
host: reviews
subset: v2
weight: 20
4.2 熔断配置(DestinationRule)
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: httpbin
spec:
host: httpbin
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100 # 最大连接数
http:
http1MaxPendingRequests: 1000
maxRequestsPerConnection: 10
outlierDetection:
consecutiveErrors: 5 # 连续错误次数触发熔断
interval: 5s # 检测间隔
baseEjectionTime: 30s # 驱逐时间
五、故障注入与测试
5.1 注入HTTP延迟故障
http:
- fault:
delay:
percentage:
value: 10.0
fixedDelay: 5s
route:
- destination:
host: reviews
subset: v1
六、常见问题排查
6.1 Sidecar未注入
检查步骤:
- 确认命名空间标签
istio-injection=enabled
- 检查Pod描述中是否存在Envoy容器
- 查看Istiod日志错误信息
6.2 规则未生效
- 使用
istioctl analyze
验证配置语法 - 执行
istioctl proxy-config routes <pod> --name <route>
查看Envoy生效配置
通过以上图文详解,结合书中第六章的实操案例,你可以深入理解Istio在流量治理、故障恢复等方面的强大能力。建议在实验环境中逐步演练每种配置,并通过Istio Dashboard观察流量变化。
多选题
-
关于Istio架构,以下哪些组件属于控制平面?
A. Pilot
B. Envoy
C. Mixer
D. Citadel
E. Galley -
在Istio中,实现请求路由的配置资源包括哪些?
A. VirtualService
B. Deployment
C. DestinationRule
D. ServiceEntry
E. Pod -
以下哪些配置可以用于Istio熔断机制?
A.connectionPool.maxConnections
B.outlierDetection.consecutiveErrors
C.VirtualService.timeout
D.DestinationRule.loadBalancer
E.Service.spec.type
-
关于故障注入,以下哪些说法正确?
A. 延迟故障通过fault.delay
配置
B. HTTP终止故障通过fault.abort
配置
C. 故障注入在DestinationRule
中定义
D. 故障注入仅支持TCP协议
E. 故障注入会影响所有服务的流量 -
Istio速率限制的实现依赖哪些组件?
A. Mixer
B. Pilot
C. Quota实例
D. Handler配置
E. Citadel -
自动注入Sidecar的机制需要以下哪些条件?
A. 命名空间添加标签istio-injection=enabled
B. 手动修改Pod的YAML添加Sidecar容器
C. 启用Kubernetes的MutatingAdmissionWebhook
D. 使用kubectl apply -f
命令部署应用
E. 在Deployment中指定Istio版本 -
关于Istio安装,以下哪些步骤是必须的?
A. 下载并解压Istio发行包
B. 执行istioctl manifest apply --set profile=demo
C. 手动创建所有CRD(Custom Resource Definitions)
D. 重启Kubernetes集群
E. 为命名空间启用自动Sidecar注入 -
在流量管理中,如何实现按权重分流请求?
A. 在VirtualService
中配置route.weight
B. 在DestinationRule
中定义subsets
C. 使用HTTPMatchRequest
匹配请求头
D. 通过Gateway
配置入口流量
E. 设置loadBalancer.simple
为ROUND_ROBIN
-
以下哪些是Istio的流量管理功能?
A. 金丝雀发布
B. 服务熔断
C. 请求重试
D. 日志聚合
E. 链路加密 -
关于Istio的Sidecar代理Envoy,正确的描述是?
A. 每个Pod中运行一个Envoy容器
B. Envoy负责服务发现和负载均衡
C. Envoy拦截所有进出Pod的流量
D. Envoy仅处理HTTP协议
E. Envoy配置由Pilot动态下发
答案与详解
-
ACDE
- Istio控制平面包括Pilot(流量管理)、Mixer(策略和遥测)、Citadel(安全)、Galley(配置管理)。Envoy(B)是数据平面组件。
-
ACD
- VirtualService(A)定义路由规则,DestinationRule(C)配置目标策略,ServiceEntry(D)用于添加外部服务。Deployment(B)和Pod(E)是K8s资源,与路由无关。
-
AB
- 熔断通过
DestinationRule
的connectionPool
(A)和outlierDetection
(B)配置。timeout
(C)是超时设置,loadBalancer
(D)是负载均衡策略,Service类型(E)无关。
- 熔断通过
-
AB
- 延迟故障由
fault.delay
(A)配置,终止故障由fault.abort
(B)配置,且需在VirtualService
(C错误)中定义。支持HTTP(D错误),且可针对特定流量(E错误)。
- 延迟故障由
-
ACD
- 速率限制通过Mixer(A)的Quota实例(C)和Handler(D)实现。Pilot(B)负责流量管理,Citadel(E)负责安全。
-
AC
- 自动注入需要命名空间标签
istio-injection=enabled
(A)和启用MutatingAdmissionWebhook(C)。手动修改(B)是手动注入方式。
- 自动注入需要命名空间标签
-
ABE
- 必须下载Istio(A)、使用
istioctl
安装(B),并启用Sidecar注入(E)。CRD(C)由安装工具自动创建,重启集群(D)非必需。
- 必须下载Istio(A)、使用
-
AB
- 权重分流在
VirtualService
的route.weight
(A)配置,结合DestinationRule
的subsets
(B)。其他选项与权重无关。
- 权重分流在
-
ABC
- 流量管理包括金丝雀发布(A)、熔断(B)、重试(C)。日志(D)和加密(E)是其他模块功能。
-
ABCE
- Envoy(A)每个Pod一个,负责服务发现(B)、拦截流量(C),配置由Pilot下发(E)。Envoy支持多协议(D错误)。