mirror of https://github.com/istio/istio.io.git
[zh-cn] improve rate-limit telemetry (#13599)
Signed-off-by: xin.li <xin.li@daocloud.io>
This commit is contained in:
parent
918ad1c529
commit
2ed2716cb5
|
@ -16,7 +16,7 @@ Istio 提供 [Telemetry API](/zh/docs/reference/config/telemetry/),
|
|||
|
||||
## 使用 API {#using-api}
|
||||
|
||||
### 作用域、继承和覆盖{#scope-inheritance-and-overrides}
|
||||
### 作用域、继承和覆盖 {#scope-inheritance-and-overrides}
|
||||
|
||||
在 Istio 配置层次结构中,Telemetry API 资源从父级资源中继承配置:
|
||||
|
||||
|
@ -34,7 +34,7 @@ Istio 提供 [Telemetry API](/zh/docs/reference/config/telemetry/),
|
|||
|
||||
**使用工作负载选择算符** 将新的 Telemetry 资源应用到目标命名空间中,可以实现特定于工作负载的覆盖。
|
||||
|
||||
### 工作负载选择{#workload-selection}
|
||||
### 工作负载选择 {#workload-selection}
|
||||
|
||||
命名空间内的单个工作负载通过 [`selector`](/zh/docs/reference/config/type/workload-selector/#WorkloadSelector)
|
||||
进行选择,这允许基于标签选择工作负载。
|
||||
|
@ -42,7 +42,7 @@ Istio 提供 [Telemetry API](/zh/docs/reference/config/telemetry/),
|
|||
使用 `selector` 让两个不同的 `Telemetry` 资源选择相同的工作负载是无效的。
|
||||
同样在未指定 `selector` 时在一个命名空间中设定两个不同的 `Telemetry` 资源也是无效的。
|
||||
|
||||
### 提供程序选择{#provider-selection}
|
||||
### 提供程序选择 {#provider-selection}
|
||||
|
||||
Telemetry API 使用提供程序的概念表明要使用的集成协议或类型。
|
||||
可以在 [`MeshConfig`](/zh/docs/reference/config/istio.mesh.v1alpha1/#MeshConfig-ExtensionProvider)
|
||||
|
@ -86,9 +86,9 @@ data:
|
|||
并将 `InternalTrafficPolicy` 设置为 `Local` 以获得更好的性能。
|
||||
{{< /tip >}}
|
||||
|
||||
## 示例{#examples}
|
||||
## 示例 {#examples}
|
||||
|
||||
### 配置网格范围的行为{#configuring-mesh-wide-behavior}
|
||||
### 配置网格范围的行为 {#configuring-mesh-wide-behavior}
|
||||
|
||||
Telemetry API 资源从网格的根配置命名空间(通常是 `istio-system`)中进行继承。
|
||||
要配置网格范围的行为,可以在根配置命名空间中添加新的(或编辑现有的)`Telemetry` 资源。
|
||||
|
@ -115,7 +115,7 @@ spec:
|
|||
此配置覆盖源于 `MeshConfig` 的默认提供程序,将网格默认设置为 `localtrace` 提供程序。
|
||||
它还将网格范围的抽样百分比设置为 `100`,配置一个标记以名称 `foo` 和赋值 `bar` 添加到所有链路 span。
|
||||
|
||||
### 配置作用于命名空间的追踪行为{#configuring-namespace-scoped-tracing-behavior}
|
||||
### 配置作用于命名空间的追踪行为 {#configuring-namespace-scoped-tracing-behavior}
|
||||
|
||||
要定制个别命名空间的行为,添加 `Telemetry` 资源到目标命名空间。
|
||||
命名空间资源中指定的所有字段将完全覆盖从配置层次结构中继承的字段配置。
|
||||
|
@ -146,7 +146,7 @@ spec:
|
|||
`Telemetry` 资源中的所有配置将完全覆盖配置层次结构中其父级资源的配置。这包括提供程序选择。
|
||||
{{< /tip >}}
|
||||
|
||||
### 配置特定于工作负载的行为{#configuring-workload-specific-behavior}
|
||||
### 配置特定于工作负载的行为 {#configuring-workload-specific-behavior}
|
||||
|
||||
要定制个别工作负载的行为,添加 `Telemetry` 资源到目标命名空间并使用 `selector`。
|
||||
特定工作负载资源中指定的所有字段将完全覆盖从配置层次结构中继承的字段配置。
|
||||
|
|
|
@ -8,30 +8,34 @@ test: no
|
|||
---
|
||||
|
||||
此任务向您展示如何使用 Envoy 的本地速率限制来动态地将流量限制到 Istio 服务。
|
||||
在本任务中,您将通过允许的入口网关为 `productpage` 服务应用全局速率限制在服务的所有实例中,每分钟 1 次请求。
|
||||
此外,您将为每个项目应用一个本地速率限制每个 `productpage` 实例将允许每分钟 10 个请求。
|
||||
通过这种方式,您将确保 `productpage` 服务通过入口网关每分钟最多处理一个请求,但是每个 `productpage` 实例可以处理每分钟最多 10 个请求,允许任何网格内通信。
|
||||
在本任务中,您将通过允许的入口网关为 `productpage` 服务应用全局速率限制在服务的所有实例中,
|
||||
每分钟 1 次请求。此外,您将为每个项目应用一个本地速率限制,允许 `productpage` 实例每分钟处理 10 个请求。
|
||||
通过这种方式,您将确保 `productpage` 服务通过入口网关每分钟最多处理一个请求,但是每个 `productpage`
|
||||
实例可以处理每分钟最多 10 个请求,允许任何网格内通信。
|
||||
|
||||
## 开始之前{#before-you-begin}
|
||||
## 开始之前 {#before-you-begin}
|
||||
|
||||
1. 遵循[安装指南](/zh/docs/setup/getting-started/)中的指示说明在 Kubernetes 集群中安装 Istio。
|
||||
1. 参照[安装指南](/zh/docs/setup/getting-started/),在 Kubernetes 集群中安装 Istio。
|
||||
|
||||
1. 部署 [Bookinfo](/zh/docs/examples/bookinfo/) 示例应用程序。
|
||||
|
||||
## 限制速率{#rate-limits}
|
||||
## 限制速率 {#rate-limits}
|
||||
|
||||
Envoy 支持两种速率限制:全局和本地。全局速率使用全局 gRPC 速率限制服务为整个网格提供速率限制。
|
||||
本地速率限制用于限制每个服务实例的请求速率。局部速率限制可以与全局速率限制一起使用,以减少负载全局速率限制服务。
|
||||
本地速率限制用于限制每个服务实例的请求速率。局部速率限制可以与全局速率限制一起使用,
|
||||
以减少负载全局速率限制服务。
|
||||
|
||||
在本任务中,您将配置 Envoy 以对服务的特定路径的流量进行速率限制同时使用全局和本地速率限制。
|
||||
|
||||
### 全局速率{#global-rate-limit}
|
||||
### 全局速率 {#global-rate-limit}
|
||||
|
||||
Envoy 可以用来为您的网格[设置全局速率限制](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/other_features/global_rate_limiting)。
|
||||
Envoy 中的全局速率限制使用 gRPC API 从速率限制服务请求配额。
|
||||
下文使用的[参考实现](https://github.com/envoyproxy/ratelimit)后端,是用 Go 语言编写并使用 Redis 作为缓存。
|
||||
Envoy 可以为您的网格[设置全局速率限制](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/other_features/global_rate_limiting)。
|
||||
Envoy 中的全局速率限制使用 gRPC API 向速率限制服务请求配额。
|
||||
下文使用的[参考实现](https://github.com/envoyproxy/ratelimit)后端,是用 Go
|
||||
语言编写并使用 Redis 作为缓存。
|
||||
|
||||
1. 参考下面的 configmap [配置限流规则](https://github.com/envoyproxy/ratelimit#configuration),对 `/productpage` 的限制速率为每分钟 1 次,其他所有请求的限制速率为每分钟 100 次。
|
||||
1. 参考下面的 ConfigMap [配置限流规则](https://github.com/envoyproxy/ratelimit#configuration),
|
||||
对 `/productpage` 的限制速率为每分钟 1 次,其他所有请求的限制速率为每分钟 100 次。
|
||||
|
||||
{{< text bash >}}
|
||||
$ kubectl apply -f - <<EOF
|
||||
|
@ -55,11 +59,17 @@ Envoy 中的全局速率限制使用 gRPC API 从速率限制服务请求配额
|
|||
EOF
|
||||
{{< /text >}}
|
||||
|
||||
1. 创建一个全局速率限制服务,它实现 Envoy 的[速率限制服务协议](https://www.envoyproxy.io/docs/envoy/latest/api-v3/service/ratelimit/v3/rls.proto)。作为参考,可以在[这里]({{< github_blob >}}/samples/ratelimit/rate-limit-service.yaml)找到一个演示配置,它是基于 Envoy 提供的[参考实现](https://github.com/envoyproxy/ratelimit)。
|
||||
1. 创建一个全局速率限制服务,它实现 Envoy
|
||||
的[速率限制服务协议](https://www.envoyproxy.io/docs/envoy/latest/api-v3/service/ratelimit/v3/rls.proto)。
|
||||
作为参考,可以在[这里]({{< github_blob >}}/samples/ratelimit/rate-limit-service.yaml)找到一个演示配置,
|
||||
它是基于 Envoy 提供的[参考实现](https://github.com/envoyproxy/ratelimit)。
|
||||
|
||||
1. 对 `ingressgateway` 应用 `EnvoyFilter`,以使用 Envoy 的全局速率限制过滤器来启用全局速率限制。
|
||||
|
||||
此 patch 将 `envoy.filters.http.ratelimit` [Envoy 全局限流过滤器](https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/filters/http/ratelimit/v3/rate_limit.proto#envoy-v3-api-msg-extensions-filters-http-ratelimit-v3-ratelimit)插入到 `HTTP_FILTER` 链中。`rate_limit_service` 字段指定外部速率限制服务,在本例中为 `outbound|8081||ratelimit.default.svc.cluster.local`。
|
||||
此 patch 将 `envoy.filters.http.ratelimit`
|
||||
[Envoy 全局限流过滤器](https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/filters/http/ratelimit/v3/rate_limit.proto#envoy-v3-api-msg-extensions-filters-http-ratelimit-v3-ratelimit)插入到
|
||||
`HTTP_FILTER` 链中。`rate_limit_service` 字段指定外部速率限制服务,在本例中为
|
||||
`outbound|8081||ratelimit.default.svc.cluster.local`。
|
||||
|
||||
{{< text bash >}}
|
||||
$ kubectl apply -f - <<EOF
|
||||
|
@ -70,11 +80,11 @@ Envoy 中的全局速率限制使用 gRPC API 从速率限制服务请求配额
|
|||
namespace: istio-system
|
||||
spec:
|
||||
workloadSelector:
|
||||
# select by label in the same namespace
|
||||
# 同一个命名空间内通过 label 匹配
|
||||
labels:
|
||||
istio: ingressgateway
|
||||
configPatches:
|
||||
# The Envoy config you want to modify
|
||||
# 您要修改的 Envoy 配置
|
||||
- applyTo: HTTP_FILTER
|
||||
match:
|
||||
context: GATEWAY
|
||||
|
@ -86,12 +96,12 @@ Envoy 中的全局速率限制使用 gRPC API 从速率限制服务请求配额
|
|||
name: "envoy.filters.http.router"
|
||||
patch:
|
||||
operation: INSERT_BEFORE
|
||||
# Adds the Envoy Rate Limit Filter in HTTP filter chain.
|
||||
# 在 HTTP 过滤器链中添加 Envoy 速率限制过滤器。
|
||||
value:
|
||||
name: envoy.filters.http.ratelimit
|
||||
typed_config:
|
||||
"@type": type.googleapis.com/envoy.extensions.filters.http.ratelimit.v3.RateLimit
|
||||
# domain can be anything! Match it to the ratelimter service config
|
||||
# 域名可以是任何东西!将其与 ratelitter 服务配置相匹配
|
||||
domain: productpage-ratelimit
|
||||
failure_mode_deny: true
|
||||
timeout: 10s
|
||||
|
@ -104,7 +114,9 @@ Envoy 中的全局速率限制使用 gRPC API 从速率限制服务请求配额
|
|||
EOF
|
||||
{{< /text >}}
|
||||
|
||||
1. 对定义限速路由配置的 `ingressgateway` 应用另一个 `EnvoyFilter`。对于来自名为 `*.80` 的虚拟主机的任何路由,这增加了[速率限制动作](https://www.envoyproxy.io/docs/envoy/latest/api-v3/config/route/v3/route_components.proto#envoy-v3-api-msg-config-route-v3-ratelimit)。
|
||||
1. 对定义限速路由配置的 `ingressgateway` 应用另一个 `EnvoyFilter`。
|
||||
对于来自名为 `*.80` 的虚拟主机的任何路由,这增加了
|
||||
[速率限制动作](https://www.envoyproxy.io/docs/envoy/latest/api-v3/config/route/v3/route_components.proto#envoy-v3-api-msg-config-route-v3-ratelimit)。
|
||||
|
||||
{{< text bash >}}
|
||||
$ kubectl apply -f - <<EOF
|
||||
|
@ -128,28 +140,32 @@ Envoy 中的全局速率限制使用 gRPC API 从速率限制服务请求配额
|
|||
action: ANY
|
||||
patch:
|
||||
operation: MERGE
|
||||
# Applies the rate limit rules.
|
||||
# 应用速率限制规则。
|
||||
value:
|
||||
rate_limits:
|
||||
- actions: # any actions in here
|
||||
- actions: # 此处的任何操作
|
||||
- request_headers:
|
||||
header_name: ":path"
|
||||
descriptor_key: "PATH"
|
||||
EOF
|
||||
{{< /text >}}
|
||||
|
||||
### 本地速率限制{#local-rate-limit}
|
||||
### 本地速率限制 {#local-rate-limit}
|
||||
|
||||
Envoy 支持 L4 连接和 HTTP 请求的[本地速率限制](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/other_features/local_rate_limiting#arch-overview-local-rate-limit)。
|
||||
Envoy 支持 L4 连接和 HTTP 请求的
|
||||
[本地速率限制](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/other_features/local_rate_limiting#arch-overview-local-rate-limit)。
|
||||
|
||||
这允许您在代理本身的实例级应用速率限制,而无需调用任何其他服务。
|
||||
|
||||
下面的 `EnvoyFilter` 为通过 `productpage` 服务的任何流量启用了本地速率限制。
|
||||
`HTTP_FILTER` patch 会插入 `envoy.filters.http.local_ratelimit` [本地 Envoy 过滤器](https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/local_rate_limit_filter#config-http-filters-local-rate-limit)
|
||||
到 HTTP 连接管理器过滤器链中。本地速率限制过滤器的[令牌桶](https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/filters/http/local_ratelimit/v3/local_rate_limit.proto#envoy-v3-api-field-extensions-filters-http-local-ratelimit-v3-localratelimit-token-bucket)被配置为允许每分钟 10 个请求。该过滤器还配置为添加 `x-local-rate-limit` 响应头到被阻塞的请求。
|
||||
`HTTP_FILTER` patch 会插入 `envoy.filters.http.local_ratelimit`
|
||||
[本地 Envoy 过滤器](https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/local_rate_limit_filter#config-http-filters-local-rate-limit)
|
||||
到 HTTP 连接管理器过滤器链中。本地速率限制过滤器的[令牌桶](https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/filters/http/local_ratelimit/v3/local_rate_limit.proto#envoy-v3-api-field-extensions-filters-http-local-ratelimit-v3-localratelimit-token-bucket)
|
||||
被配置为允许每分钟 10 个请求。该过滤器还配置为添加 `x-local-rate-limit` 响应头到被阻塞的请求。
|
||||
|
||||
{{< tip >}}
|
||||
在 [Envoy 速率限制页面](https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/local_rate_limit_filter#statistics)中提到的统计数据默认是禁用的。您可以在部署期间使用以下注解启用它们:
|
||||
在 [Envoy 速率限制页面](https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/local_rate_limit_filter#statistics)
|
||||
中提到的统计数据默认是禁用的,您可以在部署期间使用以下注解启用它们:
|
||||
|
||||
{{< text yaml >}}
|
||||
template:
|
||||
|
@ -216,8 +232,10 @@ EOF
|
|||
|
||||
上述配置对所有 vhosts/routes 都进行本地速率限制。或者,您可以将其限制为特定的路由。
|
||||
|
||||
下面的 `EnvoyFilter` 为 `productpage` 服务的 80 端口的任何流量启用了本地速率限制。与前面的配置不同,`HTTP_FILTER` patch 中不包含 `token_bucket`。
|
||||
`token_bucket` 被定义在第二个 (`HTTP_ROUTE`) patch 中,其中包含 `envoy.filters.http.local_ratelimit` 的 `typed_per_filter_config`。
|
||||
下面的 `EnvoyFilter` 为 `productpage` 服务的 80 端口的任何流量启用了本地速率限制。
|
||||
与前面的配置不同,`HTTP_FILTER` patch 中不包含 `token_bucket`。`token_bucket`
|
||||
被定义在第二个(`HTTP_ROUTE`)patch 中,其中包含 `envoy.filters.http.local_ratelimit`
|
||||
的 `typed_per_filter_config`。
|
||||
|
||||
本地 Envoy 过滤器,用于路由到虚拟主机 `inbound|http|9080`。
|
||||
|
||||
|
@ -288,11 +306,12 @@ spec:
|
|||
EOF
|
||||
{{< /text >}}
|
||||
|
||||
## 验证结果{#verify-the-results}
|
||||
## 验证结果 {#verify-the-results}
|
||||
|
||||
### 验证全局速率{#verify-global-rate-limit}
|
||||
### 验证全局速率 {#verify-global-rate-limit}
|
||||
|
||||
向 Bookinfo 示例发送通信流。在您的网站上访问 `http://$GATEWAY_URL/productpage` 浏览器或发出以下命令:
|
||||
向 Bookinfo 示例发送通信流。在您的浏览器访问 `http://$GATEWAY_URL/productpage`
|
||||
网站或使用以下命令:
|
||||
|
||||
{{< text bash >}}
|
||||
$ curl -s "http://$GATEWAY_URL/productpage" -o /dev/null -w "%{http_code}\n"
|
||||
|
@ -303,11 +322,12 @@ $ curl -s "http://$GATEWAY_URL/productpage" -o /dev/null -w "%{http_code}\n"
|
|||
`$GATEWAY_URL` 是在 [Bookinfo](/zh/docs/examples/bookinfo/) 示例中设置的值。
|
||||
{{< /tip >}}
|
||||
|
||||
您将看到第一个请求通过,但随后的每个请求在一分钟内将得到 429 响应。
|
||||
您将看到第一个请求通过,但随后的每个请求都将在一分钟内将得到 429 响应。
|
||||
|
||||
### 验证本地速率{#verify-local-rate-limit}
|
||||
### 验证本地速率 {#verify-local-rate-limit}
|
||||
|
||||
虽然入口网关的全局速率限制将对 `productpage` 服务的请求限制在每分钟 1 个请求,但 `productpage` 实例的本地速率限制允许每分钟 10 个请求。
|
||||
虽然入口网关的全局速率限制将对 `productpage` 服务的请求限制在每分钟 1 个请求,但
|
||||
`productpage` 实例的本地速率限制允许每分钟 10 个请求。
|
||||
|
||||
为了确认这一点,使用下面的 `curl` 命令从 `ratings` Pod 发送内部 `productpage` 请求:
|
||||
|
||||
|
@ -318,7 +338,7 @@ $ kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadat
|
|||
|
||||
您应该看到每个 `productpage` 实例的请求次数每分钟不超过 10 个。
|
||||
|
||||
## 清理{#cleanup}
|
||||
## 清理 {#cleanup}
|
||||
|
||||
{{< text bash >}}
|
||||
$ kubectl delete envoyfilter filter-ratelimit -nistio-system
|
||||
|
|
Loading…
Reference in New Issue