2.7. 使用操作器在 OpenShift 上 3scale 的部署配置选项

本节介绍了使用操作器在 OpenShift 上红帽 3scale API 管理的部署配置选项。

先决条件

2.7.1. 为嵌入式 APIcast 配置代理参数

作为 3scale 管理员,您可以为嵌入式 APIcast staging 和 production 配置代理参数。本节提供了在 APIManager 自定义资源中指定代理参数的参考信息。换句话说,您使用 3scale operator(一个 APIManager 自定义资源)在 OpenShift 上部署 3scale。

您可以在首次部署 APIManager CR 时指定这些参数,或者您可以更新部署的 APIManager CR,Operator 会协调更新。请参阅部署 APIManager 自定义资源

嵌入式 APIcast 有四个与代理相关的配置参数:

  • allProxy
  • httpProxy
  • httpsProxy
  • noProxy

allProxy

allProxy 参数指定在请求没有指定协议相关的代理时,用来连接到服务的 HTTP 或 HTTPS 代理。

设置代理后,通过将 allProxy 参数设置为代理的地址来配置 APIcast。代理不支持身份验证。换句话说,APIcast APIcast 不会将经过身份验证的用户发送到代理。

allProxy 参数的值是一个字符串,没有默认值,且不需要该参数。使用此格式设置 spec.apicast.productionSpec.allProxy 参数或 spec.apicast.stagingSpec.allProxy 参数:

<scheme>://<host>:<port>

例如:

apiVersion: apps.3scale.net/v1alpha1
kind: APIManager
metadata:
   name: example-apimanager
spec:
   apicast:
      productionSpec:
         allProxy: http://forward-proxy:80
      stagingSpec:
         allProxy: http://forward-proxy:81

httpProxy

httpProxy 参数指定用于连接 HTTP 服务的 HTTP 代理。

设置代理后,通过将 httpProxy 参数设置为代理的地址来配置 APIcast。代理不支持身份验证。换句话说,APIcast APIcast 不会将经过身份验证的用户发送到代理。

httpProxy 参数的值是一个字符串,没有默认值,且不需要该参数。使用此格式设置 spec.apicast.productionSpec.httpProxy 参数或 spec.apicast.stagingSpec.httpProxy 参数:

http://<host>:<port>

例如:

apiVersion: apps.3scale.net/v1alpha1
kind: APIManager
metadata:
   name: example-apimanager
spec:
   apicast:
      productionSpec:
         httpProxy: http://forward-proxy:80
      stagingSpec:
         httpProxy: http://forward-proxy:81

httpsProxy

httpsProxy 参数指定用于连接服务的 HTTPS 代理。

设置代理后,通过将 httpsProxy 参数设置为代理的地址来配置 APIcast。代理不支持身份验证。换句话说,APIcast APIcast 不会将经过身份验证的用户发送到代理。

httpsProxy 参数的值是一个字符串,没有默认值,且不需要该参数。使用此格式设置 spec.apicast.productionSpec.httpsProxy 参数或 spec.apicast.stagingSpec.httpsProxy 参数:

https://<host>:<port>

例如:

apiVersion: apps.3scale.net/v1alpha1
kind: APIManager
metadata:
   name: example-apimanager
spec:
   apicast:
      productionSpec:
         httpsProxy: https://forward-proxy:80
      stagingSpec:
         httpsProxy: https://forward-proxy:81

noProxy

noProxy 参数指定以逗号分隔的主机名和域名列表。当请求包含其中一个名称时,APIcast 不会代理请求。

如果您需要停止对代理的访问,例如在维护操作过程中,将 noProxy 参数设置为星号(*)。这与所有请求中指定的所有主机匹配,并有效地禁用任何代理。

noProxy 参数的值是一个字符串,没有默认值,且不需要该参数。指定以逗号分隔的字符串,以设置 spec.apicast.productionSpec.noProxy 参数或 spec.apicast.stagingSpec.noProxy 参数。例如:

