七层网络的瑞士军刀 - 服务网格 Istio 流量管理
第一部分:Istio 流量管理的核心资源
在我们动手之前,必须先了解 Istio 用来指挥交通的“三大法宝”。作为用户,我们通过创建和修改这些 Kubernetes CRD,来向 Istio 的控制平面 istiod
表达我们的意图。
1. Gateway
- 网格的入口
- 作用:
Gateway
负责管理进出服务网格边缘的流量。你可以把它看作是 Istio 世界里,功能更强大的Ingress
。它定义了网格边缘的监听端口、协议和 TLS 证书。 - 它定义了“什么流量可以进来”,但它不关心这些流量进来之后要去哪里。
2. VirtualService
- 智能的路由规则
- 作用: 这是 Istio 中最核心、最强大的流量路由资源。它定义了流量在进入网格之后,应该如何被路由。
- 它定义了“流量要去哪里”。它可以基于丰富的 L7 属性(如 HTTP Host 头、URI 路径、请求头、gRPC 方法等)来制定极其精细的路由规则。它的核心能力包括:
- 流量切分 (Traffic Splitting): 将流量按百分比分配到不同的服务版本(金丝雀发布的核心)。
- 重写和重定向: 修改 URL 路径或 Host 头。
- 超时和重试: 为请求配置统一的超时和重试策略。
- 故障注入: 主动注入延迟或 HTTP 错误。
3. DestinationRule
- 路由之后的目的地策略
- 作用:
DestinationRule
定义了当流量已经被VirtualService
路由到某个具体服务后,应该如何与这个服务的 Pod 实例进行交互。它配置的是客户端(发起请求的那个 Sidecar)的行为。 - 它定义了“到达目的地后该怎么做”。它的核心能力包括:
- 定义服务子集 (Subsets): 这是它最重要的功能。通过 Pod 的标签,我们可以将一个服务的所有 Pod 分成不同的“版本子集”,例如
v1
,v2
。然后VirtualService
就可以将流量路由到这些具名的子集上。 - 连接池管理: 配置最大连接数、请求数等。
- 负载均衡策略: 配置轮询、随机等负载均衡算法。
- 异常点检测 (Outlier Detection): 自动将持续出错的 Pod 实例从负载均衡池中暂时移除。
- 定义服务子集 (Subsets): 这是它最重要的功能。通过 Pod 的标签,我们可以将一个服务的所有 Pod 分成不同的“版本子集”,例如
三者关系: Gateway
守住大门 -> VirtualService
根据规则进行智能分流 -> 流量被导向 DestinationRule
中定义的具体服务子集。
第二部分:动手实战:实现金丝雀发布
前提: 一个已安装 Istio 的 Kubernetes 集群。你可以参考 Istio 官方文档 进行快速安装。
1. 部署一个多版本的应用
我们需要一个应用,它有两个版本 v1
和 v2
。
# echoserver-app.yaml
apiVersion: v1
kind: Service
metadata: {
name: echoserver-svc}
spec:
selector: {
app: echoserver}
ports: [{
port: 80, targetPort: 8080}]
---
apiVersion: apps/v1
kind: Deployment
metadata: {
name: echoserver-v1-deploy}
spec:
replicas: 1
selector: {
matchLabels: {
app