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


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

先决条件

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

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

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

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

  • allProxy
  • httpProxy
  • httpsProxy
  • noProxy

allProxy

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

设置代理后,通过将 allProxy 参数设置为代理的地址来配置 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 不会将经过身份验证的用户发送到代理。

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 不会将经过身份验证的用户发送到代理。

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.5.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 自定义资源 (CR) 来引用您刚才创建的 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 CR 可以引用定义自定义虚拟环境的多个 secret。Operator 会加载每个自定义环境。

  4. 创建添加自定义环境的 APIManager CR。例如:

    $ oc apply -f apimanager.yaml

后续步骤

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

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

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

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

  • 3scale API
  • Product 自定义资源 (CR)

要使用 3scale 管理门户将自定义策略添加到产品策略链中,还必须使用 CustomPolicyDefinition CR 注册自定义策略的 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 CR,以引用包含自定义策略的每个 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 CR 可以引用定义不同自定义策略的多个 secret。Operator 加载每个自定义策略。

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

    $ oc apply -f apimanager.yaml

后续步骤

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

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

2.5.4. 使用 3scale operator 配置 OpenTracing

在使用嵌入式 APIcast 的 3scale 安装中,您可以使用 3scale operato 来配置 OpenTracing。您可以在 stage 或生产环境或这两种环境中配置 OpenTracing。通过启用 OpenTracing,您可以在 APIcast 实例上获取更多见解和更好的可观察性。

先决条件

流程

  1. stringData.config 中包含您的 OpenTracing 配置详情的 secret。这是包含您的 OpenTracing 配置详细信息的属性的唯一有效值。任何其他规格都阻止 APIcast 收到您的 OpenTracing 配置详细信息。以下示例显示了一个有效的 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.例如,如果您将以前的 secret 定义保存到 myjaeger.yaml 文件中,您将运行以下命令:

    $ oc create -f myjaeger.yaml
  3. 定义一个指定 OpenTracing 属性的 APIManager 自定义资源(CR)。在 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 CR。例如,如果您在 apimanager1.yaml 文件中保存 APIManager CR,您将运行以下命令:

    $ oc apply -f apimanager1.yaml

后续步骤

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

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

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

先决条件

  • 启用 TLS 的有效证书。

流程

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

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

    配置在 APIManager 自定义资源(CR)中公开 secret 引用。您可以创建 secret,然后在 APIManager CR 中引用 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,APIcast 使用嵌入的自签名证书。不建议这样做。

  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.5.6. 评估部署的概念验证

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

重要

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

2.5.6.1. 默认部署配置

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

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

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

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

可以使用 APIManager CR 中的特定字段值覆盖一个或多个默认配置选项。3scale 操作器允许所有可用组合。

2.5.6.2. 评估安装

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

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

其他资源

2.5.7. 安装外部数据库

重要

从 Red Hat 3scale API 管理部署外部化数据库时,这意味着与应用程序分离,并对在数据库一级的服务中断有一定的弹性。服务中断的恢复取决于您托管数据库的基础架构或平台供应商提供的服务级别协议 (SLA)。3scale 不提供此功能。有关您选择的部署提供的数据库外部化的详情,请查看相关的文档。

外部数据库安装适合您要提供不间断的运行时间或计划重复使用自己的数据库的生产环境。

重要

启用 3scale 外部数据库安装模式时,您可以将以下一个或多个数据库配置为 3scale 的外部:

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

在创建 APIManager CR 以部署 3scale 之前,您必须使用 OpenShift secret 为外部数据库提供以下连接设置。

2.5.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.5.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: ""
type: Opaque

Secret 名称必须是 system-redis

2.5.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

重要

要将 MySQL 8.0 与 3scale 2.12 搭配使用,您必须将身份验证插件设置为 mysql_native_password。在 MySQL 配置文件中添加以下内容:

[mysqld]
default_authentication_plugin=mysql_native_password

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

注意
  • {DB_USER}{DB_PASSWORD} 是常规的非系统用户的用户名和密码。
  • {DB_NAME} 是 Oracle 数据库服务名称
  • ORACLE_SYSTEM_PASSWORD 是可选的,请参阅 配置数据库用户

2.5.7.4. Zync 数据库 secret

在 zync 数据库设置中,当 spec.externalComponents.zync.database 字段被设置为 true 时,您必须在部署 3scale 前创建一个名为 zync 的 secret。在这个 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

zync 数据库必须使用高可用性模式。

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

注意
  • 当启用外部组件时,必须在部署 3scale 前为每个外部组件(backend-redissystem-redissystem-databasezync)创建一个 secret。
  • 对于外部 system-database,仅选择一种数据库来外部化。

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