apiVersion: apps.3scale.net/v1alpha1
kind: APIManager
metadata:
   name: example-apimanager
spec:
   apicast:
      productionSpec:
         noProxy: theStore,company.com,big.red.com
      stagingSpec:
         noProxy: foo,bar.com,.extra.dot.com

2.7.2. 使用 3scale Operator 注入自定义虚拟环境

在使用嵌入式 APIcast 的 3scale 安装中,您可以使用 3scale 操作器注入自定义环境。嵌入式 APIcast 也称为受管或托管 APIcast。自定义环境定义 APIcast 适用于网关服务的所有上游 API 的行为。要创建自定义环境,请在 Lua 代码中定义全局配置。

您可在 3scale 安装前或之后注入自定义环境。在注入自定义环境并在 3scale 安装后,您可以删除自定义环境。3scale 操作器协调更改。

先决条件

  • 已安装 3scale Operator。

流程

  1. 编写用于定义您要注入的自定义环境的 Lua 代码。例如,以下 env1.lua 文件显示了 3scale 操作器为所有服务加载的自定义日志策略。

    local cjson = require('cjson')
    local PolicyChain = require('apicast.policy_chain')
    local policy_chain = context.policy_chain
    
    local logging_policy_config = cjson.decode([[
    {
      "enable_access_logs": false,
      "custom_logging": "\"{{request}}\" to service {{service.id}} and {{service.name}}"
    }
    ]])
    
    policy_chain:insert( PolicyChain.load_policy('logging', 'builtin', logging_policy_config), 1)
    
    return {
      policy_chain = policy_chain,
      port = { metrics = 9421 },
    }
  2. 从定义自定义环境的 Lua 文件创建 secret。例如:

    oc create secret generic custom-env-1 --from-file=./env1.lua

    secret 可以包含多个自定义虚拟环境。为定义自定义环境的每个文件指定 '-from-file 选项。Operator 会加载每个自定义环境。

  3. 定义 APIManager 自定义资源来引用您刚才创建的 secret。以下示例显示了相对于引用定义自定义环境的 secret 的内容。

    apiVersion: apps.3scale.net/v1alpha1
    kind: APIManager
    metadata:
      name: apimanager-apicast-custom-environment
    spec:
      wildcardDomain: <desired-domain>
      apicast:
        productionSpec:
          customEnvironments:
            - secretRef:
                name: custom-env-1
        stagingSpec:
          customEnvironments:
            - secretRef:
                name: custom-env-1

    APIManager 自定义资源可以引用定义自定义虚拟环境的多个 secret。Operator 会加载每个自定义环境。

  4. 创建添加自定义虚拟环境的 APIManager 自定义资源。例如:

    oc apply -f apimanager.yaml

后续步骤

您无法更新定义自定义环境的 secret 的内容。如果需要更新自定义环境,您可以执行以下操作之一:

  • 推荐的选项是创建具有不同名称的 secret,并更新 APIManager 自定义资源字段 customEnvironments[].secretRef.name。Operator 会触发滚动更新并加载更新的自定义环境。
  • 另外,您可以通过将 spec.apicast.productionSpec.replicasspec.apicast.stagingSpec.replicas 设置为 0 来更新现有的 secret,然后通过将 spec.apicast.productionSpec.replicasspec.apicast.stagingSpec.replicas 设置为其先前的值来再次重新部署 APIcast。

2.7.3. 使用 3scale Operator 注入自定义策略

在使用嵌入式 APIcast 的 3scale 安装中,您可以使用 3scale 操作器来注入自定义策略。嵌入式 APIcast 也称为受管或托管 APIcast。注入自定义策略会将策略代码添加到 APIcast。然后,您可以使用以下任一策略将自定义策略添加到 API 产品策略链中:

  • 3scale API
  • 产品自定义资源

