VirtualService - 日理万妓 2022-10-10 13:55 33阅读 0赞 ### VirtualService ### 影响流量路由的配置。以下是一些术语,可在流量路由的上下文中进行定义。 `Service` 通常是绑定到服务注册表中唯一名称的应用程序行为的单元。服务包含多个网络 `Endpoints`,这些 `EndPoints` 由 `Pod`、容器、VM 等上运行的工作负载实例实现。 `Service Version` 即服务的版本。每个服务都有一个包含其所有实例的默认版本。在连续部署中,对于给定的服务,可能存在运行应用程序二进制文件的不同变体的实例的不同子集。这些变体不一定是不同的 API 版本,它们可能是对同一服务的迭代更改,部署在不同的环境(产品,阶段,开发等)中。发生这种情况的常见方案包括 A/B 测试、金丝雀发布等,可以根据各种标准(`headers`,`URL` 等)和 `/` 或通过分配给每个版本的权重来决定特定版本的选择。 Source 资源,即调用 Service 的下游客户端 Host 客户端尝试连接 Service 时使用的地址 Access model 应用程序仅寻址目标服务(主机),而无需了解各个服务版本(子集)。版本的实际选择由 proxy/sidecar 决定,从而使应用程序代码能够与依赖服务解耦 VirtualService 定义了一组寻址主机时应用的流量路由规则。每个路由规则都为特定协议的流量定义了匹配条件,如果流量匹配,则将其发送到注册表中定义的命名目标服务(或其子集/版本) 在路由规则中也可以匹配流量的来源,允许为特定的客户端上下文自定义路由。 下面的示例中,默认情况下将所有 HTTP 流量路由到带有标签 `version: v1` 的 `reviews` 服务的 `Pod`。此外,路径以 `/wpcatalog/` 或 `/consumercatalog/` 开头的 HTTP 请求将被重写为 `/newcatalog`,并发送到标签为 `version: v2` 的 `reviews` 服务的 `Pod`。 apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews-route spec: hosts: - reviews.prod.svc.cluster.local http: - name: "reviews-v2-routes" match: - uri: prefix: "/wpcatalog" - uri: prefix: "/consumercatalog" rewrite: uri: "/newcatalog" route: - destination: host: reviews.prod.svc.cluster.local subset: v2 - name: "reviews-v1-route" route: - destination: host: reviews.prod.svc.cluster.local subset: v1 路由目标的 `subset`/`version` 是通过引用给定服务子集来标识的,该服务的 `subset`/`version` 必须在相应的 `DestinationRule` 中声明。 apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: reviews-destination spec: host: reviews.prod.svc.cluster.local subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 -------------------- ### CorsPolicy ### 描述给定服务的跨域资源共享(CORS)策略。 下面的示例中,将跨源请求限制为来自 `example.com` 使用 HTTP `POST/GET` 的请求,并将 `Access-Control-Allow-Credentials` `header` 设置 为 `false`。此外,它仅暴露 `X-Foo-bar` `header`,并将有效期设置为1天。 apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: ratings-route spec: hosts: - ratings.prod.svc.cluster.local http: - route: - destination: host: ratings.prod.svc.cluster.local subset: v1 corsPolicy: allowOrigin: - example.com allowMethods: - POST - GET allowCredentials: false allowHeaders: - X-Foo-Bar maxAge: "24h" <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>allowOrigin</code></td> <td><code>string[]</code></td> <td>允许执行 CORS 请求的来源列表。内容会被序列化到 <code>Access-Control-Allow-Origin</code> <code>header</code> 中。通配符 <code>*</code> 允许所有来源</td> <td>否</td> </tr> <tr> <td><code>allowMethods</code></td> <td><code>string[]</code></td> <td>允许访问资源的 HTTP 方法列表。内容会被序列化到 <code>Access-Control-Allow-Methods</code> <code>header</code> 中</td> <td>否</td> </tr> <tr> <td><code>allowHeaders</code></td> <td><code>string[]</code></td> <td>请求资源时可以使用的 HTTP <code>header</code> 列表。会序列化为 <code>Access-Control-Allow-Headers</code> <code>header</code></td> <td>否</td> </tr> <tr> <td><code>exposeHeaders</code></td> <td><code>string[]</code></td> <td>允许浏览器访问的 HTTP <code>header</code> 的白名单列表。会序列化为 <code>Access-Control-Expose-Headers</code> <code>header</code></td> <td>否</td> </tr> <tr> <td><code>maxAge</code></td> <td><code>Duration</code></td> <td>指定可以将预检请求的结果缓存多长时间。会转换为 <code>Access-Control-Max-Age</code> <code>header</code></td> <td>否</td> </tr> <tr> <td><code>allowCredentials</code></td> <td><code>BoolValue</code></td> <td>指定是否允许调用者使用凭据发送实际请求(而不是预检请求)。会转换为 <code>Access-Control-Allow-Credentials</code> <code>header</code></td> <td>否</td> </tr> </tbody> </table> -------------------- ### Destination ### `Destination` 表示在处理路由规则之后,请求/连接将被发送到的网络可寻址服务。`destination.host` 应该明确引用服务注册表中的服务。Istio 的服务注册表由平台的服务注册表中找到的所有服务(如 `Kubernetes services`、`Consul services`)以及通过 `ServiceEntry` 资源声明的服务组成。 Kubernetes 需要注意:当使用短名称(如使用 `reviews` 而不是 `reviews.default.svc.cluster.local`)时,Istio 将根据规则的命名空间而不是服务的命名空间来解析短名称。包含 `reviews` 主机的 `default` 命名空间中的规则将被解析为 `reviews.default.svc.cluster.local`,而与 `reviews` 服务的实际命名空间无关。为避免潜在的错误配置,建议使用完全限定的域名而不是短名称。 下面的 Kubernetes 示例中,默认将所有流量路由到版本 `v1` 的 `reviews` 服务的 `Pod`,以及将某些流量路由到版本 `v2` 的 `reviews` 服务的 `Pod`。 apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews-route namespace: foo spec: hosts: - reviews # interpreted as reviews.foo.svc.cluster.local http: - match: - uri: prefix: "/wpcatalog" - uri: prefix: "/consumercatalog" rewrite: uri: "/newcatalog" route: - destination: host: reviews # interpreted as reviews.foo.svc.cluster.local subset: v2 - route: - destination: host: reviews # interpreted as reviews.foo.svc.cluster.local subset: v1 相应的 `DestinationRule` 如下: apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: reviews-destination namespace: foo spec: host: reviews # interpreted as reviews.foo.svc.cluster.local subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 下面示例中 的 `VirtualService` 将 Kubernetes 中对 `productpage.prod.svc.cluster.local` 服务的所有调用的超时设置为 5 秒。注意此规则中未定义任何子集,Istio 将从服务注册表中获取 `productpage.prod.svc.cluster.local` 服务的所有实例,并填充 `Sidecar` 的负载均衡池。 另外,该规则是在 `istio-system` 命名空间中设置的,但是使用了 `productpage` 服务的完全限定域名 `productpage.prod.svc.cluster.local`。因此,规则的命名空间对解析 `productpage` 服务的名称没有影响。 apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: my-productpage-rule namespace: istio-system spec: hosts: - productpage.prod.svc.cluster.local # ignores rule namespace http: - timeout: 5s route: - destination: host: productpage.prod.svc.cluster.local 要控制绑定到网格外部服务的流量的路由,必须先使用 `ServiceEntry` 资源将外部服务添加到 Istio 的内部服务注册表中,然后可以定义 `VirtualService`,以控制绑定到这些外部服务的流量。 下面的示例中,为 `wikipedia.org` 定义了一项服务,并为 HTTP 请求设置了 5 秒的超时时间。 apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: external-svc-wikipedia spec: hosts: - wikipedia.org location: MESH_EXTERNAL ports: - number: 80 name: example-http protocol: HTTP resolution: DNS --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: my-wiki-rule spec: hosts: - wikipedia.org http: - timeout: 5s route: - destination: host: wikipedia.org <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>host</code></td> <td><code>string</code></td> <td>服务注册表中服务的名称。从平台的服务注册表(如 <code>Kubernetes services</code>、<code>Consul services</code>)以及 <code>ServiceEntry</code> 声明的主机中查找服务名称。转发到两个目的地中都未找到的流量将被丢弃</td> <td>是</td> </tr> <tr> <td><code>subset</code></td> <td><code>string</code></td> <td>服务中子集的名称,仅适用于网格内的服务。该子集必须在相应的 <code>DestinationRule</code> 中定义</td> <td>否</td> </tr> <tr> <td><code>port</code></td> <td><code>PortSelector</code></td> <td>指定要寻址的 <code>host</code> 上的端口。如果服务仅公开单个端口,则不需要显式选择端口</td> <td>否</td> </tr> </tbody> </table> -------------------- ### HTTPFaultInjection ### `HTTPFaultInjection` 可用于指定将 HTTP 请求转发到路由中指定的目标时要注入的一个或多个故障。故障规则是 `VirtualService` 规则的一部分。 故障包括中止来自下游服务的 HTTP 请求和延迟请求的代理。一个故障规则必须有延迟或中止,或两者都有。 > 注意:即使同时指定了延迟和异常中断故障,它们也是彼此独立的。 <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>delay</code></td> <td><code>Delay</code></td> <td>在转发之前延迟请求,模拟各种故障,如网络问题、上游服务过载等</td> <td>否</td> </tr> <tr> <td><code>abort</code></td> <td><code>Abort</code></td> <td>中止 HTTP 请求尝试并将错误代码返回给下游服务,模拟上游服务有故障</td> <td>否</td> </tr> </tbody> </table> -------------------- ### HTTPFaultInjection.Abort ### 中止规则用于提前中止带有预先指定的错误代码的请求。下面的示例中,将向 `v1` 版本的 `reviews` 服务,每 1000 个请求中返回 1 个 HTTP 400 错误代码。 apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: ratings-route spec: hosts: - ratings.prod.svc.cluster.local http: - route: - destination: host: ratings.prod.svc.cluster.local subset: v1 fault: abort: percentage: value: 0.1 # 0.1% httpStatus: 400 > `httpStatus` 字段用于指定返回给调用者的 HTTP 状态码;可选的 `percentage` 字段只能用于中止一定百分比的请求,如果未指定,则中止所有请求。 <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>httpStatus</code></td> <td><code>int32 (oneof)</code></td> <td>用于中止 HTTP 请求的 HTTP 状态码</td> <td>是</td> </tr> <tr> <td><code>percentage</code></td> <td><code>Percent</code></td> <td>通过提供的错误代码去中止请求的百分比</td> <td>否</td> </tr> <tr> <td><code>percent</code></td> <td><code>int32</code></td> <td>使用提供的错误代码(0-100)中止请求的百分比。不建议使用 <code>percent</code>,建议使用 <code>percentage</code></td> <td>否</td> </tr> </tbody> </table> -------------------- ### HTTPFaultInjection.Delay ### 延迟规则用于将延迟注入请求转发路径。下面的示例中,将对带有标签 `env: prod` 的 `v1` 版本的 `reviews` 服务的所有 `Pod`,在每 1000 个请求中对 1 个请求引入 5 秒的延迟。 apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews-route spec: hosts: - reviews.prod.svc.cluster.local http: - match: - sourceLabels: env: prod route: - destination: host: reviews.prod.svc.cluster.local subset: v1 fault: delay: percentage: value: 0.1 fixedDelay: 5s > `fixedDelay` 字段用于指定延迟量。可选的 `percentage` 字段只能用于延迟一定百分比的请求,如果未指定,则延迟所有请求。 <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>httpStatus</code></td> <td><code>Duration (oneof)</code></td> <td>在转发请求之前添加固定的延迟。格式:<code>1h</code>、<code>1m</code>、<code>1s</code>、<code>1ms</code>。必须 <code>>=</code> <code>1ms</code></td> <td>是</td> </tr> <tr> <td><code>percentage</code></td> <td><code>Percent</code></td> <td>通过提供的错误代码去延迟请求的百分比</td> <td>否</td> </tr> <tr> <td><code>percent</code></td> <td><code>int32</code></td> <td>使用提供的错误代码(0-100)延迟请求的百分比。不建议使用 <code>percent</code>,建议使用 <code>percentage</code></td> <td>否</td> </tr> </tbody> </table> -------------------- ### HTTPMatchRequest ### `HttpMatchRequest` 指定一组要满足的条件,以便将该规则应用于HTTP请求。下面的示例中,将规则限制为仅匹配 URL 路径以 `/ratings/v2/` 开头,请求包含自定义的 `header` `end-user` 且值是 `jason` 的请求。 apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: ratings-route spec: hosts: - ratings.prod.svc.cluster.local http: - match: - headers: end-user: exact: jason uri: prefix: "/ratings/v2/" ignoreUriCase: true route: - destination: host: ratings.prod.svc.cluster.local > `HTTPMatchRequest` 字段不能为空。 <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>name</code></td> <td><code>string</code></td> <td>分配给匹配项的名称。匹配的名称将与父路由的名称连接,并将被记录在访问日志中,用于匹配该路由的请求</td> <td>否</td> </tr> <tr> <td><code>uri</code></td> <td><code>StringMatch</code></td> <td>区分大小写匹配 uri,格式:<code>exact: "value"</code> 精确字符串匹配;<code>prefix: "value"</code> 基于前缀匹配;<code>regex: "value"</code> 基于正则匹配。注意:不区分大小写的匹配可以通过 <code>ignore_uri_case</code> 启用</td> <td>否</td> </tr> <tr> <td><code>scheme</code></td> <td><code>StringMatch</code></td> <td>区分大小写匹配 schema,格式:<code>exact: "value"</code> 精确字符串匹配;<code>prefix: "value"</code> 基于前缀匹配;<code>regex: "value"</code> 基于正则匹配</td> <td>否</td> </tr> <tr> <td><code>method</code></td> <td><code>StringMatch</code></td> <td>区分大小写匹配 HTTP Method,格式:<code>exact: "value"</code> 精确字符串匹配;<code>prefix: "value"</code> 基于前缀匹配;<code>regex: "value"</code> 基于正则匹配</td> <td>否</td> </tr> <tr> <td><code>authority</code></td> <td><code>StringMatch</code></td> <td>区分大小写匹配 HTTP Authority,格式:<code>exact: "value"</code> 精确字符串匹配;<code>prefix: "value"</code> 基于前缀匹配;<code>regex: "value"</code> 基于正则匹配</td> <td>否</td> </tr> <tr> <td><code>headers</code></td> <td><code>map<string, StringMatch></code></td> <td><code>headers</code> 的 key 必须是小写字母,并使用 <code>-</code> 作为分隔符,如 <code>x-request-id</code>。<code>headers</code> 的 value 区分大小写,格式:<code>exact: "value"</code> 精确字符串匹配;<code>prefix: "value"</code> 基于前缀匹配;<code>regex: "value"</code> 基于正则匹配。注意:key 为 <code>uri</code>、<code>scheme</code>、<code>method</code>、<code>authority</code> 时将被忽略</td> <td>否</td> </tr> <tr> <td><code>port</code></td> <td><code>uint32</code></td> <td>指定要寻址的 <code>host</code> 上的端口。如果服务仅公开单个端口或标签端口,则不需要显式选择端口</td> <td>否</td> </tr> <tr> <td><code>sourceLabels</code></td> <td><code>map<string, StringMatch></code></td> <td>一个或多个标签,使用给定的标签来限制规则对工作负载的可用性。如果 <code>VirtualService</code> 有一个顶部指定的 <code>gateway</code> 列表,它必须包含保留的 <code>gateway mesh</code> 以使此字段可用</td> <td>否</td> </tr> <tr> <td><code>queryParams</code></td> <td><code>map<string, StringMatch></code></td> <td>查询参数以进行匹配。例如:对于 <code>?key=true</code> 这样的查询参数,映射键将为 <code>key</code>,字符串匹配项可定义为 <code>exact: "true"</code>;对于 <code>?key</code> 这样的查询参数,映射键将为 <code>key</code>,字符串匹配项可定义为 <code>exact: ""</code>;对于 <code>?key=123</code> 这样的查询参数,映射键将为 <code>key</code>,字符串匹配项可定义为 <code>regex: "\d+$"</code>,此配置将仅匹配 <code>123</code> 这样的值,而不匹配 <code>a123</code> 或 <code>123a</code> 这样的值。注意:目前 <code>prefix</code> 不支持匹配</td> <td>否</td> </tr> <tr> <td><code>ignoreUriCase</code></td> <td><code>bool</code></td> <td>指定 uri 匹配是否不区分大小写。注意:仅当 uri 匹配是 <code>exact</code> 和 <code>prefix</code> 时,才会忽略大小写</td> <td>否</td> </tr> </tbody> </table> -------------------- ### HTTPRedirect ### `HTTPRedirect` 可用于向调用者发送 301 重定向响应,在此响应中的 `Authority/Host` 和 uri 可与指定的值交换。下面的示例中,将 `ratings` 服务上对 `/v1/getProductRatings` API 的请求重定向到 `bookratings` 服务提供的 `/v1/bookRatings`。 apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: ratings-route spec: hosts: - ratings.prod.svc.cluster.local http: - match: - uri: exact: /v1/getProductRatings redirect: uri: /v1/bookRatings authority: newratings.default.svc.cluster.local ... <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>uri</code></td> <td><code>string</code></td> <td>在 <code>redirect</code> 上,使用此值覆盖 URL 的 <code>Path</code> 部分。无论将请求 uri 匹配为 <code>exact</code> 还是 <code>prefix</code>,都将替换整个路径</td> <td>否</td> </tr> <tr> <td><code>authority</code></td> <td><code>string</code></td> <td>在 <code>redirect</code> 上,使用此值覆盖 URL 的 <code>Authority/Host</code> 部分</td> <td>否</td> </tr> <tr> <td><code>redirectCode</code></td> <td><code>uint32</code></td> <td>在 <code>redirect</code> 上,指定要在重定向响应中使用的 HTTP 状态码。默认响应码为 <code>MOVED_PERMANENTLY</code> (301)</td> <td>否</td> </tr> </tbody> </table> -------------------- ### HTTPRetry ### 描述当 HTTP 请求失败时使用的重试策略。下面的示例中,在调用 `Ratings:v1` 服务时将最大重试次数设置为 3,每次重试尝试超时为 2s。 apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: ratings-route spec: hosts: - ratings.prod.svc.cluster.local http: - route: - destination: host: ratings.prod.svc.cluster.local subset: v1 retries: attempts: 3 perTryTimeout: 2s retryOn: gateway-error,connect-failure,refused-stream <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>attempts</code></td> <td><code>int32</code></td> <td>给定请求的重试次数。重试之间的时间间隔将自动确定(25ms 以上),尝试重试的实际次数取决于 <code>httpReqTimeout</code></td> <td>是</td> </tr> <tr> <td><code>perTryTimeout</code></td> <td><code>Duration</code></td> <td>给定请求的每次重试尝试超时。格式:<code>1h</code>、<code>1m</code>、<code>1s</code>、<code>1ms</code>。必须 <code>>=</code> <code>1ms</code></td> <td>否</td> </tr> <tr> <td><code>retryOn</code></td> <td><code>string</code></td> <td>指定发生重试的条件。可以使用 <code>,</code> 分隔列表指定一个或多个策略</td> <td>否</td> </tr> </tbody> </table> -------------------- ### HTTPRewrite ### 在将请求转发到目标之前,可以使用 `HTTPRewrite` 重写 HTTP 请求的特定部分。`HTTPRewrite` 只能与 `HTTPRouteDestination` 一起使用。下面的示例中,演示了如何在进行实际的 API 调用之前,将对 `ratings` 服务API 调用(`/ratings`)的 URL 前缀重写为 `/v1/bookRatings`。 apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: ratings-route spec: hosts: - ratings.prod.svc.cluster.local http: - match: - uri: prefix: /ratings rewrite: uri: /v1/bookRatings route: - destination: host: ratings.prod.svc.cluster.local subset: v1 <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>uri</code></td> <td><code>string</code></td> <td>使用此值重写 uri 的路径(或前缀)部分。如果原始 uri 是根据 <code>prefix</code> 匹配的,则此字段中提供的值将替换相应的匹配前缀</td> <td>否</td> </tr> <tr> <td><code>authority</code></td> <td><code>string</code></td> <td>使用此值重写 <code>Authority/Host</code> <code>header</code></td> <td>否</td> </tr> </tbody> </table> -------------------- ### HTTPRoute ### 描述用于路由 HTTP1.1、HTTP2 和 gRPC 流量时的匹配条件和动作。 <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>name</code></td> <td><code>string</code></td> <td>为调试目的而分配给 <code>route</code> 的名称。<code>route</code> 的名称将与 <code>match</code> 的名称连接在一起,并记录在访问日志中,用于匹配该 <code>route/match</code> 的请求</td> <td>否</td> </tr> <tr> <td><code>match</code></td> <td><code>HTTPMatchRequest[]</code></td> <td>匹配激活规则所需满足的条件。单个匹配块内的所有条件都具有 <code>AND</code> 语义,而匹配块列表具有 <code>OR</code> 语义。如果任何一个匹配块成功,则匹配该规则</td> <td>否</td> </tr> <tr> <td><code>route</code></td> <td><code>HTTPRouteDestination[]</code></td> <td>HTTP 规则可以重定向或转发(默认)流量。转发目标可以是服务的多个版本之一,与服务版本相关联的权重决定了它接收流量的比例</td> <td>否</td> </tr> <tr> <td><code>redirect</code></td> <td><code>HTTPRedirect</code></td> <td>HTTP 规则可以重定向或转发(默认)流量。如果在规则中指定了流量通过选项,则将忽略 <code>route/redirect</code>。<code>redirect</code> 可用于将 HTTP 301 重定向发送到不同的 <code>URI/Authority</code></td> <td>否</td> </tr> <tr> <td><code>rewrite</code></td> <td><code>HTTPRewrite</code></td> <td>重写 HTTP <code>URI/Authority</code> <code>headers</code>。<code>rewrite</code> 不能与 <code>redirect</code> 一起使用,<code>rewrite</code> 将在转发之前执行</td> <td>否</td> </tr> <tr> <td><code>timeout</code></td> <td><code>Duration</code></td> <td>HTTP 请求超时</td> <td>否</td> </tr> <tr> <td><code>retries</code></td> <td><code>HTTPRetry</code></td> <td>重试 HTTP 请求的策略</td> <td>否</td> </tr> <tr> <td><code>fault</code></td> <td><code>HTTPFaultInjection</code></td> <td>应用于客户端 HTTP 流量的故障注入策略。当在客户端启用故障时,将不会启用超时或重试</td> <td>否</td> </tr> <tr> <td><code>mirror</code></td> <td><code>Destination</code></td> <td>除了将请求转发到预期目标之外,还将 HTTP 流量镜像到另一个目标。镜像流量是基于最佳努力的,在从原始目的地返回响应之前,<code>sidecar/gateway</code> 不会等待镜像集群响应。将为镜像的目标生成统计信息</td> <td>否</td> </tr> <tr> <td><code>mirrorPercent</code></td> <td><code>UInt32Value</code></td> <td><code>mirror</code> 字段要镜像的流量百分比。如果不存在此字段,则将镜像所有流量(100%),最大值为100</td> <td>否</td> </tr> <tr> <td><code>corsPolicy</code></td> <td><code>CorsPolicy</code></td> <td>跨域资源共享策略(CORS)</td> <td>否</td> </tr> <tr> <td><code>headers</code></td> <td><code>Headers</code></td> <td><code>header</code> 操作规则</td> <td>否</td> </tr> </tbody> </table> -------------------- ### HTTPRouteDestination ### 每个路由规则都与一个或多个服务版本相关联,与版本相关联的权重决定了该版本接收流量的比例。下面的示例中,会将 `reviews` 服务的 25% 流量路由到带有 `v2` 标签的实例,而其余流量(75%)路由到 `v1` 标签的实例。 apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews-route spec: hosts: - reviews.prod.svc.cluster.local http: - route: - destination: host: reviews.prod.svc.cluster.local subset: v2 weight: 25 - destination: host: reviews.prod.svc.cluster.local subset: v1 weight: 75 对应的 `DestinationRule` 如下: apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: reviews-destination spec: host: reviews.prod.svc.cluster.local subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 流量也可以在两个完全不同的服务之间分配,而不必定义新的子集。下面的示例中,将 `reviews.com` 25% 的流量转发到到 `dev.reviews.com`。 apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews-route-two-domains spec: hosts: - reviews.com http: - route: - destination: host: dev.reviews.com weight: 25 - destination: host: reviews.com weight: 75 <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>destination</code></td> <td><code>Destination</code></td> <td>目标唯一地标识请求/连接应转发到的服务实例</td> <td>是</td> </tr> <tr> <td><code>weight</code></td> <td><code>int32</code></td> <td>要转发到服务版本的流量比例(0-100)。各个目标之间的权重总和是 100。如果规则中只有一个目标,则权重值将视为 100</td> <td>否</td> </tr> <tr> <td><code>headers</code></td> <td><code>Headers</code></td> <td><code>header</code> 操作规则</td> <td>否</td> </tr> <tr> <td><code>removeResponseHeaders</code></td> <td><code>string[]</code></td> <td><code>remove_response_header</code> 已过时,建议改用 <code>headers</code> 字段</td> <td>否</td> </tr> <tr> <td><code>appendResponseHeaders</code></td> <td><code>map<string, string></code></td> <td><code>append_response_headers</code> 已过时,建议改用 <code>headers</code> 字段</td> <td>否</td> </tr> <tr> <td><code>removeRequestHeaders</code></td> <td><code>string[]</code></td> <td><code>remove_request_headers</code> 已过时,建议改用 <code>headers</code> 字段</td> <td>否</td> </tr> <tr> <td><code>appendRequestHeaders</code></td> <td><code>map<string, string></code></td> <td><code>append_request_headers</code> 已过时,建议改用 <code>headers</code> 字段</td> <td>否</td> </tr> </tbody> </table> -------------------- ### Headers ### 当 Envoy 将请求转发到目标服务或从目标服务转发响应时,可以操作消息的 `header`。可以为特定的路由目的地或所有目的地指定 `header` 操作规则。 下面示例中的 `VirtualService`,将为路由到任何 `reviews` 服务目标的请求添加一个值为 `true` 的 `test header`。它还移除了 `foo response header`,但只移除了来自 `reviews` 服务的 `v1` 子集(版本)的响应。 apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews-route spec: hosts: - reviews.prod.svc.cluster.local http: - headers: request: set: test: true route: - destination: host: reviews.prod.svc.cluster.local subset: v2 weight: 25 - destination: host: reviews.prod.svc.cluster.local subset: v1 headers: response: remove: - foo weight: 75 <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>request</code></td> <td><code>HeaderOperations</code></td> <td>在将请求转发到目标服务之前应用的 <code>header</code> 操作规则</td> <td>否</td> </tr> <tr> <td><code>response</code></td> <td><code>HeaderOperations</code></td> <td>在向调用者返回响应之前应用的 <code>header</code> 操作规则</td> <td>否</td> </tr> </tbody> </table> -------------------- ### Headers.HeaderOperations ### `Headers.HeaderOperations` 描述要应用的 `header` 操作。 <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>set</code></td> <td><code>map<string, string></code></td> <td>用给定的值覆盖由 key 指定的 <code>header</code></td> <td>否</td> </tr> <tr> <td><code>add</code></td> <td><code>map<string, string></code></td> <td>将给定的值附加到由 keys 指定的 <code>header</code>(将创建一个以 <code>,</code> 分隔的值的列表)</td> <td>否</td> </tr> <tr> <td><code>remove</code></td> <td><code>string</code></td> <td>删除指定的 <code>header</code></td> <td>否</td> </tr> </tbody> </table> -------------------- ### L4MatchAttributes ### L4 连接匹配属性。注意,L4 连接匹配支持是不完整的。 <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>destinationSubnets</code></td> <td><code>string[]</code></td> <td>有可选子网的目标 IPv4 或 IPv6 地址。如 <code>a.b.c.d/xx</code> 或 <code>a.b.c.d</code> 形式</td> <td>否</td> </tr> <tr> <td><code>port</code></td> <td><code>uint32</code></td> <td>指定要寻址的 <code>host</code> 上的端口。如果服务仅公开单个端口或标签端口,则不需要显式选择端口</td> <td>否</td> </tr> <tr> <td><code>sourceLabels</code></td> <td><code>map<string, string></code></td> <td>一个或多个标签,使用给定的标签来限制规则对工作负载的可用性。如果 <code>VirtualService</code> 有一个顶部指定的 <code>gateway</code> 列表,它必须包含保留的 <code>gateway mesh</code> 以使此字段可用</td> <td>否</td> </tr> <tr> <td><code>gateways</code></td> <td><code>string[]</code></td> <td>规则应应用到的 <code>gateway</code> 的名称。位于 <code>VirtualService</code> 顶部的 <code>gateway</code> 名称(如果有)将被覆盖。<code>gateway</code> 匹配独立于 <code>sourceLabels</code></td> <td>否</td> </tr> </tbody> </table> -------------------- ### Percent ### `Percent` 指定 `[0.0, 100.0]` 范围内的百分比。 <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>value</code></td> <td><code>double</code></td> <td><code>[0.0, 100.0]</code> 范围内的数</td> <td>否</td> </tr> </tbody> </table> -------------------- ### PortSelector ### `PortSelector` 指定用于匹配或选择最终路由的端口号。 <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>number</code></td> <td><code>uint32</code></td> <td>有效的端口号</td> <td>否</td> </tr> </tbody> </table> -------------------- ### RouteDestination ### L4 路由规则加权目的地。 <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>destination</code></td> <td><code>Destination</code></td> <td><code>destination</code> 唯一标识请求/连接应转发到的服务的实例</td> <td>是</td> </tr> <tr> <td><code>weight</code></td> <td><code>int32</code></td> <td>要转发到服务版本的流量比例。如果规则中只有一个 <code>destination</code>,则所有流量都将路由到该 <code>destination</code>,而与权重无关</td> <td>否</td> </tr> </tbody> </table> -------------------- ### StringMatch ### 描述如何匹配 HTTP `header` 中的给定字符串。匹配区分大小写。 <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>exact</code></td> <td><code>string (oneof)</code></td> <td>字符串完全匹配</td> <td>是</td> </tr> <tr> <td><code>prefix</code></td> <td><code>string (oneof)</code></td> <td>基于前缀匹配</td> <td>是</td> </tr> <tr> <td><code>regex</code></td> <td><code>string (oneof)</code></td> <td>基于正则匹配</td> <td>是</td> </tr> </tbody> </table> -------------------- ### TCPRoute ### 描述路由 TCP 流量时的匹配条件和动作。下面的示例中,路由规则将到达端口 27017 的 `mongo.prod.svc.cluster.local` 的流量转发给端口 5555 上的 另一个 Mongo 服务 `mongo.backup.svc.cluster.local`。 apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: bookinfo-Mongo spec: hosts: - mongo.prod.svc.cluster.local tcp: - match: - port: 27017 route: - destination: host: mongo.backup.svc.cluster.local port: number: 5555 <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>match</code></td> <td><code>L4MatchAttributes[]</code></td> <td>匹配激活规则所需满足的条件。单个匹配块内的所有条件都具有 <code>AND</code> 语义,而匹配块列表具有 <code>OR</code> 语义。如果任何一个匹配块成功,则匹配该规则</td> <td>否</td> </tr> <tr> <td><code>route</code></td> <td><code>RouteDestination[]</code></td> <td>连接应转发到的目的地</td> <td>否</td> </tr> </tbody> </table> -------------------- ### TLSMatchAttributes ### TLS 连接匹配属性。 <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>sniHosts</code></td> <td><code>string[]</code></td> <td>匹配激活规则所需满足的条件。单个匹配块内的所有条件都具有 <code>AND</code> 语义,而匹配块列表具有 <code>OR</code> 语义。如果任何一个匹配块成功,则匹配该规则</td> <td>否</td> </tr> <tr> <td><code>destinationSubnets</code></td> <td><code>string[]</code></td> <td>有可选子网的目标 IPv4 或 IPv6 地址。如 <code>a.b.c.d/xx</code> 或 <code>a.b.c.d</code> 形式</td> <td>否</td> </tr> <tr> <td><code>port</code></td> <td><code>uint32</code></td> <td>指定要寻址的 <code>host</code> 上的端口。如果服务仅公开单个端口或标签端口,则不需要显式选择端口</td> <td>否</td> </tr> <tr> <td><code>sourceLabels</code></td> <td><code>map<string, string></code></td> <td>一个或多个标签,使用给定的标签来限制规则对工作负载的可用性。如果 <code>VirtualService</code> 有一个顶部指定的 <code>gateway</code> 列表,它必须包含保留的 <code>gateway mesh</code> 以使此字段可用</td> <td>否</td> </tr> <tr> <td><code>gateways</code></td> <td><code>string[]</code></td> <td>规则应应用到的 <code>gateway</code> 的名称。位于 <code>VirtualService</code> 顶部的 <code>gateway</code> 名称(如果有)将被覆盖。<code>gateway</code> 匹配独立于 <code>sourceLabels</code></td> <td>否</td> </tr> </tbody> </table> -------------------- ### TLSRoute ### 描述用于路由未终止 TLS 流量(TLS/HTTPS)的匹配条件和操作。下面的示例中,路由规则根据 SNI 值将到达网关 `mygateway` 的端口 443 的未终止 TLS 流量转发到网格中的内部服务。 apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: bookinfo-sni spec: hosts: - "*.bookinfo.com" gateways: - mygateway tls: - match: - port: 443 sniHosts: - login.bookinfo.com route: - destination: host: login.prod.svc.cluster.local - match: - port: 443 sniHosts: - reviews.bookinfo.com route: - destination: host: reviews.prod.svc.cluster.local <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>match</code></td> <td><code>TLSMatchAttributes[]</code></td> <td>匹配激活规则所需满足的条件。单个匹配块内的所有条件都具有 <code>AND</code> 语义,而匹配块列表具有 <code>OR</code> 语义。如果任何一个匹配块成功,则匹配该规则</td> <td>是</td> </tr> <tr> <td><code>route</code></td> <td><code>RouteDestination[]</code></td> <td>连接应转发到的目的地</td> <td>否</td> </tr> </tbody> </table> -------------------- ### VirtualService ### 影响流量路由的配置。 <table> <thead> <tr> <th>字段</th> <th>类型</th> <th>描述</th> <th>是否必需</th> </tr> </thead> <tbody> <tr> <td><code>hosts</code></td> <td><code>string[]</code></td> <td>向其发送流量的目标主机,可以是带有通配符前缀的 DNS 名称或 IP 地址。<code>hosts</code> 字段同时适用于 HTTP 和 TCP 服务。单个 <code>VirtualService</code> 可以用于描述相应主机的所有流量属性,包括多个 HTTP 和 TCP 端口的流量属性。网格内的服务(即在服务注册表中找到的服务)必须始终使用其字母数字名称进行引用。仅允许通过 <code>Gateway</code> 定义的服务使用 IP 地址</td> <td>是</td> </tr> <tr> <td><code>gateways</code></td> <td><code>string[]</code></td> <td>应用这些路由的 <code>gateways</code> 和 <code>sidecars</code> 的名称。单个 <code>VirtualService</code> 可用于网格内的 <code>sidecars</code> 以及一个或多个 <code>gateways</code>。在特定协议路由的匹配条件中,可以使用 <code>source</code> 字段来覆盖该字段施加的选择条件。保留字 <code>mesh</code> 用于表示网格中的所有 <code>sidecars</code>,省略 <code>gateways</code> 字段时,将使用默认网关(<code>mesh</code>),这会将规则应用于网格中的所有 <code>sidecars</code>。如果提供了网关名称列表,则规则将仅应用于列表中的网关。要将规则应用于网关和边车,请将 <code>mesh</code> 指定 为网关名称之一</td> <td>否</td> </tr> <tr> <td><code>http</code></td> <td><code>HTTPRoute[]</code></td> <td>用于 HTTP 流量的路由规则的有序列表。HTTP 路由将被应用到名为 <code>http-</code>/<code>http2-</code>/<code>grpc-*</code> 的平台服务端口、协议为 <code>HTTP</code>/<code>HTTP2</code>/<code>GRPC</code>/<code>TLS-terminated-HTTPS</code> 的网关端口、以及使用 <code>HTTP</code>/<code>HTTP2</code>/<code>GRPC</code> 协议的服务入口端口。使用与传入请求匹配的第一条规则</td> <td>否</td> </tr> <tr> <td><code>tls</code></td> <td><code>TLSRoute[]</code></td> <td>用于 未终止的TLS 和 HTTPS 流量的路由规则的有序列表。通常使用 <code>ClientHello</code> 消息提供的 SNI 值执行路由。TLS 路由将被应用到名为 <code>https-</code>/<code>tls-</code> 的平台服务端口、使用 <code>HTTPS</code>/<code>TLS</code> 协议(即采用“直通” TLS 模式)的未终止的网关端口、以及使用 <code>HTTPS</code>/<code>TLS</code> 协议的服务入口端口。使用与传入请求匹配的第一条规则。注意:没有关联虚拟服务的 <code>https-</code> 或 <code>tls-</code> 端口的流量将被视为不透明的 TCP 流量</td> <td>否</td> </tr> <tr> <td><code>tcp</code></td> <td><code>TLSRoute[]</code></td> <td>用于不透明 TCP 流量的路由规则的有序列表。TCP 路由将被应用到任何不是 <code>HTTP</code> 或 <code>TLS</code> 端口的端口。使用与传入请求匹配的第一条规则</td> <td>否</td> </tr> <tr> <td><code>exportTo</code></td> <td><code>string[]</code></td> <td><code>VirtualService</code> 暴露到的命名空间的列表。暴露 <code>VirtualService</code> 允许其被其他命名空间中定义的 <code>sidecars</code> 和 <code>gateways</code> 使用。此功能可以控制 <code>VirtualService</code> 跨命名空间边界的可见性。如果未指定命名空间,则默认情况下会将 <code>VirtualService</code> 暴露到所有命名空间。<code>.</code> 作为保留,表示暴露 <code>VirtualService</code> 到声明它的同一命名空间。类似的,<code>*</code> 作为保留,表示暴露到所有命名空间。注意:在当前版本中,该 <code>exportTo</code> 值限制为 <code>.</code> 或 <code>*</code>(即当前命名空间或所有命名空间)</td> <td>否</td> </tr> </tbody> </table> --------------------
相关 istio的流量治理(负载均衡 熔断 故障注入 灰度)与各种配置实例 与VIrtualService(路由规则配置) 服务治理要解决的问题: 1) 服务的负载均衡 2)同一个服务有两个版本在线,将一部分流量切到某个版本上 3)服务保护,如限制并发连接数、请求数、隔离有故障的服务实例 旧城等待,/ 2023年01月15日 12:23/ 0 赞/ 167 阅读
相关 VirtualService资源详解 \\ istio课程发布:https://edu.csdn.net/course/detail/29911 这是我目前见过最详细,最有深度的istio课程 \\ V 谁借莪1个温暖的怀抱¢/ 2022年12月02日 13:49/ 0 赞/ 37 阅读
相关 VirtualService VirtualService 影响流量路由的配置。以下是一些术语,可在流量路由的上下文中进行定义。 `Service` 通常是绑定到服务注册表中唯一名称的应用程序行为的 - 日理万妓/ 2022年10月10日 13:55/ 0 赞/ 34 阅读
还没有评论,来说两句吧...