如果 backend-redissystem-redissystem-database 是 3scale 的外部,请填充 APIManager CR externalComponents 对象,如下例所示:

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

2.5.8. 在 3scale Operator 中禁用 pod 关联性

您可以为每个组件在 3scale operator 中启用 pod 不受影响。这样可确保从集群的不同 deploymentConfig 中的 pod 副本分布,以便在不同的可用区 (AZ) 之间均匀平衡。

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

通过 APIManager CR 属性自定义 3scale 解决方案中的 kubernetes 关联性容限。然后,您可以自定义,将不同的 3scale 组件调度到 kubernetes 节点上。

例如,为 backend-listener 设置自定义节点关联性,为 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

将以下关联性块添加到 apicastProductionSpec 或任何非数据库 deploymentConfig 中。这会使用 preferredDuringSchedulingIgnoredDuringExecution 添加一个软 podAntiAffinity 配置。调度程序将尝试在不同 AZ 的不同主机上运行此一组 apicast-production pod。如果无法实现,则允许它们在其它地方运行:

Soft podAntiAffinity

affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                labelSelector:
                  matchLabels:
                    deploymentConfig: apicast-production
                topologyKey: kubernetes.io/hostname
            - weight: 99
              podAffinityTerm:
                labelSelector:
                  matchLabels:
                    deploymentConfig: apicast-production
                topologyKey: topology.kubernetes.io/zone

在以下示例中,使用 requiredDuringSchedulingIgnoredDuringExecution 设置硬 podAntiAffinity 配置。必须满足以下条件才能将 pod 调度到节点上。存在风险,例如,您将无法在具有低可用资源的集群中调度新 pod:

Hard podAntiAffinity

affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                labelSelector:
                  matchLabels:
                    deploymentConfig: apicast-production
                topologyKey: kubernetes.io/hostname
            - weight: 99
              podAffinityTerm:
                labelSelector:
                  matchLabels:
                    deploymentConfig: apicast-production
                topologyKey: topology.kubernetes.io/zone

其他资源

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

2.5.9. 多个可用区中的多个集群

注意

如果失败,在将一个被动集群会变为主动模式期间会破坏服务的置备,直到过程完成为止。因为这个过程需要涉及到系统中断,请确保计划有一个维护窗口进行。

本文档重点介绍使用 Amazon Web Services (AWS) 的部署。相同的配置选项也适用于提供商管理的数据库服务提供的其他公有云供应商,例如支持多个可用性区域和多个区域。

如果要在多个 OpenShift 集群和高可用性 (HA) 区域上安装 3scale 时,您可以参考这里提供的选项。

在多个集群安装选项中,集群在主动/被动配置中工作,带有涉及几个手动步骤的故障转移过程。

2.5.9.1. 多集群安装的先决条件

在涉及使用多 OpenShift 集群的 3scale 安装中使用以下内容:

  • 使用带有 APIManager 自定义资源(CR) 中的 kubernetes.io/hostnametopology.kubernetes.io/zone 规则的 pod 实体。
  • APIManager CR 中使用 pod 中断预算。
  • 在多个集群中的 3scale 安装必须使用 APIManager CR 中的相同共享 wildcardDomain 属性规格。在这个安装模式中不允许每个集群使用不同的域,因为存储在数据库中的信息会冲突。
  • 您必须在具有相同值的所有集群中手动部署包含凭证(如令牌和密码)的 secret。3scale 操作器在每个集群中使用安全随机值创建它们。在这种情况下,两个集群中都需要相同的凭证。您将在 3scale 操作器文档中找到 secret 列表以及如何配置它们。以下是您必须在两个集群中镜像的 secret 列表:

    • backend-internal-api
    • system-app
    • system-events-hook
    • system-master-apicast
    • system-seed

      您必须使用 backend-redissystem-redissystem-databasezync 的数据库连接字符串手动部署 secret。请参阅外部数据库安装

    • 在集群间共享的数据库都必须在所有集群中使用相同的值。
    • 如果每个集群都有自己的数据库,则必须在每个集群中使用不同的值。

2.5.9.2. 使用共享数据库在同一区域上的主动 - 被动集群

此设置包括在同一区域中有两个或更多集群,并以主动-被动模式部署 3scale。一个集群处于活动状态,接收流量,其他集群处于待机模式,而不接收流量,因此准备假定活跃角色在活跃集群中存在故障。

在这个安装选项中,只有一个区域正在使用,数据库将在所有集群之间共享。