要使用 3scale 管理门户将自定义策略添加到产品策略链中,还必须使用 CustomPolicyDefinition 自定义资源注册自定义策略的 schema。自定义策略注册是只有在您要使用管理门户配置产品策略链时才需要。

您可以将自定义策略注入为 3scale 安装的一部分或之后。在注入自定义策略并在 3scale 安装后,您可以通过从 APIManager CR 中删除其规格来删除自定义策略。3scale 操作器协调更改。

先决条件

  • 您需要安装或您之前安装了 3scale Operator。
  • 您已定义一个自定义策略,如写您自己的策略中所述。即,已创建了定义自定义策略的 my-policy.luaapicast-policy.jsoninit.lua 文件,

流程

  1. 从定义一个自定义策略的文件创建 secret。例如:

    oc create secret generic my-first-custom-policy-secret \
     --from-file=./apicast-policy.json \
     --from-file=./init.lua \
     --from-file=./my-first-custom-policy.lua

    如果您有多个自定义策略,请为每个自定义策略创建一个 secret。secret 只能包含一个自定义策略。

  2. 定义一个 APIManager 自定义资源来引用包含自定义策略的每个 secret。您可以为 APIcast staging 和 APIcast production 指定相同的 secret。以下示例显示有关引用包含自定义策略的 secret 的内容。

    apiVersion: apps.3scale.net/v1alpha1
    kind: APIManager
    metadata:
      name: apimanager-apicast-custom-policy
    spec:
      apicast:
        stagingSpec:
          customPolicies:
            - name: my-first-custom-policy
              version: "0.1"
              secretRef:
                name: my-first-custom-policy-secret
            - name: my-second-custom-policy
              version: "0.1"
              secretRef:
                name: my-second-custom-policy-secret
        productionSpec:
          customPolicies:
            - name: my-first-custom-policy
              version: "0.1"
              secretRef:
                name: my-first-custom-policy-secret
            - name: my-second-custom-policy
              version: "0.1"
              secretRef:
                name: my-second-custom-policy-secret

    APIManager 自定义资源可以引用定义不同自定义策略的多个 secret。Operator 加载每个自定义策略。

  3. 创建 APIManager 自定义资源来引用包含自定义策略的 secret。例如:

    oc apply -f apimanager.yaml

后续步骤

您无法更新定义自定义策略的 secret 的内容。如果您需要更新自定义策略,您可以执行以下操作之一:

  • 推荐的选项是使用不同的名称创建 secret,并更新 APIManager 自定义资源 customPolicies 部分以引用新 secret。Operator 会触发滚动更新并加载更新的自定义策略。
  • 另外,您可以通过将 spec.apicast.productionSpec.replicasspec.apicast.stagingSpec.replicas 设置为 0 来更新现有的 secret,然后通过将 spec.apicast.productionSpec.replicasspec.apicast.stagingSpec.replicas 设置为其先前的值来再次重新部署 APIcast。

2.7.4. 使用 3scale 操作器配置 OpenTracing

在使用嵌入式 APIcast 的 3scale 安装中,您可以使用 3scale 操作器来配置 OpenTracing。您可以在暂存或生产环境中配置 OpenTracing。通过启用 OpenTracing,您可以在 APIcast 实例上获得更深入的观察功能。

先决条件

