8.9. 与功能相关的产品自定义资源
在新创建的租户中使用 Openshift Container Platform,您将配置产品及其对应的指标、方法、应用程序计划和映射规则,并且定义产品后端使用情况,并将您的产品链接到您的租户帐户。
前提条件
常规先决条件 中列出的安装要求与以下事项相同:
- 3scale 帐户中的最低必要参数是产品名称。
8.9.1. 部署与功能相关的产品自定义资源
在新创建的租户中使用 Openshift Container Platform,您将配置新产品。
8.9.1.1. 部署基本产品自定义资源
流程
- 在 OpenShift 帐户中,导航到 Installed operator。
- 单击 3scale 操作器。
- 在 3scale 产品 下,单击 Create Instance。
- 选择 YAML 视图。
创建 3scale 产品:
apiVersion: capabilities.3scale.net/v1beta1 kind: Product metadata: name: <your_product_OpenShift_name> spec: name: "<your_product_name>"
例如:
apiVersion: capabilities.3scale.net/v1beta1 kind: Product metadata: name: product1 spec: name: "OperatedProduct 1"
- 要保存您的更改,请点击 Create。
等待几秒钟,让产品在 OpenShift 和 3scale 帐户中创建。然后,您可以执行以下操作:
-
在 3scale 产品概述 页面中检查 Synced 条件标记为
True
,以确认该产品已在 OpenShift 中创建。 -
转至 3scale 帐户,您会看到该产品已创建好。在上例中,您将看到一个名为
OperatedProduct 1
的新产品。
-
在 3scale 产品概述 页面中检查 Synced 条件标记为
另外,您可以为您创建的每个产品指定 APIcast 部署模式。有两种替代方案:
8.9.1.2. 使用 APIcast 托管部署产品
使用托管 APIcast 配置您的产品:
apiVersion: capabilities.3scale.net/v1beta1 kind: Product metadata: name: product1 spec: name: "OperatedProduct 1" deployment: apicastHosted: {}
8.9.1.3. 使用 APIcast 自助管理部署产品
使用 APIcast 自我管理配置您的产品。在这种情况下,指定一个 stagePublicBaseURL
和 productionPublicBaseURL
:
apiVersion: capabilities.3scale.net/v1beta1 kind: Product metadata: name: product1 spec: name: "OperatedProduct 1" deployment: apicastSelfManaged: stagingPublicBaseURL: "https://staging.api.example.com" productionPublicBaseURL: "https://production.api.example.com"
8.9.2. 定义产品应用程序计划
将 Openshift Container Platform 与新创建的 3scale 租户一起使用,使用 applicationPlans
对象在您的产品自定义资源中定义所需的应用计划。
请考虑以下观察:
-
applicationPlans
map 键名称将用作system_name
。在以下示例中:plan01
和plan02
。
setupFee
和 costMonth
是通用的 3scale 概念。在 3scale 用户界面中创建应用程序计划时,您必须输入这些详情。参阅使用您的定价规则配置应用程序计划。
流程
在新的 3scale 产品中添加应用程序计划,如下例所示:
apiVersion: capabilities.3scale.net/v1beta1 kind: Product metadata: name: product1 spec: name: "OperatedProduct 1" applicationPlans: plan01: name: "My Plan 01" setupFee: "14.56" plan02: name: "My Plan 02" trialPeriod: 3 costMonth: 3
8.9.3. 为产品应用程序计划定义限制
将 Openshift Container Platform 与新创建的 3scale 租户一起使用,通过使用 applicationPlans.limits
列表为您的产品应用计划定义所需的限制。
考虑以下观察:
-
period
、value
和metricMethodRef
是必填字段。 -
metricMethodRef
引用可以是产品,也可以是后端引用。使用可选的backend
字段来引用 backend 指标的所有者。
流程
为 3scale 产品的应用程序计划定义限值,如下例所示:
apiVersion: capabilities.3scale.net/v1beta1 kind: Product metadata: name: product1 spec: name: "OperatedProduct 1" metrics: hits: description: Number of API hits friendlyName: Hits unit: "hit" applicationPlans: plan01: name: "My Plan 01" limits: - period: month value: 300 metricMethodRef: systemName: hits backend: backendA - period: week value: 100 metricMethodRef: systemName: hits
8.9.4. 定义产品应用程序计划的定价规则
将 Openshift Container Platform 与新创建的 3scale 租户一起使用,通过使用 applicationPlans.pricingRules
列表为您的产品应用程序计划定义所需的定价规则。
考虑以下观察:
-
from
,to
,pricePerUnit
和metricMethodRef
是必填字段。 -
from
和to
将被验证。对于任何规则,from
的值小于to
,对同一个规则有相互重叠的范围不被允许。 -
metricMethodRef
引用可以是产品,也可以是后端引用。使用可选的backend
字段来引用 backend 指标的所有者。
流程
为 3scale 产品的应用计划定义定价规则,如下例所示:
apiVersion: capabilities.3scale.net/v1beta1 kind: Product metadata: name: product1 spec: name: "OperatedProduct 1" metrics: hits: description: Number of API hits friendlyName: Hits unit: "hit" applicationPlans: plan01: name: "My Plan 01" pricingRules: - from: 1 to: 100 pricePerUnit: "15.45" metricMethodRef: systemName: hits - from: 1 to: 300 pricePerUnit: "15.45" metricMethodRef: systemName: hits backend: backendA
8.9.5. 使用 OpenID Connect 定义产品身份验证
您可以为 3scale 产品部署产品
自定义资源,该产品使用 OpenID Connect (OIDC)对任何 OAuth 2.0 流进行身份验证。3scale 与 OpenID Connect 等第三方身份提供程序(IdP)集成,以验证 API 请求。有关 OpenID Connect 的更多信息,请参阅 OpenID Connect 集成。与第三方 IdP 集成后,您将有两种类型的数据需要与产品自定义资源包含:
-
issuerType
:在与第三方 IdP 集成时,使用红帽单点登录 (RH-SSO) 以及rest
值时,会使用keycloak
值。 -
issuerEndpoint
:其中包含所需凭证的 URL。
前提条件
- 您必须配置 RH-SSO。请参阅 配置红帽单点登录。
- 您必须 配置 HTTP 与第三方身份提供程序的集成。
issuerEndpoint
中提供的 CLIENT_ID 和 CLIENT_CREDENTIALS 凭据必须具有足够的权限来管理域中的其他客户端。
流程
确定端点
issuerEndpoint
,它定义 OpenID 供应商的位置,并在产品自定义资源中使用此格式:https://<client_id>:<client_secret>@<host>:<port_number>/auth/realms/<realm_name>`
定义或更新 3scale
产品
CR,为任何 OAuth 2.0 流指定 OpenID Connect(OIDC)身份验证。例如:apiVersion: capabilities.3scale.net/v1beta1 kind: Product metadata: name: product1 spec: name: "OperatedProduct 1" deployment: <any>: authentication: oidc: issuerType: "keycloak" issuerEndpoint: "https://myclientid:myclientsecret@mykeycloack.example.com/auth/realms/myrealm" authenticationFlow: standardFlowEnabled: false implicitFlowEnabled: true serviceAccountsEnabled: true directAccessGrantsEnabled: true jwtClaimWithClientID: "azp" jwtClaimWithClientIDType: "plain"
创建您刚刚定义的资源。例如:
oc create -f product1.yaml
对于给定示例,输出为:
product.capabilities.3scale.net/product1 created
其他资源
8.9.6. 定义产品指标
将 Openshift Container Platform 与新创建的 3scale 租户一起使用,使用 metrics
对象在产品自定义资源中定义所需的指标。
考虑以下观察:
-
metrics
映射键名称将用作system_name
。在以下示例中:metric01
和hits
。 -
在所有指标和方法中,指标
metrics
键名称都必须是唯一的。 -
unit
和friendlyName
是必填字段。 -
如果没有添加
hits
指标,它将由操作器创建。
流程
在新的 3scale 后端中添加产品指标,如下例所示:
apiVersion: capabilities.3scale.net/v1beta1 kind: Product metadata: name: product1 spec: name: "OperatedProduct 1" metrics: metric01: friendlyName: Metric01 unit: "1" hits: description: Number of API hits friendlyName: Hits unit: "hit"
8.9.7. 定义产品方法
将 Openshift Container Platform 与新创建的 3scale 租户一起使用,使用 method 对象在产品自定义资源中定义所需的 methods
。
考虑以下观察:
-
映射键名称的
methods
将用作system_name
。在以下示例中:Method01
和Method02
。 -
在所有指标和方法中,
methods
映射键名称必须是唯一的。 -
friendlyName
是一个必填字段。
流程
在新的 3scale 产品中添加方法,如下例所示:
apiVersion: capabilities.3scale.net/v1beta1 kind: Product metadata: name: product1 spec: name: "OperatedProduct 1" methods: method01: friendlyName: Method01 method02: friendlyName: Method02
8.9.8. 定义产品映射规则
将 Openshift Container Platform 与新创建的 3scale 租户一起使用,使用 mappingRules
对象在产品自定义资源中定义所需的映射规则。
考虑以下观察:
-
httpMethod
,pattern
,increment
和metricMethodRef
是必填字段。 -
metricMethodRef
包含对现有指标或方法映射键名称system_name
的引用。在以下示例中,hits
。
流程
将产品映射规则添加到新的 3scale 后端,如下例所示:
apiVersion: capabilities.3scale.net/v1beta1 kind: Product metadata: name: product1 spec: name: "OperatedProduct 1" metrics: hits: description: Number of API hits friendlyName: Hits unit: "hit" methods: method01: friendlyName: Method01 mappingRules: - httpMethod: GET pattern: "/pets" increment: 1 metricMethodRef: hits - httpMethod: GET pattern: "/cars" increment: 1 metricMethodRef: method01
8.9.9. 定义产品后端使用情况
将 Openshift Container Platform 与新创建的 3scale 租户一起使用,通过应用 backendUsages
对象来定义所需的后端以声明方式添加到产品中。
考虑以下观察:
-
path
是必填字段。 -
backendUsages
映射密钥名称引用后端的system_name
。在以下示例中:backendA
和backendB
。
流程
在产品中添加后端以声明性地定义其使用情况,如下例所示:
apiVersion: capabilities.3scale.net/v1beta1 kind: Product metadata: name: product1 spec: name: "OperatedProduct 1" backendUsages: backendA: path: /A backendB: path: /B
8.9.10. 在 3scale 产品自定义资源中配置网关响应
作为 3scale 管理员,您可以配置 产品自定义资源,以指定对对该 API 产品
公开 API 的请求的网关响应。部署 CR 后,3scale 确保网关返回您指定的响应和错误消息。
在 Product
CR 中,gatewayResponse
对象包含您希望网关返回的响应。
流程
在新的或已部署的
Product
CR 中,在gatewayResponse
对象中配置一个或多个响应。以下示例显示了使用名为userKey
的身份验证模式的 Apicast 托管部署的响应配置:apiVersion: capabilities.3scale.net/v1beta1 kind: Product metadata: name: product1 spec: name: "OperatedProduct 1" deployment: apicastHosted: authentication: userkey: gatewayResponse: errorStatusAuthFailed: 500 errorHeadersAuthFailed: "text/plain; charset=mycharset" errorAuthFailed: "My custom reponse body" errorStatusAuthMissing: 500 errorHeadersAuthMissing: "text/plain; charset=mycharset" errorAuthMissing: "My custom reponse body" errorStatusNoMatch: 501 errorHeadersNoMatch: "text/plain; charset=mycharset" errorNoMatch: "My custom reponse body" errorStatusLimitsExceeded: 502 errorHeadersLimitsExceeded: "text/plain; charset=mycharset" errorLimitsExceeded: "My custom reponse body"
部署包含网关响应的
产品
CR。例如,如果您更新了product1.yaml
文件,请运行以下命令:oc create -f product1.yaml
对于给定示例,输出为:
product.capabilities.3scale.net/product1 created
8.9.11. 在 3scale 产品自定义资源中配置策略链
作为 3scale 管理员,您可以配置 产品
自定义资源以指定您要应用到该 API 产品的策略链。部署 CR 后,3scale 将配置的策略应用到产品的上游公开 API。
流程
在新的或已部署的
产品
CR 中,在policies
对象中配置一个或多个策略。例如:apiVersion: capabilities.3scale.net/v1beta1 kind: Product metadata: name: product1 spec: name: "OperatedProduct 1" policies: - configuration: http_proxy: http://example.com https_proxy: https://example.com enabled: true name: camel version: builtin - configuration: {} enabled: true name: apicast version: builtin
对于每个策略,请指定以下字段:
-
当策略没有参数时,
配置
是一对空的大括号。当策略有参数时,请在此处指定它们。有关您需要指定的任何参数的名称,请参阅 管理 API 网关 APIcast 标准策略中的相关策略 文档。 -
启用
是打开或关闭策略的布尔值开关。 -
name
标识策略。这是Product
自定义资源链接的租户范围内的唯一名称。要识别策略名称,请参阅 管理 API 网关 API 网关 APIcast 标准策略中相关策略 的文档。 版本
内置
有标准策略或用于自定义策略的用户定义的字符串。例如,您可以将自定义策略的版本设置为1.0
。如果
Product
CR 没有指定apicast
策略,Operator 会添加它。如果在管理门户中已定义了策略链,您可以运行 3scale toolbox
export
命令以.yaml
格式导出策略链。您可以将导出
的输出粘贴到产品
CR 中。例如,如果api-provider-account-one
是 3scale 供应商帐户的名称,并且my-api-product-one
是您要导出的策略链的产品名称,您将运行以下命令:
3scale policies export api-provider-account-one my-api-product-one
-
当策略没有参数时,
部署包含策略链的
产品
CR。例如,如果您更新了product1.yaml
文件,请运行以下命令:oc create -f product1.yaml
对于给定示例,输出为:
product.capabilities.3scale.net/product1 created
8.9.12. 产品自定义资源的状态
status 字段显示对最终用户有用的资源信息。它不应手动更新,在每次资源更改时都会同步。
这些是 status 字段的属性:
-
productId
:3scale 产品的内部标识符。 Conditions
:代表status.Conditions
Kubernetes 通用模式。它有这些类型或状态:- Failed :同步过程中发生了错误。操作将重试。
- 同步 :产品已成功同步。
- 无效 :无效对象。这不是临时错误,但它报告无效规格,应该进行更改。Operator 不会重试。
- Orphan: 规格引用不存在的资源。操作器将重试。
-
observedGeneration
:确认状态信息已使用最新的资源规格更新。 -
State
:从 3scale API 读取的 3scale 产品内部状态。 -
providerAccountHost
:与后端同步的 3scale 供应商帐户 URL。
同步资源示例:
status: conditions: - lastTransitionTime: "2020-10-21T18:07:01Z" status: "False" type: Failed - lastTransitionTime: "2020-10-21T18:06:54Z" status: "False" type: Invalid - lastTransitionTime: "2020-10-21T18:07:01Z" status: "False" type: Orphan - lastTransitionTime: "2020-10-21T18:07:01Z" status: "True" type: Synced observedGeneration: 1 productId: 2555417872138 providerAccountHost: https://3scale-admin.example.com state: incomplete
8.9.13. 链接到租户帐户的产品自定义资源
当 3scale 操作器找到新的 3scale 资源时,LookupProviderAccount 进程从识别拥有该资源的租户开始。
进程检查租户凭据来源。如果未找到,则引发错误。
以下步骤描述了进程如何验证租户凭证源:
检查 providerAccountRef resource 属性中的凭据。这是一个 secret 本地引用,例如 mytenant:
apiVersion: capabilities.3scale.net/v1beta1 kind: Product metadata: name: product1 spec: name: "OperatedProduct 1" providerAccountRef: name: mytenant
mytenant secret 必须具有填充租户凭据的 adminURL 和 token 字段。例如:
apiVersion: v1 kind: Secret metadata: name: mytenant type: Opaque stringData: adminURL: https://my3scale-admin.example.com:443 token: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
检查默认的 threescale-provider-account 机密。例如:
adminURL=https://3scale-admin.example.com
和token=123456
:oc create secret generic threescale-provider-account --from-literal=adminURL=https://3scale-admin.example.com --from-literal=token=123456
- 在 3scale 部署的相同命名空间中检查默认供应商账户:如果 3scale 安装位于与自定义资源相同的命名空间中,Operator 将自动为默认的 3scale 租户(provider 帐户)收集所需的凭证。
8.9.14. 删除产品自定义资源
您可以通过删除管理它的自定义资源来删除 3scale 产品实体。当您删除 产品
自定义资源时,3scale Operator 不会更新指向已删除产品的对象。
删除由产品自定义资源定义的 API 产品
的唯一方法是按照如下所述的步骤进行操作。不要使用 Admin Portal 或 3scale API 来删除部署为自定义资源的产品。
前提条件
3scale 管理员权限或具有删除命名空间中具有删除权限的 OpenShift 角色,其中包含您要删除的自定义资源。要识别可以删除特定
产品
自定义资源的人员,请运行oc policy who-can delete
命令。例如,如果 CR 中的名称是myproduct
,则运行这个命令:oc policy who-can delete product.capabilities.3scale.net/myproduct
-
要删除到有效租户的链接的
Product
CR。
流程
运行
oc delete
命令删除产品
自定义资源。例如,如果您部署了myproduct.yaml
文件中定义的产品
,则可运行以下命令:oc delete -f myproduct.yaml
或者,您可以运行
oc delete
命令并指定其定义中指定的产品名称。例如:oc delete product.capabilities.3scale.net/myproduct