Menu Close

3.16. 导出产品

您可以使用 .yaml 格式导出 3scale 产品定义,以便您可以将该产品导入到与源 3scale 实例没有连接的 3scale 实例中。您必须先设置 3scale 产品,然后才能导出该产品。请参阅 创建新产品来测试 API 调用

当两个 3scale 实例具有网络连接时,当您想要在 3scale 实例中使用相同的 3scale 产品时,请使用 toolbox 3scale copy 命令

描述

当您导出 3scale 产品时,toolbox 会以 .yaml 格式对产品定义序列化,其遵循 产品和后端 自定义资源定义(CRD)。除了产品的基本信息外,output .yaml 还包括:

  • 链接到产品的后端。
  • 链接后端的指标、方法和映射规则.
  • 应用计划中定义的限值和定价规则.
  • 限值和定价规则引用的指标和方法。

导出产品是一种只读操作。换句话说,重复导出产品是安全的。toolbox 不会更改要导出的产品。如果需要,您可以在将 .yaml 输出导入到另一个 3scale 实例前修改它。

导出 3scale 产品适用于以下情况:

  • 源和目标 3scale 实例之间没有连接。例如,当您想要在多个 3scale 实例中使用同一产品时,可能会存在严重网络限制阻止运行 toolbox 3scale copy 命令。
  • 您需要使用 Git 或其它源控制系统来维护 3scale 产品定义(采用 .yaml 格式)。

3scale toolbox 导出导入 命令也可能有助于备份和恢复产品定义。

格式

使用此格式运行 导出 命令:

3scale product export [-f output-file] <remote> <product>

export 命令可以将输出发送到 stdout 或文件。默认值为 stdout。要将输出发送到文件,请使用 a .yaml 文件的名称指定 -f--file 选项。

<remote> 替换为与您要从中导出产品的 3scale 实例关联的 3scale 供应商帐户别名或 URL。有关指定此功能的更多信息,请参阅管理远程访问凭证

<product> 替换为您要导出的产品的系统 名称或 3scale ID。此产品必须与您指定的 3scale 供应商帐户关联。您可以在产品 概述 页面的 3scale GUI 中找到产品的系统名称。要获得产品的 3scale ID,请运行 toolbox 3scale services show 命令

示例

以下命令从与 my-3scale-1 供应商帐户关联的 3scale 实例导出 petstore 产品,并将其输出到 petstore-product.yaml 文件:

3scale product export -f petstore-product.yaml my-3scale-1 petstore

以下是 Default API 产品的序列化示例:

apiVersion: v1
kind: List
items:
- apiVersion: capabilities.3scale.net/v1beta1
  kind: Product
  metadata:
    annotations:
      3scale_toolbox_created_at: '2021-02-17T10:59:23Z'
      3scale_toolbox_version: 0.17.1
    name: api.xysnalcj
  spec:
    name: Default API
    systemName: api
    description: ''
    mappingRules:
    - httpMethod: GET
      pattern: "/v2"
      metricMethodRef: hits
      increment: 1
      last: false
    metrics:
      hits:
        friendlyName: Hits
        unit: hit
        description: Number of API hits
    methods:
      servicemethod01:
        friendlyName: servicemethod01
        description: ''
    policies:
    - name: apicast
      version: builtin
      configuration: {}
      enabled: true
    applicationPlans:
      basic:
        name: Basic
        appsRequireApproval: false
        trialPeriod: 0
        setupFee: 0.0
        custom: false
        state: published
        costMonth: 0.0
        pricingRules:
        - from: 1
          to: 1000
          pricePerUnit: 1.0
          metricMethodRef:
            systemName: hits
        limits:
        - period: hour
          value: 1222222
          metricMethodRef:
            systemName: hits
            backend: backend_01
    backendUsages:
      backend_01:
        path: "/v1/pets"
      backend_02:
        path: "/v1/cats"
    deployment:
      apicastSelfManaged:
        authentication:
          oidc:
            issuerType: rest
            issuerEndpoint: https://hello:test@example.com/auth/realms/3scale-api-consumers
            jwtClaimWithClientID: azp
            jwtClaimWithClientIDType: plain
            authenticationFlow:
              standardFlowEnabled: false
              implicitFlowEnabled: true
              serviceAccountsEnabled: false
              directAccessGrantsEnabled: true
            credentials: query
            security:
              hostHeader: ''
              secretToken: some_secret
            gatewayResponse:
              errorStatusAuthFailed: 403
              errorHeadersAuthFailed: text/plain; charset=us-ascii
              errorAuthFailed: Authentication failed
              errorStatusAuthMissing: 403
              errorHeadersAuthMissing: text/plain; charset=us-ascii
              errorAuthMissing: Authentication parameters missing
              errorStatusNoMatch: 404
              errorHeadersNoMatch: text/plain; charset=us-ascii
              errorNoMatch: No Mapping Rule matched
              errorStatusLimitsExceeded: 429
              errorHeadersLimitsExceeded: text/plain; charset=us-ascii
              errorLimitsExceeded: Usage limit exceeded
        stagingPublicBaseURL: http://staging.example.com:80
        productionPublicBaseURL: http://example.com:80
- apiVersion: capabilities.3scale.net/v1beta1
  kind: Backend
  metadata:
    annotations:
      3scale_toolbox_created_at: '2021-02-17T10:59:34Z'
      3scale_toolbox_version: 0.17.1
    name: backend.01.pcjwxbdu
  spec:
    name: Backend 01
    systemName: backend_01
    privateBaseURL: https://b1.example.com:443
    description: new desc
    mappingRules:
    - httpMethod: GET
      pattern: "/v1/pets"
      metricMethodRef: hits
      increment: 1
      last: false
    metrics:
      hits:
        friendlyName: Hits
        unit: hit
        description: Number of API hits
    methods:
      mybackendmethod01:
        friendlyName: mybackendmethod01
        description: ''
- apiVersion: capabilities.3scale.net/v1beta1
  kind: Backend
  metadata:
    annotations:
      3scale_toolbox_created_at: '2021-02-17T10:59:34Z'
      3scale_toolbox_version: 0.17.1
    name: backend.02.tiedgjsk
  spec:
    name: Backend 02
    systemName: backend_02
    privateBaseURL: https://b2.example.com:443
    description: ''
    mappingRules:
    - httpMethod: GET
      pattern: "/v1/cats"
      metricMethodRef: hits
      increment: 1
      last: false
    metrics:
      hits:
        friendlyName: Hits
        unit: hit
        description: Number of API hits
    methods:
      backend02_method01:
        friendlyName: backend02_method01
        description: ''

导出和传送到 产品 CR

运行 export 命令时,您可以管道输出来创建 产品自定义资源(CR )。哪个 3scale 实例包含这个 CR 取决于以下条件:

  • 如果定义了 threescale-provider-account secret,3scale operator 会在由该 secret 标识的 3scale 实例中创建 product CR。
  • 如果没有定义 threescale-provider-account secret,那么如果命名空间中安装了 3scale 实例,则新产品 CR 将位于该命名空间中,3scale 操作器会在该命名空间中创建产品 CR。
  • 如果没有定义 threescale-provider-account secret,如果新产品 CR 所在的命名空间不包含 3scale 实例,则 3scale 操作器会将产品 CR 标记为失败状态。

假设您在包含 3scale-provider-account 机密的命名空间中运行以下命令:toolbox 将 petstore CR 传送到 3scale 实例,该实例在 3scale-provider-account secret 中标识:

3scale product export my-3scale-1 petstore | oc apply -f -

详情请参阅 3scale 操作器如何标识自定义资源链接的租户。