流程

  1. 定义在 stringData.config 中包含您的 OpenTracing 配置详情的机密。这是包含 OpenTracing 配置详细信息的 属性的唯一有效值。任何其他规格都可防止 APIcast 接收您的 OpenTracing 配置详细信息。folowing 示例显示了一个有效的 secret 定义:

    apiVersion: v1
    kind: Secret
    metadata:
      name: myjaeger
    stringData:
      config: |-
          {
          "service_name": "apicast",
          "disabled": false,
          "sampler": {
            "type": "const",
            "param": 1
          },
          "reporter": {
            "queueSize": 100,
            "bufferFlushInterval": 10,
            "logSpans": false,
            "localAgentHostPort": "jaeger-all-in-one-inmemory-agent:6831"
          },
          "headers": {
            "jaegerDebugHeader": "debug-id",
            "jaegerBaggageHeader": "baggage",
            "TraceContextHeaderName": "uber-trace-id",
            "traceBaggageHeaderPrefix": "testctx-"
          },
          "baggage_restrictions": {
              "denyBaggageOnInitializationFailure": false,
              "hostPort": "127.0.0.1:5778",
              "refreshInterval": 60
          }
          }
    type: Opaque
  2. 创建 secret.例如,如果您在 myjaeger.yaml 文件中保存了之前的 secret 定义,您应该运行以下命令:

    oc create secret generic myjaeger --from-file myjaeger.yaml
  3. 定义指定 OpenTracing 属性的 APIManager 自定义资源。在 CR 定义中,将 openTracing.tracingConfigSecretRef.name 属性设置为包含 OpenTracing 配置详情的 secret 的名称。下例仅显示与配置 OpenTracing 相关的内容。

    apiVersion: apps.3scale.net/v1alpha1
    kind: APIManager
    metadata:
      name: apimanager1
    spec:
      apicast:
        stagingSpec:
          ...
          openTracing:
            enabled: true
            tracingLibrary: jaeger
            tracingConfigSecretRef:
              name: myjaeger
        productionSpec:
          ...
            openTracing:
              enabled: true
              tracingLibrary: jaeger
              tracingConfigSecretRef:
                name: myjaeger
  4. 创建用于配置 OpenTracing 的 APIManager 自定义资源。例如,如果您在 apimanager1.yaml 文件中保存了 APIManager 自定义资源,您将运行以下命令:

    oc apply -f apimanager1.yaml

后续步骤

根据 OpenTracing 的安装方式,您应该在 Jaeger 服务用户界面中看到 trace。

2.7.5. 使用 3scale operator 在 pod 级别启用 TLS

3scale 部署两个 APIcast 实例,一个用于 production,另一个用于 staging。只能为生产环境或只有 staging,或为两个实例启用 TLS。

先决条件

  • 启用 TLS 的有效证书。

流程

  1. 从有效的证书创建 secret,例如:

    oc create secret tls mycertsecret --cert=server.crt --key=server.key

    配置在 APIManager CRD 中公开 secret 引用。您可以创建 secret,然后按如下所示引用 APIManager 自定义资源中的 secret 名称:

    • 生产环境:APIManager CR 在 .spec.apicast.productionSpec.httpsCertificateSecretRef 字段中公开证书。
    • staging:APIManager CR 在 .spec.apicast.stagingSpec.httpsCertificateSecretRef 字段中公开证书。

      另外,您还可以配置以下内容:

    • httpsPort 表示哪个端口 APIcast 应开始侦听 HTTPS 连接。如果与 HTTP 端口 APIcast 造成这种冲突,则仅将此端口用于 HTTPS。
    • httpsVerifyDepth 定义客户端证书链的最大长度。

      注意

      提供有效的证书和 APImanager CR 的引用。如果配置可以访问 httpsPort,但不能 httpsCertificateSecretRef,APIAPI 使用嵌入的自签名证书。不建议这样做。

  2. Operators > Installed Operators
  3. Installed Operators 列表中,点 3scale Operator
  4. API Manager 选项卡。
  5. Create APIManager
  6. 在编辑器中添加以下 YAML 定义。

    1. 如果 为生产环境 启用,请配置以下 YAML 冲突:

      spec:
        apicast:
          productionSpec:
            httpsPort: 8443
            httpsVerifyDepth: 1
            httpsCertificateSecretRef:
              name: mycertsecret
    2. 如果为 staging 启用,请配置以下 YAML 冲突:

      spec:
        apicast:
          stagingSpec:
            httpsPort: 8443
            httpsVerifyDepth: 1
            httpsCertificateSecretRef:
              name: mycertsecret
  7. 点击 Create

