2.11. 使用 3scale Istio 适配器

警告

查看不再支持的 Red Hat OpenShift Service Mesh 发行版本的文档。

Service Mesh 版本 1.0 和 1.1 control plane 不再被支持。有关升级服务网格 control plane 的详情,请参阅 升级 Service Mesh

有关特定 Red Hat OpenShift Service Mesh 发行版本的支持状态的信息,请参阅产品生命周期页面

3scale Istio 适配器是一个可选适配器,允许您在 Red Hat OpenShift Service Mesh 中标记运行的服务,并将该服务与 3scale API 管理解决方案集成。Red Hat OpenShift Service Mesh 不需要该适配器。

2.11.1. 将 3scale 适配器与 Red Hat OpenShift Service Mesh 集成

您可以使用这些示例来配置对使用 3scale Istio 适配器的服务的请求。

先决条件

  • Red Hat OpenShift Service Mesh 版本 1.x
  • 一个有效的 3scale 账户 (SaaS3scale 2.5 On-Premises)
  • 启用后端缓存需要 3scale 2.9 或更高版本
  • Red Hat OpenShift Service Mesh 的先决条件
注意

要配置 3scale Istio 适配器,请参考“Red Hat OpenShift Service Mesh 自定义资源”来获得在自定义资源文件中添加适配器参数的说明。

注意

请特别注意 kind: handler 资源。您必须使用 3scale 帐户凭证更新它。您可以选择将 service_id 添加到处理程序,但这仅用于向后兼容性,因为它会使处理程序仅对 3scale 帐户中的一个服务有用。如果将 service_id 添加到处理程序,则为其他服务启用 3scale 需要使用不同的 service_ids 创建更多处理程序。

按照以下步骤,每个 3scale 帐户使用一个处理器:

流程

  1. 为您的 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,这可能很有用。

  2. 编辑或修补属于 3scale 帐户的所有服务的 Deployment 资源,如下所示:

    1. 添加 "service-mesh.3scale.net/service-id" 标签,其值与有效的 service_id 对应。
    2. 添加 "service-mesh.3scale.net/credentials" 标签,其值为第 1 步中的 handler 资源的名称
  3. 每当您想要添加更多服务时,请执行第 2 步将其链接到您的 3scale 帐户凭证及其服务标识符。
  4. 用 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

2.11.1.1. 生成 3scale 自定义资源

适配器包括了一个可以用来生成 handlerinstancerule 自定义资源的工具。

表 2.16. 使用方法

选项描述必需的默认值

-h, --help

显示可用选项的帮助信息

不是

 

--name

这个 URL 的唯一名称,令牌对

 

-n, --namespace

生成模板的命名空间

不是

istio-system

-t, --token

3scale 访问令牌

 

-u, --url

3scale Admin Portal URL

 

--backend-url

3scale 后端 URL。如果设定,它会覆盖从系统配置中读取的值。

不是

 

-s, --service

3scale API/Service ID

不是

 

--auth

3scale 的认证方法(1=API Key, 2=App Id/App Key, 3=OIDC)

不是

混合

-o, --output

保存产生的清单的文件

不是

标准输出

--version

输出 CLI 版本并立即退出

不是

 
2.11.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]"

其他资源

2.11.1.2. 从部署的适配器生成清单

注意
  • NAME 是用于标识您使用 3scale 管理的服务的标识符。
  • CREDENTIALS_NAME 引用是一个标识符,对应于规则配置中的 match 部分。如果您使用 CLI 工具,这会自动设置为 NAME 标识符。
  • 其值不需要任何特定内容:标签值应当仅与规则的内容匹配。如需更多信息,请参阅通过适配器路由服务流量
  1. 运行这个命令从在 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}
  2. 这将在终端中输出示例。如果需要,请编辑这些样本,并使用 oc create 命令创建对象。
  3. 当请求到达适配器时,适配器需要知道服务如何被映射到一个 3scale 中的 API。您可以以两种方式提供这个信息:

    1. 标记(label)工作负载(推荐)
    2. 硬编码处理器为 service_id
  4. 使用所需注解更新工作负载:

    注意

    如果服务 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}"''

2.11.1.3. 通过适配器的路由服务流量

按照以下步骤,通过 3scale 适配器为您的服务驱动流量。

先决条件

  • 3scale 管理员的凭据和服务 ID。

流程

  1. 匹配在以前创建的配置中的 destination.labels["service-mesh.3scale.net/credentials"] == "threescale"(在 kind: rule 资源中)。
  2. 在部署目标负载时为 PodTemplateSpec添加上面的标签以集成服务 。threescale是生成的处理器的名称。这个处理器存储了调用 3scale 所需的访问令牌。
  3. 为工作负载添加 destination.labels["service-mesh.3scale.net/service-id"] == "replace-me" 标签,以便在请求时通过实例将服务 ID 传递给适配器。