Gateway Management
什么是 API 网关和网关管理?
一个 API Gateway 是 API 流量的中央管理点。它通过将客户端请求路由到适当的后端服务来处理这些请求,在必要时转换请求和响应,执行安全策略,监控流量,并确保整体 API 的可靠性。
API 网关的关键功能
- Routing: 将客户端请求定向到适当的后端服务。
- Transformation: 根据需要转换请求或响应格式。
- Authentication & Authorization: 验证客户端凭据并授予访问权限。
- Traffic Control: 管理和限制 API 流量以防止后端过载。
- Logging & Monitoring: 记录 API 使用数据以进行跟踪和分析。
- Security & Protection: 阻止恶意攻击并增强 API 安全性。
在 APIM 中,Kong API 网关被用作 Kubernetes (K8s) 部署。
网关管理菜单
APIM 中的 Gateway Management 菜单允许用户:
- 查看和管理网关列表。
- 监控各个网关的状态。
- 根据项目查询、创建、更新和删除网关。
- 管理多个网关 URL。
- 配置节点亲和性、容忍度和拓扑设置。
- 为 HTTPS 安全设置 TLS 证书。
- 通过注释/标签(K8s Ingress 注释/标签)添加元数据。
每个 Gateway URL 代表用于 API 请求的端点。
例如,如果通过 https://api.company.com/path 访问 API,则网关 URL 为 api.company.com。
网关列表屏幕
Gateway List 屏幕提供了项目中所有网关的概述,使用户能够:
- 一目了然地查看所有网关。
- 检查 CPU、内存和副本配置。
- 监控每个网关的运行或待机状态。
- 搜索特定网关或创建新网关。
创建网关
要创建一个新的网关,请按照以下步骤操作:
导航到网关管理菜单。
点击 "创建网关"
选择一个项目
选择一个项目,在该项目下管理网关。有关创建项目的说明,请参阅 Tenant Manager Console/Create a Project.
配置网关设置
Gateway Configuration 部分允许对网关进行详细定制。以下是关键字段:
Gateway Type- Purpose: 定义 API 网关类型。
- Mandatory: 是
- Input Instructions: 与项目的网关类型对齐。无法更改。
- Purpose: 网关的唯一标识符。
- Mandatory: 是
- Input Instructions: 只能使用英文字母、数字、spaces、连字符 ‘-’、下划线 ‘_’ 或双冒号 ‘:’。必须以英文字母开头。
- Purpose: 标识网关实例。
- Mandatory: 是
- Input Instructions: 根据网关名称自动填充。
- Purpose: 提供有关网关的附加详细信息。
- Mandatory: 否
- Input Instructions: 输入简短描述。
- Purpose: 有助于过滤和搜索网关。
- Mandatory: 否
- Input Instructions: 网关可以有多个标签。输入标签时按 Enter 键分隔 .
- Purpose: 为网关分配资源。
- Mandatory: 是
- Input Instructions: 使用滑块进行调整。值范围从 500 到 16000 m/mi。
- Purpose: 为网关使用的内部数据库分配资源。
- Mandatory: 是
- Input Instructions: 使用滑块进行调整。值范围从 500 到 16000 m/mi。
- Purpose: 在部署后自动扩展网关资源分配
- Mandatory: 是
- Instructions: 切换以开启自动扩展。一旦开启,配置最小副本、最大副本、CPU 使用率、内存使用率的自动扩展值。
- Purpose: 确定网关在 Kubernetes 中运行的位置。
- Mandatory: 是
- Input Instructions: 从下拉列表中选择一个命名空间。
- Purpose: 定义网关的存储配置方式。
- Mandatory: 是
- Input Instructions: 从下拉列表中选择一个存储类。
- Purpose: 指定网关的存储分配。
- Mandatory: 是
- Input Instructions: 输入一个介于 5 和 500 (Gi) 之间的值。
- Purpose: 确定 Kong 代理的服务类型
- Mandatory: 是
- Input Instructions: 从 ClusterIP、NodePort、LoadBalancer 中选择一个。如果选择 NodePort 或 LoadBalancer,则需要用户输入 Kong 代理服务的 NodePort 值(介于 30000 和 32767 之间)
- Purpose: 亲和性用于控制网关 Pod 将在哪些节点上调度,通过匹配节点标签。
- Mandatory: 如果切换为开启,则是。
- Input Instructions: 切换亲和性为开启以启用它。然后提供节点标签的键和值。这在 Kubernetes 中转换为 nodeAffinity 规则,使用 requiredDuringSchedulingIgnoredDuringExecution。例如:
nodeAffinity:
- Purpose: 容忍度允许网关 Pod 被调度到标记(污染)为特定工作负载的节点上。
- Mandatory: 如果切换为开启,则是。
- Input Instructions: 开启后,输入以下内容:
- 操作符:选择“Equal”或“Exists”。Equal:键和值必须完全匹配。Exists:只需要键存在;值不是必需的。
- 键和值:提供污点键和值(如果操作符是Exists,则值是可选的)。
容忍:
- 效果:NoSchedule
键:"tolerationKey"
操作符:"Equal"或Exists
值:"tolerationValue"
- Purpose: 拓扑分布约束确保网关Pod在故障域(如区域或节点)之间均匀分布,从而提高弹性和可用性。
- Mandatory: 如果开启,则为“是”。
- Input Instructions: 开启后,输入以下内容:
- Max Skew:拓扑域之间网关Pod数量的最大允许差异(例如,如果设置为1,则每个区域的Pod数量不得相差超过1)。
- When Unsatisfiable:选择以下选项之一:ScheduleAnyway(默认):即使无法完全满足分布约束,仍然允许调度;DoNotSchedule:如果约束失败,则阻止Pod调度;DoNotScheduleIfNotSatisfied:更新策略,仅在未满足分布条件时限制调度。
映射到的Kubernetes示例规则:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: ScheduleAnyway
labelSelector:
matchLabels:
app.kubernetes.io/instance: test-kong
- Purpose: 允许内部Redis实例用于缓存。
- Mandatory: 如果开启,则为“是”
- Input Instructions: 开启/关闭切换。如果开启,则在部署网关时安装默认Redis。如果关闭,用户将被告知APIM Redis不支持使用Redis的策略(速率限制、jwt黑名单、OIDC)。用户需要在提示中确认以继续切换为关闭。
- Purpose:Fluent Bit是一个轻量级日志处理器,收集、过滤并转发来自网关容器的日志。
- Mandatory: 否
- Input Instructions: 启用后,您还可以选择以下目标之一:
- OpenTelemetry:使用OpenTelemetry代理转发日志和遥测数据。
- Elasticsearch:将日志转发到Elasticsearch集群以进行索引和搜索。
注意:这些选项中只能有一个处于活动状态。如果您在另一个已经处于活动状态时启用一个,将出现确认提示以禁用当前活动的选项。
- Purpose:此字段允许您通过提供原始JSON格式的配置,直接将高级、低级配置应用于Kong Gateway运行时,以便在需要微调性能或行为时使用。
- Mandatory:如果开启,则为“是”
- Input Instructions:开启后,将出现一个JSON编辑器,您可以在其中输入自定义Kong运行时设置。
示例:
"upstream_keepalive_idle_timeout": 60,
"upstream_keepalive_max_requests": 100000,
"nginx_http_keepalive_requests": 100000,
"upstream_keepalive_pool_size": 1024
注意:配置错误可能导致网关行为不稳定。在应用更改之前,请咨询Kong文档或您的平台管理员。
网关配置总结如下表:
Field Name | Purpose | Input Notes | Mandatory |
---|---|---|---|
网关类型 | 定义API网关类型。 | 与项目的网关类型对齐。无法更改。 | 是。默认是kong。 |
网关名称 | 网关的唯一标识符。 | 只能使用英文字母、数字、连字符‘-’、下划线‘_’或双冒号‘:’。必须以英文字母开头。 | 是 |
网关实例名称 | 标识网关实例。 | 根据网关名称自动填充。 | 是 |
网关描述 | 提供有关网关的附加详细信息。 | 输入简短描述。 | 否 |
网关标签 | 有助于过滤和搜索网关。 | 网关可以有多个标签。输入标签时按Enter键分隔. | 否 |
网关CPU/内存 | 为网关分配资源。 | 使用滑块调整。值范围从500到16000 m/mi。 | 是 |
数据库CPU/内存 | 为网关使用的内部数据库分配资源。 | 使用滑块调整。值范围从500到16000 m/mi。 | 是 |
网关自动扩展 | 部署后启用自动Pod资源扩展。 | 开启/关闭切换。如果开启,配置:最小副本、最大副本、CPU阈值(%)、内存阈值(%) | 如果开启,则为“是” |
Kong命名空间 | 确定网关在Kubernetes中运行的位置。 | 从下拉列表中选择一个命名空间。 | 是 |
Kong存储类 | 定义网关的存储配置方式。 | 从下拉列表中选择一个存储类。 | 是 |
存储容量 | 指定网关的存储分配。 | 输入5到500(Gi)之间的值。 | 是 |
Kong代理服务类型 | 定义Kong代理的服务类型以供外部访问 | 从:ClusterIP、NodePort或LoadBalancer中选择。默认是ClusterIP。 | 是 |
亲和性 | 将网关Pod调度到具有匹配标签的节点。 | 开启/关闭切换。如果开启,输入节点标签的键和值 | 如果开启,则为“是” |
容忍 | 允许网关Pod在污点节点上运行。 | 开启/关闭切换。如果开启,选择操作符:Equal或Exists。输入键,值可选。 | 如果开启,则为“是” |
拓扑分布 | 在区域之间均匀分配Pod以增强可用性。 | 开启/关闭切换。如果开启,输入:最大偏差(例如,1)。选择不满足时的选项:从ScheduleAnyway、DoNotSchedule、DoNotScheduleIfNotSatisfied中选择 | 如果开启,则为“是” |
内部Redis | 允许内部Redis实例用于缓存。 | 开启/关闭切换。如果开启,则在部署网关时安装默认Redis。 | 如果开启,则为“是” |
Fluent Bit | 启用OpenTelemetry代理进行指标收集或Elasticsearch进行日志收集。 | 只能在OpenTelemetry或Elasticsearch之间选择 | 如果开启,则为“是” |
Kong配置 | 启用手动覆盖Kong配置。 | 开启以启用编辑器并输入有效的JSON。 | 如果开启,则为“是” |
完成创建
点击“创建网关”按钮以完成创建并存储网关配置。
添加和管理网关URL
网关URL配置允许用户为API网关定义一个或多个面向公众的域。它还支持HTTPS的TLS证书、API路由的全局基本路径以及通过注释提供的附加元数据。每个网关可以有多个网关URL,定义如何访问API网关。
要开始添加网关URL,用户可以点击网关管理屏幕中列出的已创建网关以进入网关修改屏幕。
在这里,用户可以找到下面的网关URL配置部分。
以下是创建网关 URL 的步骤:
创建 URL
点击添加来创建多个 URL。将会在下面创建一个新的块来配置 URL。
配置网关 URL
以下是配置网关 URL 的关键字段:
Gateway URL- Purpose: 定义网关可访问的公共域名。如果用户更改正在使用的网关 URL,现有的 API 可能无法正确调用。
- Mandatory: 是
- Input Instructions: 输入有效的域名。
- Example:
your.domain.com
your.domain.com:8443
- Purpose: 为此网关下的所有 API 设置一个公共前缀。如果定义,所有此网关下的 API 将继承此前缀。如果在使用时更改了基本路径,现有的 API 可能无法正确调用。
- Mandatory: 是
- Input Instructions: 输入基本路径。如果留空 /,则使用根路径。
- Example:
/ /apim
- Purpose: 包括 tls.crt 以通过提供 SSL 证书和 tls.key 文件来启用 HTTPS 通信,以验证 TLS 证书。如果应用了仅允许在与网关 URL 通信时使用 HTTPS 的网络策略,用户需要切换开启 HTTPS。如果用户正在使用 K8s Secret 注册 TLS 证书并通过 K8s Ingress 处理 TLS 认证,用户必须输入 tls.crt/tls.key 值。
- Mandatory: 取决于
- Input Instructions: 粘贴 PEM 格式的证书内容。安全 HTTPS 连接所必需。
- Purpose:指定用于此网关 URL 配置的入口控制器。
- Mandatory:是
- Input Instructions:从下拉列表中选择一个入口类。可用选项可能包括:
- nginx(默认)
- alb
- appsec-kong
此设置通过所选的入口控制器路由网关 URL。
- Purpose:向为此网关 URL 创建的入口资源添加 Kubernetes 标签。对于分类或自动化目的非常有用。
- Mandatory:否
- Input Instructions:输入一个或多个键值对。这些标签将应用于创建的入口对象。使用加号按钮添加多个条目,或使用叉号按钮删除添加的条目。
- Purpose: :为高级配置添加 Kubernetes 入口注释,例如自定义超时、头部操作或控制器特定选项。
- Mandatory::否
- Input Instructions::可以使用两种模式输入注释:
表单模式(JSON 切换关闭):手动输入每个注释的键和值。某些字段可能因系统限制而无法编辑。可以通过单击加号按钮添加多个注释,或通过单击叉号按钮删除添加的注释。必须保留至少一个注释。
示例:
键:[nginx.ingress.kubernetes.io/proxy-connect-timeout](http://nginx.ingress.kubernetes.io/proxy-connect-timeout)
值:more_clear_headers \"server\
JSON 模式(JSON 切换开启):在编辑器中将注释作为键值 JSON 对象数组输入。
示例:
"key": "[nginx.ingress.kubernetes.io/configuration-snippet](http://nginx.ingress.kubernetes.io/configuration-snippet)",
"value": "more_clear_headers \"server\";more_clear_headers \"via\";"
网关 URL 配置总结如下表:
Field Name | Purpose | Input Notes |
---|---|---|
网关 URL | 定义网关可访问的公共域名。如果用户更改正在使用的网关 URL,现有的 API 可能无法正确调用。 | 输入有效的域名(例如,api.example.com)。必填字段。 |
全局基本路径 | 为此网关下的所有 API 设置一个公共前缀。如果定义,所有此网关下的 API 将继承此前缀。 | 输入基本路径(例如,/api)。如果留空 /,则使用根路径。 |
TLS 证书 (tls.crt) | 通过提供 SSL 证书来启用 HTTPS 通信。 | 粘贴 PEM 格式的证书内容。安全 HTTPS 连接所必需。 如果用户正在使用 K8s Secret 注册 TLS 证书并通过 K8s Ingress 处理 TLS 认证,用户必须输入 tls.crt/tls.key 值。 |
TLS 私钥 (tls.key) | 用于验证 TLS 证书。 | 粘贴 PEM 格式的私钥内容。必须与提供的证书匹配。 |
入口类 | 指定用于此网关 URL 配置的入口控制器。 | 从 nginx(默认)、alb 或 appsec-kong 中选择一个入口类。 |
标签 | 向为此网关 URL 创建的入口资源添加 Kubernetes 标签。 | 输入一个或多个键值对。可以添加或删除对。 |
注释 | 为高级配置添加 Kubernetes 入口注释。 | 可以使用两种模式输入多个注释:键值对(JSON 模式关闭)或 JSON 脚本(JSON 模式开启)。 |
如果两个网关 URL(api.example.com 和 service.example.com)配置了基本路径 /api,则:
https://api.example.com/api/{API-Path}
https://service.example.com/api/{API-Path}
将是有效的 API 端点。
修改网关
用户可以通过以下方式修改现有网关:
-
从列表中选择一个网关。
-
编辑可配置字段和输入(网关描述、网关标签、网关 CPU/内存、数据库 CPU/内存、切换和数值等)。
- 根据需要更新 Gateway URLs。
- 保存更改以应用更新。
如果用户更改了网关 URL,请记得在点击保存网关按钮之前点击保存网关 URL 按钮。
删除网关
删除网关将 permanently remove 所有相关数据。此操作 cannot be undone。
- 导航到 Gateway Management。
- 选择要删除的网关。
- 点击 "Deleting A Gateway" 并确认操作。
- 依赖于此网关的 API 将不再可访问。
- 在删除之前确保没有活动的 API 依赖。