2.7.6. 评估部署的概念验证

以下小节描述了适用于 3scale 评估部署的概念验证的配置选项。此部署默认使用内部数据库。

重要

外部数据库的配置是生产环境的标准部署选项。

2.7.6.1. 默认部署配置

  • 容器将具有 Kubernetes 资源限值和请求

    • 这样可确保最低性能水平。
    • 它限制资源以允许外部服务和解决方案分配。
  • 部署内部数据库.
  • 文件存储将基于 Persistence 卷(PV)。

    • 一个系统将需要读取、写入、执行(RWX)访问模式。
    • OpenShift 配置为在请求时提供它们。
  • 将 MySQL 部署为内部关系数据库。

默认配置选项适合客户的概念验证(PoC)或评估。

可以使用 APIManager 自定义资源中的特定字段值覆盖一个或多个默认配置选项。3scale 操作器允许所有可用组合,而模板则允许固定的部署配置集。例如,3scale 操作器允许在评估模式和外部数据库模式中部署 3scale。模板不允许这一具体的部署配置。模板仅适用于最常用的配置选项。

2.7.6.2. 评估安装

对于和评估安装,容器将不会指定 kubernetes 资源限值和请求。例如:

  • 内存占用较小
  • 快速启动
  • 可以在笔记本电脑上运行
  • 适用于售前/销售演示
apiVersion: apps.3scale.net/v1alpha1
kind: APIManager
metadata:
  name: example-apimanager
spec:
  wildcardDomain: lvh.me
  resourceRequirementsEnabled: false

其它资源

  • 如需更多信息,请参阅 APIManager 自定义资源。

2.7.7. 安装外部数据库

外部数据库安装适合需要高可用性(HA)或计划重复使用的数据库。

重要

在启用 3scale 外部数据库安装模式时,以下所有数据库都是外部化的:

  • backend-redis
  • system-redis
  • system-database (mysql, postgresql, 或 oracle)

以下数据库版本支持 3scale 2.8 及以上版本:

数据库版本

redis

5.0

MySQL

5.7

PostgreSQL

10.6

在创建 APIManager 自定义资源 以部署 3scale 之前,您必须使用 OpenShift 机密为外部数据库提供以下连接设置:

2.7.7.1. 后端 Redis secret

部署两个外部 Redis 实例并填写连接设置,如下例所示:

apiVersion: v1
kind: Secret
metadata:
  name: backend-redis
stringData:
  REDIS_STORAGE_URL: "redis://backend-redis-storage"
  REDIS_STORAGE_SENTINEL_HOSTS: "redis://sentinel-0.example.com:26379,redis://sentinel-1.example.com:26379, redis://sentinel-2.example.com:26379"
  REDIS_STORAGE_SENTINEL_ROLE: "master"
  REDIS_QUEUES_URL: "redis://backend-redis-queues"
  REDIS_QUEUES_SENTINEL_HOSTS: "redis://sentinel-0.example.com:26379,redis://sentinel-1.example.com:26379, redis://sentinel-2.example.com:26379"
  REDIS_QUEUES_SENTINEL_ROLE: "master"
type: Opaque

Secret 名称必须是 backend-redis

2.7.7.2. 系统 Redis secret

部署两个外部 Redis 实例并填写连接设置,如下例所示:

apiVersion: v1
kind: Secret
metadata:
  name: system-redis
stringData:
  URL: "redis://system-redis"
  SENTINEL_HOSTS: "redis://sentinel-0.example.com:26379,redis://sentinel-1.example.com:26379, redis://sentinel-2.example.com:26379"
  SENTINEL_ROLE: "master"
  NAMESPACE: ""
  MESSAGE_BUS_URL: "redis://system-redis-messagebus"
  MESSAGE_BUS_SENTINEL_HOSTS: "redis://sentinel-0.example.com:26379,redis://sentinel-1.example.com:26379, redis://sentinel-2.example.com:26379"
  MESSAGE_BUS_SENTINEL_ROLE: "master"
  MESSAGE_BUS_NAMESPACE: ""
