1.21. 使用 3scale Istio 适配器
3scale Istio 适配器是一个可选适配器,允许您在 Red Hat OpenShift Service Mesh 中标记运行的服务,并将该服务与 3scale API 管理解决方案集成。Red Hat OpenShift Service Mesh 不需要该适配器。
您只能在 Red Hat OpenShift Service Mesh 版本 2.0 及以下中使用 3scale Istio 适配器。Mixer 组件在版本 2.0 中已弃用,并在版本 2.1 中删除。对于 Red Hat OpenShift Service Mesh 2.1.0 及更新的版本,您应该使用 3scale WebAssembly 模块。
如果要使用 3scale Istio 适配器启用 3scale 后端缓存,还必须启用 Mixer 策略和 Mixer 遥测。请参阅部署 Red Hat OpenShift Service Mesh control plane。
1.21.1. 将 3scale 适配器与 Red Hat OpenShift Service Mesh 集成
您可以使用这些示例来配置对使用 3scale Istio 适配器的服务的请求。
先决条件
- Red Hat OpenShift Service Mesh 版本 2.x
- 一个有效的 3scale 帐户(SaaS 或 3scale 2.9 On-Premises)
- 启用后端缓存需要 3scale 2.9 或更高版本
- Red Hat OpenShift Service Mesh 的先决条件
- 启用了 Mixer 强制功能。“更新 Mixer 策略强制”部分提供了检查当前 Mixer 策略实施状态和启用策略强制状态的信息。
如果您使用混合器插件,则必须启用混合器策略和遥测。
- 升级时,您需要正确配置 Service Mesh Control Plane(SMCP)。
要配置 3scale Istio 适配器,请参考“Red Hat OpenShift Service Mesh 自定义资源”来获得在自定义资源文件中添加适配器参数的说明。
请特别注意 kind: handler
资源。您必须使用 3scale 帐户凭证更新它。您可以选择将 service_id
添加到处理程序,但这仅用于向后兼容性,因为它会使处理程序仅对 3scale 帐户中的一个服务有用。如果将 service_id
添加到处理程序,则为其他服务启用 3scale 需要使用不同的 service_ids
创建更多处理程序。
按照以下步骤,每个 3scale 帐户使用一个处理器:
流程
为您的 3scale 帐户创建一个处理程序,并指定您的帐户凭证。省略任何服务标识符。
apiVersion: "config.istio.io/v1alpha2" kind: handler metadata: name: threescale spec: adapter: threescale params: system_url: "https://<organization>-admin.3scale.net/" access_token: "<ACCESS_TOKEN>" connection: address: "threescale-istio-adapter:3333"
您可以选择在 params 部分提供一个
backend_url
字段来覆盖 3scale 配置提供的 URL。如果适配器与 3scale 内部实例在同一集群中运行,且您希望利用内部集群 DNS,这可能很有用。编辑或修补属于 3scale 帐户的所有服务的 Deployment 资源,如下所示:
-
添加
"service-mesh.3scale.net/service-id"
标签,其值与有效的service_id
对应。 -
添加
"service-mesh.3scale.net/credentials"
标签,其值为第 1 步中的 handler 资源的名称。
-
添加
- 每当您想要添加更多服务时,请执行第 2 步将其链接到您的 3scale 帐户凭证及其服务标识符。
用 3scale 配置来修改规则配置,将规则发送到 3scale 处理器。
规则配置示例
apiVersion: "config.istio.io/v1alpha2" kind: rule metadata: name: threescale spec: match: destination.labels["service-mesh.3scale.net"] == "true" actions: - handler: threescale.handler instances: - threescale-authorization.instance
1.21.1.1. 生成 3scale 自定义资源
适配器包括了一个可以用来生成 handler
、instance
和 rule
自定义资源的工具。
选项 | 描述 | 必需的 | 默认值 |
---|---|---|---|
| 显示可用选项的帮助信息 | 不是 | |
| 这个 URL 的唯一名称,令牌对 | 是 | |
| 生成模板的命名空间 | 不是 | istio-system |
| 3scale 访问令牌 | 是 | |
| 3scale Admin Portal URL | 是 | |
| 3scale 后端 URL。如果设定,它会覆盖从系统配置中读取的值。 | 不是 | |
| 3scale API/Service ID | 不是 | |
| 3scale 的认证方法(1=API Key, 2=App Id/App Key, 3=OIDC) | 不是 | 混合 |
| 保存产生的清单的文件 | 不是 | 标准输出 |
| 输出 CLI 版本并立即退出 | 不是 |
1.21.1.1.1. 从 URL 示例生成模板
-
通过
oc exec
运行以下命令从 3scale adapter 容器镜像生成清单(请参阅 从一个部署的 adapter 生成清单)。 -
使用
3scale-config-gen
命令帮助避免 YAML 语法和缩进错误。 -
如果使用注解,可以省略
--service
。 -
此命令必须通过
oc exec
从容器镜像内调用。
流程
使用
3scale-config-gen
命令自动生成模板文件,允许令牌、URL 对作为单个处理器由多个服务共享:$ 3scale-config-gen --name=admin-credentials --url="https://<organization>-admin.3scale.net:443" --token="[redacted]"
以下示例生成带有嵌入在处理器中的服务 ID 的模板:
$ 3scale-config-gen --url="https://<organization>-admin.3scale.net" --name="my-unique-id" --service="123456789" --token="[redacted]"
其他资源
- 令牌.
1.21.1.2. 从部署的适配器生成清单
-
NAME
是用于标识您使用 3scale 管理的服务的标识符。 -
CREDENTIALS_NAME
引用是一个标识符,对应于规则配置中的match
部分。如果您使用 CLI 工具,这会自动设置为NAME
标识符。 - 其值不需要任何特定内容:标签值应当仅与规则的内容匹配。如需更多信息,请参阅通过适配器路由服务流量。
运行这个命令从在
istio-system
命名空间中部署的适配器生成清单:$ export NS="istio-system" URL="https://replaceme-admin.3scale.net:443" NAME="name" TOKEN="token" oc exec -n ${NS} $(oc get po -n ${NS} -o jsonpath='{.items[?(@.metadata.labels.app=="3scale-istio-adapter")].metadata.name}') \ -it -- ./3scale-config-gen \ --url ${URL} --name ${NAME} --token ${TOKEN} -n ${NS}
-
这将在终端中输出示例。如果需要,请编辑这些样本,并使用
oc create
命令创建对象。 当请求到达适配器时,适配器需要知道服务如何被映射到一个 3scale 中的 API。您可以以两种方式提供这个信息:
- 标记(label)工作负载(推荐)
-
硬编码处理器为
service_id
使用所需注解更新工作负载:
注意如果服务 ID 没有被嵌入到处理器中,您只需要更新本示例中的服务 ID。处理器中的设置会优先使用。
$ export CREDENTIALS_NAME="replace-me" export SERVICE_ID="replace-me" export DEPLOYMENT="replace-me" patch="$(oc get deployment "${DEPLOYMENT}" patch="$(oc get deployment "${DEPLOYMENT}" --template='{"spec":{"template":{"metadata":{"labels":{ {{ range $k,$v := .spec.template.metadata.labels }}"{{ $k }}":"{{ $v }}",{{ end }}"service-mesh.3scale.net/service-id":"'"${SERVICE_ID}"'","service-mesh.3scale.net/credentials":"'"${CREDENTIALS_NAME}"'"}}}}}' )" oc patch deployment "${DEPLOYMENT}" --patch ''"${patch}"''
1.21.1.3. 通过适配器的路由服务流量
按照以下步骤,通过 3scale 适配器为您的服务驱动流量。
先决条件
- 3scale 管理员的凭据和服务 ID。
流程
-
匹配在以前创建的配置中的
destination.labels["service-mesh.3scale.net/credentials"] == "threescale"
(在kind: rule
资源中)。 -
在部署目标负载时为
PodTemplateSpec
添加上面的标签以集成服务 。threescale
是生成的处理器的名称。这个处理器存储了调用 3scale 所需的访问令牌。 -
为工作负载添加
destination.labels["service-mesh.3scale.net/service-id"] == "replace-me"
标签,以便在请求时通过实例将服务 ID 传递给适配器。