使用共享数据库在同一区域上的 3scale 高可用性主动 - 被动

2.5.9.3. 配置并安装共享数据库

流程

  1. 使用不同可用区 (AZ) 在同一区域中创建两个或多个 OpenShift 集群。建议至少有三个区域。
  2. 创建启用了 Amazon Relational Database Service (RDS) Multi-AZ 的所有所需的 AWS ElastiCache (EC) 实例:

    1. 一个 AWS EC 用于后端 Redis 数据库
    2. 一个 AWS EC 用于系统 Redis 数据库
  3. 创建启用了 Amazon RDS Multi-AZ 的所有所需的 AWS RDS 实例:

    1. 一个用于系统数据库的 AWS RDS
    2. 一个用于 Zync 数据库的 AWS RDS
  4. 为系统资产配置 AWS S3 存储桶。
  5. 在 AWS Route53 或 DNS 供应商中创建自定义域,并将其指向活跃集群的 OpenShift 路由器。这必须与 APIManager 自定义资源(CR) 的 wildcardDomain 属性冲突。
  6. 在被动集群中安装 3scale。APIManager CR 应该与上一步中使用的 CR 相同。当所有 pod 运行时,更改 APIManager 以为所有 后端系统zynyAPIcast pod 部署 0 个副本。

    1. 将副本数设置为 0,以避免消耗活跃的数据库的作业。如果每个副本首次设置为 0,则部署会因为 pod 依赖项而失败。例如,检查其他人是否正在运行的 pod。首先以正常方式部署,然后将 replicas 设置为 0,如 APIManager spec 示例所示:

      spec:
        apicast:
          stagingSpec:
            replicas: 0
          productionSpec:
            replicas: 0
        backend:
          listenerSpec:
            replicas: 0
          workerSpec:
            replicas: 0
          cronSpec:
            replicas: 0
        zync:
          appSpec:
            replicas: 0
          queSpec:
            replicas: 0
        system:
          appSpec:
            replicas: 0
          sidekiqSpec:
            replicas: 0

2.5.9.4. 手动故障转移共享数据库

流程

  1. 在活跃集群中,将 后端 的副本、系统zyncAPIcast pod 缩减为 0。

    1. 这会变为新的被动集群,因此您可以确保新的被动集群不会消耗来自活跃数据库的作业。停机时间从这里开始。
  2. 在被动集群中,编辑 APIManager 以扩展 后端系统zyncAPIcast pod 的副本,设置为 0,因此它将成为活跃集群。
  3. 在新的活动集群中,重新创建 zync 创建的 OpenShift 路由。

    1. system-app pod 的 system-master 容器运行 zync:resync:domains 命令:

      bundle exec rake zync:resync:domains
  4. 将 AWS Route53 中创建的自定义域指向新活跃集群的 OpenShift 路由器。

    1. 旧的被动集群将开始接收流量,并成为新的活跃集群。

2.5.9.5. 带有同步数据库的不同区域中的主动 - 被动集群

此设置包括在不同区域中有两个或更多集群,并以主动 - 被动模式部署 3scale。一个集群处于活动状态,接收流量,其他集群处于待机模式,而不接收流量,因此准备假定活跃角色在活跃集群中存在故障。

为确保良好的数据库访问延迟,每个集群都有自己的数据库实例。主动 3scale 安装中的数据库复制到 3scale 被动安装的 read-replica 数据库,以便数据在所有区域中可用,以实现可能的故障转移。

带有同步数据库的不同区域上的 3scale High Availability Active-passive 集群

2.5.9.6. 配置并安装同步数据库

流程

  1. 在不同的区域中创建两个或多个 OpenShift 集群,使用不同的可用区。建议至少有三个区域。
  2. 在每个区域上创建启用了 Amazon RDS Multi-AZ 的所有所需的 AWS ElastiCache 实例:

    1. 两个用于后端 Redis 数据库的 AWS EC:每个区域一个。
    2. 两个用于系统 Redis 数据库的 AWS EC:每个区域一个。
    3. 使用启用 Global Datastore 功能的跨区域复制功能,因此来自被动区域的数据库会在活动区域从主数据库读取副本。
  3. 在每个区域都启用了 Amazon RDS Multi-AZ 创建所有必需的 AWS RDS 实例:

    1. 系统数据库有两个 AWS RDS。
    2. 两个用于 Zync 数据库的 AWS RDS。
    3. 使用跨区域复制,因此来自被动区域的数据库是活动区域的主数据库读取副本。
  4. 使用跨区域复制,为每个区域上的系统资产配置 AWS S3 存储桶。
  5. 在 AWS Route53 或 DNS 供应商中创建自定义域,并将其指向活跃集群的 OpenShift 路由器。这必须与 APIManager CR 中的 wildcardDomain 属性冲突。
  6. 在被动集群中安装 3scale。APIManager CR 应该与上一步中使用的 CR 相同。当所有 pod 运行时,更改 APIManager 以为所有 后端系统zyncAPIcast pod 部署 0 个副本。

    1. 将副本数设置为 0,以避免消耗活跃的数据库的作业。如果每个副本首次设置为 0,则部署会因为 pod 依赖项而失败。例如,检查其他人是否正在运行的 pod。首先以正常方式部署,然后将 replicas 设置为 0。