type: Opaque

Secret 名称必须是 system-redis

2.7.7.3. 系统数据库 secret

注意

Secret 名称必须是 system-database

当您部署 3scale 时,系统数据库有三个替代方案。为每个替代的相关 secret 配置不同的属性和值。

  • MySQL
  • PostgreSQL
  • Oracle 数据库

要部署 MySQL、PostgreSQL 或 Oracle Database 系统数据库 secret,请填写连接设置,如下例所示:

MySQL 系统数据库 secret

apiVersion: v1
kind: Secret
metadata:
  name: system-database
stringData:
  URL: "mysql2://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}"
type: Opaque

PostgreSQL 系统数据库 secret

apiVersion: v1
kind: Secret
metadata:
  name: system-database
stringData:
  URL: "postgresql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}"
type: Opaque

Oracle 系统数据库 secret

apiVersion: v1
kind: Secret
metadata:
  name: system-database
stringData:
  URL: "oracle-enhanced://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}"
  ORACLE_SYSTEM_PASSWORD: "{SYSTEM_PASSWORD}"
type: Opaque

注意
  • Oracle 系统用户 以系统权限执行命令。此 GitHub 存储库 中已详细一些。在数据库中初始化表时,可以在 Oracle Database initializer 中执行最新的操作。其他命令可能未列在这些链接中。
  • 当有要运行的模式迁移时,也需要升级系统 用户,因此可能会执行前面链接中包括的其他命令。
  • 免责声明:本备注中包含的链接仅用于方便使用外部网站。红帽没有查看链接,且对内容或其可用性不承担责任。包含任何指向外部网站的链接并不表示红帽认可该网站或其实体、产品或服务。您同意,红帽对因您使用(或依赖)外部网站或内容而导致的任何损失或费用不承担任何责任。

2.7.7.4. Zync 数据库 secret

在 zync 数据库设置中,当启用 High Availability 时,如果也启用了 externalZyncDatabaseEnabled 字段,用户必须预先创建名为 zync 的 secret。然后,使用 DATABASE_URLDATABASE_PASSWORD 字段设置 zync,其值指向外部数据库。外部数据库必须处于高可用性模式。请参见以下示例:

apiVersion: v1
kind: Secret
metadata:
  name: zync
stringData:
  DATABASE_URL: postgresql://<zync-db-user>:<zync-db-password>@<zync-db-host>:<zync-db-port>/zync_production
  ZYNC_DATABASE_PASSWORD: <zync-db-password>
type: Opaque

2.7.7.5. 用于部署 3scale 的 APIManager 自定义资源

注意
  • 当启用 highAvailability 时,您必须预先创建 backend-redissystem-redissystem-database secret。
  • 当您启用 highAvailabilityexternalZyncDatabaseEnabled 字段时,您必须预先创建 zync 数据库 secret。

    • 对于 system-database,仅选择要外部化的数据库。

APIManager 自定义资源的配置将取决于您的 3scale 部署外部您选择的数据库。

如果您的后端 Redis、系统 Redis 和系统数据库将在 3scale 外部,APIManager 自定义资源必须将 highAvailability 设置为 true。请参见以下示例:

apiVersion: apps.3scale.net/v1alpha1
kind: APIManager
metadata:
  name: example-apimanager
spec:
  wildcardDomain: lvh.me
  highAvailability:
    enabled: true

如果您的 zync 数据库将是外部,APIManager 自定义资源必须将 highAvailability 设置为 true,并且 externalZyncDatabaseEnabled 还必须设置为 true。请参见以下示例:

apiVersion: apps.3scale.net/v1alpha1
kind: APIManager
metadata:
  name: example-apimanager
