配置 EnvoyProxy 资源配额

概述

使用 EnvoyProxyResourceQuota 限制一个命名空间中由 EnvoyProxy 资源声明的 CPU 和内存请求总量。该配额适用于 EnvoyProxy 所声明的 Envoy 数据平面配置;它不会替代 Kubernetes ResourceQuota,也不会直接测量生成的 Envoy Deployment。

此功能在 ACP 4.5 及更高版本中可用。该功能由 Envoy Gateway Operator 提供,并使用 envoy-gateway.alauda.io/v1alpha1 API 组。

NOTE

Gateway 和 EnvoyProxy 是独立的资源。建议为每个 Gateway 使用一个专用的 EnvoyProxy,并通过 .spec.infrastructure.parametersRef 由 Gateway 引用该资源。使用 ACP Web Console 时,控制台可以将配套的 EnvoyProxy 与 Gateway 一起创建;应用 YAML 时,请显式创建并引用这两个资源。 配额适用于 Gateway 命名空间中的 EnvoyProxy 资源。有关更多信息,请参阅 配置 GatewayAPI Gateway。

配额模型

EnvoyProxyResourceQuota 是命名空间级资源。配额仅适用于同一命名空间中的 EnvoyProxy 资源。首个版本支持以下硬限制:

资源含义
requests.cpuEnvoy 数据平面从节点的 CPU 请求总量
requests.memoryEnvoy 数据平面从节点的内存请求总量

配额资源同时报告配置的硬限制和当前命名空间的使用量:

  • status.hard 与 spec.hard 保持一致。
  • status.used 是命名空间中 EnvoyProxy 资源的使用量总和。

如果一个命名空间包含多个配额对象,则每个对象的 status.used 都会报告相同的命名空间总量。不要将多个配额对象的 status.used 值相加。其命名空间中的每个 EnvoyProxy 请求都必须满足所有配额对象的要求。

创建配额

通过应用 namespace 级的 EnvoyProxyResourceQuota 资源来创建配额。以下示例将该 namespace 中 Envoy data plane 从节点的 CPU 请求限制为 4 个核心,将内存请求限制为 8 GiB:

apiVersion: envoy-gateway.alauda.io/v1alpha1
kind: EnvoyProxyResourceQuota
metadata:
  name: gateway-quota
  namespace: tenant-a
spec:
  hard:
    requests.cpu: "4"
    requests.memory: 8Gi
kubectl apply -f gateway-quota.yaml

当必须同时检查不同策略时,可以在一个 namespace 中创建多个配额。只有当其产生的使用量在每个配额的硬限制以内时,EnvoyProxy 才会被准入。

配置 EnvoyProxy 请求

配额会统计 EnvoyProxy 资源中的以下字段:

EnvoyProxy 字段含义
.spec.provider.kubernetes.envoyDeployment.replicasEnvoy data plane 从节点数量
.spec.provider.kubernetes.envoyDeployment.container.resources.requests.cpu每个从节点的 CPU 请求
.spec.provider.kubernetes.envoyDeployment.container.resources.requests.memory每个从节点的内存请求

例如,以下 EnvoyProxy 会从配额中消耗 750m CPU 和 768Mi 内存:

apiVersion: gateway.envoyproxy.io/v1alpha1
kind: EnvoyProxy
metadata:
  name: gateway-proxy
  namespace: tenant-a
spec:
  provider:
    type: Kubernetes
    kubernetes:
      envoyDeployment:
        replicas: 3
        container:
          resources:
            requests:
              cpu: 250m
              memory: 256Mi

使用量计算如下:

CPU usage = replicas × envoyDeployment.container.resources.requests.cpu
Memory usage = replicas × envoyDeployment.container.resources.requests.memory

如果省略某个字段,配额将使用以下默认值:

字段默认值
replicas1
requests.cpu100m
requests.memory512Mi

配额不会统计资源限制,也不会检查由 Envoy Gateway 生成的最终 Deployment。

准入行为

当 namespace 中存在一个或多个配额时,Envoy Gateway Operator 会在 EnvoyProxy CREATE 和 UPDATE 请求存储之前对其进行验证:

  1. 根据该 namespace 中的 EnvoyProxy 资源计算其现有使用量。
  2. 对于更新操作,使用新对象的使用量替换旧对象的使用量。
  3. 根据该 namespace 中的每个配额检查产生的 CPU 和内存使用量。
  4. 如果任何硬限制将被超出,则拒绝该请求。错误信息会标识配额、资源、当前使用量、请求使用量和硬限制。

删除 EnvoyProxy 后,控制器重新调和配额时会减少报告的 status.used。不包含 EnvoyProxyResourceQuota 对象的 namespace 不会施加此 EnvoyProxy 特定的准入限制。

WARNING

准入是一种尽力而为的防护措施。并发的 CREATE 或 UPDATE 请求会根据请求时观察到的使用量进行评估,并不会以原子方式预留资源。在需要严格隔离时,请预留足够的余量。

监控 namespace 使用量

配额状态是 namespace 级总量的事实来源。列出配额以查看硬限制和已使用值:

kubectl get envoyproxyresourcequota -n tenant-a

输出包含以下列:

列来源含义
CPU Hard.status.hard.requests.cpu此配额的 CPU 硬限制
CPU Used.status.used.requests.cpunamespace 中 EnvoyProxy 资源计入的 CPU 请求总量
Memory Hard.status.hard.requests.memory此配额的内存硬限制
Memory Used.status.used.requests.memorynamespace 中 EnvoyProxy 资源计入的内存请求总量

如需查看完整值,请将某个配额资源检查为 YAML:

kubectl get envoyproxyresourcequota gateway-quota -n tenant-a -o yaml

配额或 EnvoyProxy 发生变化后,控制器会异步更新 status.hard 和 status.used。当一个 namespace 包含多个配额时,仅显示一次 namespace 使用量,并分别显示每个配额的硬限制;不要对重复的 CPU Used 或 Memory Used 值求和。

范围和限制

  • 此功能从 ACP 4.5 起可用。
  • 仅支持 requests.cpu 和 requests.memory。
  • 配额具有 namespace 作用域,仅适用于该 namespace 中的 EnvoyProxy 资源。
  • 配额独立于 Kubernetes ResourceQuota;不会读取或更新 ResourceQuota.status.used。
  • 不会限制资源 limits。
  • 不会跟踪最终的 Envoy Deployment,也不会强制执行 Deployment 准入策略。
  • 不支持跨 namespace 配额、特定于 Gateway 或 GatewayClass 的组,也不支持标签选择器。

下一步

创建配额后,配置相应的 Gateway 及其专用的 EnvoyProxy。若要了解 Envoy Gateway Operator 如何部署这些资源,请参阅 Envoy Gateway Operator。

商标声明

Envoy® 是 The Linux Foundation 的注册商标。

Alauda 是独立供应商。本产品与 The Linux Foundation 无关联,也未获得其认可或赞助。所有商标均归其各自所有者所有,此处仅用于标识目的。