2.5.9.7. 手动故障转移同步数据库

流程

  1. 执行手动故障转移共享数据库步骤 1、2 和 3。

    1. 每个集群都有自己的独立数据库:活动区域中的 master 的 read-replicas。
    2. 您必须在每个数据库上手动执行故障转移,以选择被动区域的新 master,然后成为活动区域。
  2. 手动故障转移数据库要执行的是:

    1. AWS RDS: SystemZync
    2. AWS ElastiCaches: BackendSystem
  3. 执行手动故障转移共享数据库的第 4 步。

2.5.10. Amazon Simple Storage Service 3scale fileStorage 安装

在创建 APIManager 自定义资源(CR)以部署 3scale 之前,使用 OpenShift secret 为 Amazon Simple Storage Service (Amazon S3)服务提供连接设置。

重要
  • 如果要使用本地文件系统存储部署 3scale,请跳过此部分。
  • 您为 secret 选择的名称可以是任何名称,只要它不是现有的 secret 名称,它将在 APIManager CR 中引用。
  • 如果没有为 S3 兼容存储提供 AWS_REGION,请使用 default,否则部署将失败。
  • 免责声明:包括在此处的外部网络链接仅为方便用户而提供。红帽没有审阅链接的内容,并不对其内容负责。包含任何指向外部网站的链接并不表示红帽认可该网站或其实体、产品或服务。您同意红帽对因您使用(或依赖)外部网站或内容而导致的任何损失或费用不承担任何责任。

2.5.10.1. Amazon S3 存储桶创建

先决条件

流程

  1. 创建用于存储系统资产的存储桶。
  2. 使用开发人员门户的 logo 功能时,禁用 S3 的公共访问块程序。
  3. 使用以下默认权限创建 Identity and Access Management(IAM)策略:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "s3:ListAllMyBuckets",
                "Resource": "arn:aws:s3:::*"
            },
            {
                "Effect": "Allow",
                "Action": "s3:*",
                "Resource": [
                    "arn:aws:s3:::<target_bucket_name>", 1
                    "arn:aws:s3:::<target_bucket_name>/*" 2
                ]
            }
        ]
    }
    1
    <target_bucket_name > 替换为您自己的值。
    2
    <target_bucket_name > 替换为您自己的值。
  4. 使用以下规则创建 CORS 配置

    <?xml version="1.0" encoding="UTF-8"?>
    <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>https://*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
    </CORSRule>
    </CORSConfiguration>

2.5.10.2. 创建 OpenShift secret

以下示例演示了使用 Amazon S3 而不是持久性卷声明(PVC)的 3scale 文件存储

注意

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

在以下示例中,Secret 名称可以是任何名称,因为它在 APIManager CR 中引用。

apiVersion: v1
kind: Secret
metadata:
  creationTimestamp: null
  name: aws-auth
stringData:
  AWS_ACCESS_KEY_ID: <ID_123456>
  AWS_SECRET_ACCESS_KEY: <ID_98765544>
  AWS_BUCKET: <mybucket.example.com>
  AWS_REGION: eu-west-1
type: Opaque

最后,创建 APIManager CR 来部署 3scale。

apiVersion: apps.3scale.net/v1alpha1
kind: APIManager
metadata:
  name: <example_apimanager>
  namespace: <3scale_test>
spec:
  wildcardDomain: lvh.me
  system:
    fileStorage:
      simpleStorageService:
        configurationSecretRef:
          name: aws-auth

检查 APIManager SystemS3Spec

下表显示了 Identity and Access Management (IAM)和安全令牌服务(STS)设置的 fileStorage Amazon S3 凭证 secret 字段要求:

  • 使用安全令牌服务 (STS) 的 S3 验证方法适用于短期、有有限权限的安全凭证。
  • S3 Identity and Access Management (IAM) 用于长期权限安全凭证。
表 2.1. Filestorage S3 credentials secret 字段
字段描述IAM 需要STS 需要