spec:
  wildcardDomain: lvh.me
  highAvailability:
    enabled: true
    externalZyncDatabaseEnabled: true

2.7.8. Amazon Simple Storage Service 3scale Filestorage 安装

以下示例演示了使用 Amazon Simple Storage Service(Amazon S3)而不是持久性卷声明(PVC)的 3scale FileStorage

在创建 APIManager 自定义资源以部署 3scale 之前,需要使用 openshift secret 提供 S3 服务的连接设置。

2.7.8.1. Amazon S3 secret

注意

AN AWS S3 兼容提供程序可以在带有 AWS_HOSTNAMEAWS_PATH_STYLEAWS_PROTOCOL 可选密钥的 S3 机密中配置。如需了解更多详细信息,请参阅 S3 secret 引用

在以下示例中,Secret 名称可以是任意的,因为它将在 APIManager 自定义资源中引用。

kind: Secret
metadata:
  creationTimestamp: null
  name: aws-auth
stringData:
  AWS_ACCESS_KEY_ID: 123456
  AWS_SECRET_ACCESS_KEY: 98765544
  AWS_BUCKET: mybucket.example.com
  AWS_REGION: eu-west-1
type: Opaque
注意

Amazon S3 区域和 Amazon S3 存储桶设置直接在 APIManager 自定义资源中提供。Amazon S3 secret 名称直接在 APIManager 自定义资源中提供。

最后,创建 APIManager 自定义资源来部署 3scale。

apiVersion: apps.3scale.net/v1alpha1
kind: APIManager
metadata:
  name: example-apimanager
spec:
  wildcardDomain: lvh.me
  system:
    fileStorage:
      simpleStorageService:
        configurationSecretRef:
          name: aws-auth

检查 APIManager SystemS3Spec 供参考。

2.7.9. PostgreSQL 安装

MySQL 内部关系数据库是默认的部署。此部署配置可以被覆盖来改用 PostgreSQL。

apiVersion: apps.3scale.net/v1alpha1
kind: APIManager
metadata:
  name: example-apimanager
spec:
  wildcardDomain: lvh.me
  system:
    database:
      postgresql: {}

其它资源

2.7.10. 在组件级别自定义计算资源要求

通过 APIManager 自定义资源属性自定义 3scale 解决方案中的 Kubernetes 计算资源要求。这样做可自定义分配给特定 APIManager 组件的计算资源要求,即 CPU 和内存。

以下示例概述了如何自定义 system-master 的 system-provider 容器、backend-listenerzync-database 的计算资源要求:

apiVersion: apps.3scale.net/v1alpha1
kind: APIManager
metadata:
  name: example-apimanager
spec:
  backend:
    listenerSpec:
      resources:
        requests:
          memory: "150Mi"
          cpu: "300m"
        limits:
          memory: "500Mi"
          cpu: "1000m"
  system:
    appSpec:
      providerContainerResources:
        requests:
          memory: "111Mi"
          cpu: "222m"
        limits:
          memory: "333Mi"
          cpu: "444m"
  zync:
    databaseResources:
      requests:
        memory: "111Mi"
        cpu: "222m"
      limits:
        memory: "333Mi"
        cpu: "444m"

其它资源

如需有关如何指定组件级别自定义资源要求的更多信息,请参阅 APIManager CRD 引用

2.7.10.1. 默认 APIManager 组件计算资源

当您将 APIManager spec.resourceRequirementsEnabled 属性配置为 true 时,会为 APIManager 组件设置默认计算资源。

下表中显示了为 APIManager 组件设置的特定计算资源默认值。

2.7.10.1.1. CPU 和内存单元

下表说明了您将在计算资源默认值表中找到的单元:如需有关 CPU 和内存单元的更多信息,请参阅管理容器的资源

资源单元解释

  • m - milliCPU 或 millicore
  • Mi - mebibytes
  • Gi - gibibyte
  • G - gigabyte

表 2.2. 计算资源默认值

