在 Kubernetes 上部署
Kubernetes 上的路由器自托管部署
学习如何部署一个自托管的路由器(GraphOS 路由器或Apollo 路由器核心)在 Kubernetes 中使用 Helm 图表。
以下指南提供了以下步骤:
- 从 Apollo 容器存储库中获取 路由器 Helm 图表。
- 使用基本 Helm 图表部署 路由器。
- 配置图表值以导出度量、启用 Rhai 脚本和部署协处理器。
- 选择最适合从网关迁移到 路由器的图表值。
ⓘ 注意
Apollo 路由器核心的源代码及其所有分发均以 Elastic License v2.0 (ELv2) 许可证下提供。
关于路由器 Helm 图表
Helm是 Kubernetes(k8s)的包管理器。Apollo 为 GitHub 中的每个 Apollo 路由器核心版本提供应用程序 Helm 图表。自路由器版本 0.14.0 以来,Apollo 以 GitHub 容器存储库中的 开放容器倡议(OCI)镜像的形式发布了路由器 Helm 图表。
ⓘ 注意
OCI 路由器图表的路径是oci://ghcr.io/apollographql/helm-charts/router
。
您可以通过相同的 命令行选项和 YAML 配置来自定义已部署的 路由器,但分别在不同的 Helm CLI 选项和 YAML 键下。
基本部署
按照此指南使用 Helm 部署 Router,以安装每个路由器版本中提供的提供的基本图表。
每个 路由器图表都有一个 values.yaml
文件,包含 路由器和部署设置。已发布且未编辑的文件包含一些明确的设置,包括:
设置 Helm
安装 Helm 版本 3.x。路由器的 Helm 图表需要 Helm v3.x。
ⓘ 注意
您的Kubernetes版本必须与Helm v3兼容。详细信息,请参阅Helm版本支持策略。
使用Helm登录到GitHub的Apollo容器注册库。
获取GitHub OCI令牌并将其保存在环境变量
GITHUB_OCI_TOKEN
中。有关说明,请参照认证到GitHub容器注册库指南。使用
helm registry login
命令,使用您保存的GITHUB_OCI_TOKEN
和GitHub用户名:echo ${GITHUB_OCI_TOKEN} | helm registry login -u <username> --password-stdin ghcr.io
登录后,使用
helm show values
命令显示最新的router图表值来验证您对注册库的访问权限:helm show values oci://ghcr.io/apollographql/helm-charts/router
设置集群
安装工具并为您的Kubernetes集群提供基础设施。
例如,请参阅从Apollo的参考架构设置。该指南提供了您可参考的步骤,包括收集云平台(GCP或AWS)的帐户和凭证、提供资源以及部署您的子图。
设置图
如果您需要设置图的指南,您可以按照自托管路由快速启动和完成以下步骤:步骤 1 (设置 Apollo 工具)步骤 1(设置 Apollo 工具),步骤 4(获取您的子图模式)步骤 4(获取您的子图模式)以及步骤 5(发布您的子图模式)步骤 5(发布您的子图模式)。
部署路由器
要部署路由器,请使用带有容器仓库中 OCI 图像的参数、values.yaml
配置文件的参数以及覆盖特定配置值的附加参数helm install
命令。
helm install --namespace <router-namespace> --set managedFederation.apiKey="<graph-api-key>" --set managedFederation.graphRef="<graph-ref>" oci://ghcr.io/apollographql/helm-charts/router --version <router-version> --values router/values.yaml
用于特定配置值所需的参数:
--set managedFederation.graphRef="<graph-ref>"
。你的管理图引用(id@variant
),与APOLLO_GRAPH_REF
环境变量的值相同。--set managedFederation.apiKey="<graph-api-key>"
。您的管理图的 API 键,与APOLLO_KEY
环境变量的值相同。
一些可选但推荐使用的参数:
--namespace <router-namespace>
。此部署的命名空间范围。--version <router-version>
。要部署的路由器版本。如果不使用helm install
指定,则安装最新版本。
验证部署
使用helm list
命令验证您的路由器是否是部署的版本之一。
如果您使用了--namespace <router-namespace>
选项,您只能列出您命名空间内的版本:
helm list --namespace <router-namespace>
带有指标端点的部署
路由器支持 Prometheus 和 OpenTelemetry 协议(OTLP)的指标端点。基本部署不启用指标端点,因为路由器图表明确禁用了 Prometheus(和 OTLP 通过省略)。
通过 YAML 配置文件在已部署的路由器中启用指标端点:
创建一个
my_values.yaml
的 YAML 文件,以包含覆盖默认值的附加值。编辑
my_values.yaml
以启用指标端点:my_values.yamlrouter:configuration:telemetry:metrics:prometheus:enabled: truelisten: 0.0.0.0:9090path: "/metrics"otlp:temporality: deltaendpoint: <otlp-endpoint-addr>ⓘ 注意
虽然这个例子中启用了 Prometheus 和 OTLP,但在实践中通常只启用一个端点。
router.configuration.telemetry.metrics.prometheus
已配置但默认禁用(enabled: false
),此配置设置enabled: true
。router.configuration.telemetry.metrics.otlp
已启用。router.configuration.telemetry.temporality
默认是temporality: cumulative
,大多数指标消费者是一个不错的选择。对于DataDog,使用temporality: delta
。
使用额外的YAML配置文件部署 router。例如,从基本部署步骤开始使用
helm install
命令,追加--values my_values.yaml
:helm install --namespace <router-namespace> --set managedFederation.apiKey="<graph-api-key>" --set managedFederation.graphRef="<graph-ref>" oci://ghcr.io/apollographql/helm-charts/router --version <router-version> --values router/values.yaml --values my_values.yaml
使用Rhai脚本来部署
router 支持使用Rhai脚本来添加自定义功能。
在部署 router 中启用Rhai脚本需要为你的Rhai脚本挂载额外的卷并将脚本放入卷中。可以通过遵循 创建自定义内部路由图表的单独示例 中的步骤。该示例创建了一个新的(内部)图表,它封装(并依赖于)已发布的 router 图表,并且新的图表具有添加必要配置的模板,从而使部署的 router 能够使用Rhai脚本。
使用协作处理器部署
router 支持 外部协作处理 在 router的请求处理生命周期 上运行自定义逻辑。
已部署的协作处理器在 router pod 中有自己的应用程序镜像和容器。
要通过YAML配置文件配置协作处理器和其容器为您部署的 router,请执行以下步骤:
创建一个
my_values.yaml
的 YAML 文件,以包含覆盖默认值的附加值。编辑
my_values.yaml
以配置 router 的协作处理器。作为参考,遵循 典型 和 最小 配置示例,并将它们应用到router.configuration.coprocessor
。编辑
my_values.yaml
以添加一个用于协作处理器的容器。my_values.yamlextraContainers:- name: <coprocessor-deployed-name> # name of deployed containerimage: <coprocessor-app-image> # name of application imageports:- containerPort: <coprocessor-container-port> # must match port of router.configuration.coprocessor.urlenv: [] # array of environment variables使用额外的YAML配置文件部署 router。例如,从基本部署步骤开始使用
helm install
命令,追加--values my_values.yaml
:helm install --namespace <router-namespace> --set managedFederation.apiKey="<graph-api-key>" --set managedFederation.graphRef="<graph-ref>" oci://ghcr.io/apollographql/helm-charts/router --version <router-version> --values router/values.yaml --values my_values.yaml
按环境分开配置
为了支持您在不同环境(开发、预发布、生产等)的不同部署配置,Apollo建议将您的配置值分开到单独的文件
- 一个 通用 文件,其中包含适用于所有环境的值。
- 每个环境一个 环境 文件,该文件包含通用文件中的值,并覆盖这些值,同时添加新的环境特定值。
helm install
命令按照你在命令中设置它们的顺序应用每个 --values <values-file>
选项。因此,在设置环境文件之前必须设置一个通用文件,以便首先应用环境文件的值,并覆盖通用文件的值。
例如,此命令先应用 common_values.yaml
文件,然后才应用 prod_values.yaml
文件:
helm install --namespace <router-namespace> --set managedFederation.apiKey="<graph-api-key>" --set managedFederation.graphRef="<graph-ref>" oci://ghcr.io/apollographql/helm-charts/router --version <router-version> --values router/values.yaml --values common_values.yaml --values prod_values.yaml
使用 Istio 在 Kubernetes 中部署
Istio 是 Kubernetes 的一个服务网格,通常由于其流量整形能力而安装在集群上。虽然我们 neither 特地推荐 nor 支持 Istio,也没有为在包含 Istio 的集群中安装 Router 提供具体的指令,但在配置 Istio 时存在一个已知考虑因素。
由于 Istio 的 sidecar 注入方式,可能需要考虑更多的配置和额外配置。如果没有额外的配置,Istio 可能会尝试同时重新配置网络接口和 router 启动,这将导致启动失败。
这不是一个 router 问题,Istio 在他们的 自己的文档 中以一般方式管理问题的说明。他们建议在 Istio 准备就绪之前防止 pod 中所有其他容器的启动。当使用 Istio 时,我们推荐这种方法。
针对网关迁移进行配置
当 从 @apollo/gateway
迁移到 router 时,考虑以下建议以最大限度地提高您的 router 部署的兼容性。
增加最大请求数据包字节
默认情况下,router 将其支持的最大请求数据包大小设置为 2MB,而 gateway 将其支持的最大请求数据包大小设置为 20MB。如果您的 gateway 默认接收大于 2MB 的请求,您可以通过以下配置确保 router 与您的 gateway 部署兼容。
router:configuration:limits:http_max_request_bytes: 20000000 #20MB
增加请求超时时间
router 的超时时间增加,以适应具有高延迟的 subgraph 操作。
router:configuration:traffic_shaping:router:timeout: 6minall:timeout: 5min
传递 subgraph 错误
gateway 将 subgraph 错误传递给客户端,但 router 默认不传递,因此需要配置以传递它们。
router:configuration:include_subgraph_errors:all: true