AWS_ACCESS_KEY_ID

用于系统的 fileStorage的 S3 存储中使用的 AWS 访问密钥 ID

AWS_SECRET_ACCESS_KEY

用于系统的 fileStorage的 S3 存储中使用的 AWS 访问密钥 Secret

AWS_BUCKET

用作资产的文件系统 fileStorage 的 S3 存储桶

AWS_REGION

用作资产的系统 fileStorage 的 S3 存储桶区域

AWS_HOSTNAME

默认 :Amazon 端点 - AWS S3 兼容供应商端点主机名

AWS_PROTOCOL

默认:HTTPS AWS S3 兼容供应商端点协议

AWS_PATH_STYLE

默认:false - 当设置为 true 时,存储桶名称始终保留在请求 URI 中,并且永远不会作为子域移到主机。

AWS_ROLE_ARN

ARN 角色,它有一个附加的策略用于使用 AWS STS 进行身份验证

AWS_WEB_IDENTITY_TOKEN_FILE

挂载令牌文件位置的路径。例如:/var/run/secrets/openshift/serviceaccount/token

2.5.11. PostgreSQL 安装

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

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

其他资源

2.5.12. 配置 SMTP 变量(可选)

3scale 使用电子邮件发送通知邀请新用户。如果要使用这些功能,则必须提供自己的 SMTP 服务器并在 system-smtp 机密中配置 SMTP 变量。

执行以下步骤在 system-smtp secret 中配置 SMTP 变量:

流程

  1. 如果您还没有登录,请登录到 OpenShift:

    $ oc login
  2. 使用 oc patch 命令,指定 system-smtp 是 secret 名称的 secret 类型,后跟 -p 选项,并在 JSON 中为以下变量写入新值:

    表 2.2. system-smtp
    字段描述默认值

    address

    这是要使用的远程邮件服务器的地址(主机名或 IP)。如果此值设为一个不是 "" 的值,系统将使用邮件服务器来发送与 API 管理解决方案中发生的事件相关的邮件。

    ""

    port

    这是要使用的远程邮件服务器的端口。

    ""

    domain

    如果邮件服务器需要 HELO 域,使用

    ""

    身份验证

    如果邮件服务器需要身份验证时使用。设置身份验证类型: plain 以明文发送,login 中 Base64 编码的形式发送密码,或 cram_md5 根据 HMAC-MD5 算法组合一个质询/响应机制。

    ""

    username

    如果邮件服务器需要身份验证且身份验证类型需要,则使用 username

    ""

    password

    如果邮件服务器需要身份验证且身份验证类型需要它,则使用 password

    ""

    openssl.verify.mode

    使用 TLS 时,您可以设置 OpenSSL 如何检查证书。如果您需要验证自签名和/或通配符证书,这非常有用。您可以使用 OpenSSL 验证常量的名称:nonepeer

    ""

    from_address

    no-reply 邮件的 from 地址值。

    ""

    例子

    $ oc patch secret system-smtp -p '{"stringData":{"address":"<your_address>"}}'
    $ oc patch secret system-smtp -p '{"stringData":{"username":"<your_username>"}}'
    $ oc patch secret system-smtp -p '{"stringData":{"password":"<your_password>"}}'
  3. 设置 secret 变量后,重新部署 system-appsystem-sidekiq pod:

    $ oc rollout latest dc/system-app
    $ oc rollout latest dc/system-sidekiq
  4. 检查推出部署的状态,以确保它已完成:

    $ oc rollout status dc/system-app
    $ oc rollout status dc/system-sidekiq

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

通过 APIManager 自定义资源(CR)属性自定义 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"

其他资源

如需有关如何指定组件级 CR 要求的更多信息,请参阅 APIManager CRD 参考

2.5.13.1. 默认 APIManager 组件计算资源

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

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

2.5.13.1.1. CPU 和内存单元

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

资源单元解释

  • m - milliCPU 或 millicore
  • Mi - mebibytes
  • Gi - gibibyte
  • G - gigabyte
表 2.3. 计算资源默认值
组件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.5.14. 组件级别的自定义节点关联性和容限

通过 APIManager CR 属性自定义红帽 3scale API 管理解决方案中的 Kubernetes 关联性容限,以自定义安装的不同 3scale 组件如何调度到 Kubernetes 节点上。

以下示例为后端设置自定义节点关联性。它还为 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 CRD 参考

2.5.15. 协调

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

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

以下是可协调参数列表:

2.5.15.1. Resources

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

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

2.5.15.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.5.15.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.5.15.4. 系统副本

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

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

2.5.15.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
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.