组件CPU 请求CPU 限值内存请求内存限值

system-app 的 system-master

50m

1000m

600Mi

800Mi

system-app 的 system-provider

50m

1000m

600Mi

800Mi

system-app 的 system-developer

50m

1000m

600Mi

800Mi

system-sidekiq

100m

1000m

500Mi

2Gi

system-sphinx

80m

1000m

250Mi

512Mi

system-redis

150m

500m

256Mi

32Gi

system-mysql

250m

无限制

512Mi

2Gi

system-postgresql

250m

无限制

512Mi

2Gi

backend-listener

500m

1000m

550Mi

700Mi

backend-worker

150m

1000m

50Mi

300Mi

backend-cron

50m

150m

40Mi

80Mi

backend-redis

1000m

2000m

1024Mi

32Gi

apicast-production

500m

1000m

64Mi

128Mi

apicast-staging

50m

100m

64Mi

128Mi

zync

150m

1

250M

512Mi

zync-que

250m

1

250M

512Mi

zync-database

50m

250m

250M

2G

2.7.11. 在组件级别自定义节点关联性和容限

通过 APIManager 自定义资源属性自定义 Red Hat 3scale API 管理解决方案中的 Kubernetes 关联性和 Tolerations,以自定义安装的不同 3scale 组件调度到 Kubernetes 节点上。https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity

以下示例为后端设置自定义节点关联性。它还为 system-memcached 设置监听程序和自定义容限:

apiVersion: apps.3scale.net/v1alpha1
kind: APIManager
metadata:
  name: example-apimanager
spec:
  backend:
    listenerSpec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: "kubernetes.io/hostname"
                operator: In
                values:
                - ip-10-96-1-105
              - key: "beta.kubernetes.io/arch"
                operator: In
                values:
                - amd64
  system:
    memcachedTolerations:
    - key: key1
      value: value1
      operator: Equal
      effect: NoSchedule
    - key: key2
      value: value2
      operator: Equal
      effect: NoSchedule

其它资源

如需与关联性和容限相关的完整属性列表,请参阅 APIManager CDR 参考

2.7.12. 协调

安装 3scale 后,3scale 操作器将启用更新自定义资源中的一组给定参数,以修改系统配置选项。可以通过 热交换 (即,不停止或关闭系统)进行修改。

并非所有 APIManager 自定义资源定义(CRD)的参数都是可协调的。

以下是可协调参数列表:

2.7.12.1. 资源

所有 3scale 组件的资源限制和请求.

apiVersion: apps.3scale.net/v1alpha1
kind: APIManager
metadata:
  name: example-apimanager
spec:
  ResourceRequirementsEnabled: true/false

2.7.12.2. 后端副本

后端 组件 pod 数量。

apiVersion: apps.3scale.net/v1alpha1
kind: APIManager
metadata:
  name: example-apimanager
spec:
  backend:
    listenerSpec:
      replicas: X
    workerSpec:
      replicas: Y
    cronSpec:
      replicas: Z

2.7.12.3. APIcast 副本

APIcast staging 和生产组件 pod 数量。

apiVersion: apps.3scale.net/v1alpha1
kind: APIManager
metadata:
  name: example-apimanager
spec:
  apicast:
    productionSpec:
      replicas: X
    stagingSpec:
      replicas: Z

2.7.12.4. 系统副本

系统 应用程序和系统 sidekiq 组件 pod 数量

apiVersion: apps.3scale.net/v1alpha1
kind: APIManager
metadata:
  name: example-apimanager
spec:
  system:
    appSpec:
      replicas: X
    sidekiqSpec:
      replicas: Z

2.7.12.5. Zync 副本

Zync app 和 que 组件 pod 数量

apiVersion: apps.3scale.net/v1alpha1
kind: APIManager
metadata:
  name: example-apimanager
spec:
  zync:
    appSpec:
      replicas: X
    queSpec:
      replicas: Z