搜索

安装 3scale

download PDF
Red Hat 3scale API Management 2.12

安装和配置 3scale API 管理。

Red Hat Customer Content Services

摘要

本指南提供用于安装和配置 3scale API 管理的信息。

前言

本指南将帮助您安装和配置 3scale

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看我们的 CTO Chris Wright 信息

第 1 章 3scale 的 registry 服务帐户

要在带有 3scale 2.12 的共享环境中使用 registry.redhat.io 中的容器镜像,您必须使用 Registry 服务帐户而不是单独的用户的客户门户网站 凭证。

重要

部署 3scale 需要遵循本章中所述的步骤,然后才能使用模板或通过操作器在 OpenShift 上部署,因为这两个选项都使用注册表身份验证。

要创建和修改 registry 服务帐户,请执行以下部分中所述的步骤:

1.1. 创建 registry 服务帐户

要创建 registry 服务帐户,请按照以下步骤操作。

流程

  1. 进入 Registry Service Accounts 页面并登录。
  2. New Service Account
  3. Create a New Registry Service Account 页面上填写表单。

    1. 服务帐户 添加名称。

      :您将在表单字段前面看到一个固定长度、随机生成的数字字符串。

    2. 输入 描述
    3. Create
  4. 切回到您的 服务帐户
  5. 您创建的 服务帐户。
  6. 记录用户名,包括前缀字符串,如 12345678|username 和您的密码。此用户名和密码将用于登录 registry.redhat.io
注意

Token Information 页面中提供了相应的选项卡,用于显示如何使用身份验证令牌。例如,Token Information 选项卡显示格式为 12345678|username 的用户名,其下的密码字符串为。

1.2. 配置容器 registry 身份验证

作为 3scale 管理员,在 OpenShift 中部署 3scale 之前,使用 registry.redhat.io 配置身份验证。

先决条件

  • 具有管理员凭证的 Red Hat OpenShift Container Platform (OCP) 帐户。
  • 已安装 OpenShift oc 客户端工具。如需了解更多详细信息,请参阅 OpenShift CLI 文档

流程

  1. 以管理员身份登录您的 OpenShift 集群:

    $ oc login -u system:admin
  2. 打开您要在其中部署 3scale 的项目:

    oc project your-openshift-project
  3. 使用您的红帽客户门户网站帐户创建一个 docker-registry secret,将 threescale-registry-auth 替换为要创建的 secret:

    $ oc create secret docker-registry threescale-registry-auth \
      --docker-server=registry.redhat.io \
      --docker-username="customer_portal_username" \
      --docker-password="customer_portal_password" \
      --docker-email="email_address"

    您将看到以下输出:

    secret/threescale-registry-auth created
  4. 将机密链接到您的服务帐户,以使用机密拉取镜像。服务帐户名称必须与 OpenShift 容器集使用的名称匹配。这个示例使用 default 服务帐户:

    $ oc secrets link default threescale-registry-auth --for=pull
  5. 将 secret 链接到 builder 服务帐户,以使用 secret 推送和拉取构建镜像:

    $ oc secrets link builder threescale-registry-auth

其他资源

有关向容器镜像进行身份验证的更多详情:

1.3. 修改 registry 服务帐户

您可以使用表中每个身份验证令牌右侧的弹出菜单,从 Registry Service Account 页面编辑或删除服务帐户。

警告

重新生成或删除 服务帐户 会影响使用该令牌对 registry.redhat.io 进行身份验证和检索内容的系统。

每个功能的描述如下:

  • 重新生成令牌:允许授权用户重置与服务帐户关联的 密码

    备注:您无法修改服务帐户的用户名

  • 更新描述:允许授权用户更新服务帐户的描述。
  • 删除帐户:允许授权用户删除服务帐户

1.4. 其他资源

第 2 章 在 OpenShift 上安装 3scale

本节介绍了在 OpenShift 上部署 Red Hat 3scale API Management 2.12 的步骤。

用于内部部署的 3scale 解决方案包括:

  • 两个 API 网关:嵌入式 APIcast
  • 使用持久性存储的 3scale 管理门户和开发者门户
注意
  • 使用 operator 部署 3scale 时,必须首先将 registry 身份验证配置到 Red Hat Container registry。请参阅配置容器 registry 身份验证
  • 3scale Istio 适配器是一个可选适配器,允许在 Red Hat OpenShift Service Mesh 中标记运行的服务,并将该服务与 3scale 管理集成。如需更多信息,请参阅 3scale 适配器 文档。

先决条件

要在 OpenShift 上安装 3scale,请执行以下小节中介绍的步骤:

2.1. 在 OpenShift 上安装 3scale 的系统要求

本节列出了 3scale - OpenShift 模板的要求。

2.1.1. 环境要求

红帽 3scale API 管理需要在 支持的配置中 指定环境。

如果您使用本地文件系统存储:

持久性卷(PV)

  • 3 RWO(ReadWriteOnce)用于 Redis 和 MySQL 持久性的持久性卷
  • 1 个用于开发人员门户内容和 System-app 资源的 RWX(ReadWriteMany)持久性卷

将 RWX 持久卷配置为可写入组。如需支持所需访问模式的持久卷类型列表,请参阅 OpenShift 文档

注意

3scale 仅支持 RWX 卷的网络文件系统 (NFS)。

对于 IBM Power (ppc64le) 和 IBM Z (s390x),使用以下命令置备本地存储:

存储

  • NFS

如果您在内容管理系统(CMS)存储中使用 Amazon Simple Storage Service(Amazon S3)存储桶:

持久性卷(PV)

  • 3 RWO(ReadWriteOnce)用于 Redis 和 MySQL 持久性的持久性卷

存储

  • 1 Amazon S3 存储桶
  • NFS

2.1.2. 硬件要求

硬件要求取决于您的使用需求。红帽建议您测试和配置您的环境,以满足您的特定要求。以下是在 OpenShift 中为 3scale 配置环境时的建议:

  • 计算优化的节点用于云环境(AWS c4.2xlarge 或 Azure Standard_F8)上的部署。
  • 如果内存要求超过您当前节点的可用 RAM,则非常大型安装可能需要单独节点(AWS M4 系列或 Azure Av2 系列)。
  • 路由和计算任务之间分隔的节点。
  • 用于 3scale 特定任务的专用计算节点.
  • 将后端侦听器的 PUMA_WORKERS 变量设置为计算节点中的内核数。

其他资源

2.2. 配置节点和权利

在 OpenShift 上部署 3scale 之前,您必须配置必要的节点以及环境的授权,以便从 红帽生态系统目录 获取镜像。执行以下步骤来配置节点和权利:

流程

  1. 在您的每个节点上安装 Red Hat Enterprise Linux(RHEL)
  2. 使用红帽订阅管理器(RHSM)通过 接口命令行向红帽注册您的节点。
  3. 使用 RHSM 将您的节点附加到 3scale 订阅
  4. 根据以下要求,在节点上 安装 OpenShift

  5. 安装 OpenShift 命令行界面
  6. 使用订阅管理器启用对 rhel-7-server-3scale-amp-2-rpms 存储库的访问权限:

    sudo subscription-manager repos --enable=rhel-7-server-3scale-amp-2-rpms
  7. 安装 3scale 模板,取名为 3scale-amp-template。这将保存在 /opt/amp/templates 中。

    sudo yum install 3scale-amp-template

2.2.1. 配置 Amazon Simple Storage Service

重要

如果要使用本地文件系统存储部署 3scale,请跳过此部分。

如果要使用 Amazon Simple Storage Service(Amazon S3)存储桶作为存储,您必须配置存储桶,然后才能在 OpenShift 中部署 3scale。

执行以下步骤为 3scale 配置 Amazon S3 存储桶:

  1. 使用以下默认权限创建 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:::targetBucketName",
                    "arn:aws:s3:::targetBucketName/*"
                ]
            }
        ]
    }
  2. 使用以下规则创建 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.3. 使用模板在 OpenShift 上部署 3scale

注意

OpenShift Container Platform(OCP)4.x 仅支持使用 Operator 部署 3scale。请参阅使用操作器部署 3scale

先决条件

  • 根据配置节点和授权一节中指定的配置 OpenShift 集群。
  • 解析到 OpenShift 集群的
  • 访问红帽生态系统目录
  • (可选)在本地文件系统外的内容管理系统(CMS)存储的 Amazon Simple Storage Service(Amazon S3)存储桶。
  • (可选)使用 PostgreSQL 部署。

    • 这与 Openshift 上的默认部署相同,但它使用 PostgreSQL 作为内部系统数据库。
  • (可选)用于电子邮件功能的已正常工作 SMTP 服务器。
注意

使用模板在 OpenShift 上部署 3scale 基于 OpenShift Container Platform 3.11

按照以下步骤,使用一个 .yml 模板在 OpenShift 上安装 3scale:

2.4. 3scale 模板的参数

模板参数配置部署期间和之后 3scale(amp.yml)模板的环境变量。

表 2.1. 模板参数
名称描述默认值必需?

APP_LABEL

用于对象应用程序标签

3scale-api-management

ZYNC_DATABASE_PASSWORD

PostgreSQL 连接用户的密码。如果未提供,则随机生成.

N/A

ZYNC_SECRET_KEY_BASE

适用于 Zync 的机密密钥基础.如果未提供,则随机生成.

N/A

ZYNC_AUTHENTICATION_TOKEN

Zync 的身份验证令牌.如果未提供,则随机生成.

N/A

AMP_RELEASE

3scale 发行标签。

2.12.0

ADMIN_PASSWORD

一个随机生成的 3scale 管理员帐户密码。

N/A

ADMIN_USERNAME

3scale 管理员帐户用户名.

admin

APICAST_ACCESS_TOKEN

阅读 APIcast 将用来下载其配置的唯一访问令牌。

N/A

ADMIN_ACCESS_TOKEN

具有所有范围的管理访问令牌,以及用于 API 访问的写入权限。

N/A

WILDCARD_DOMAIN

通配符路由的根域.例如,根域 example.com 将生成 3scale-admin.example.com

N/A

TENANT_NAME

管理门户的 root 下具有 -admin 后缀的租户名称。

3scale

MYSQL_USER

用于访问数据库的 MySQL 用户的用户名。

mysql

MYSQL_PASSWORD

MySQL 用户的密码。

N/A

MYSQL_DATABASE

访问的 MySQL 数据库的名称。

system

MYSQL_ROOT_PASSWORD

Root 用户的密码.

N/A

SYSTEM_BACKEND_USERNAME

用于内部 3scale api 身份验证的内部 3scale API 用户名。

3scale_api_user

SYSTEM_BACKEND_PASSWORD

用于内部 3scale api 身份验证的内部 3scale API 密码。

N/A

REDIS_IMAGE

使用的 redis 镜像

registry.redhat.io/rhscl/redis-5-rhel7:5

MYSQL_IMAGE

要使用的 MySQL 镜像

registry.redhat.io/rhel8/mysql-80:1

MEMCACHE_SERVERS

以逗号分隔的 memcache 服务器的字符串,创建由 system-* pod 使用的 memcache 服务器的环。

system-memcache:11211

例如:MEMCACHE_SERVERS="cache-1.us-east.domain.com:11211,cache-3.us-east.domain.com:11211,cache-2.us-east.domain.com:11211"

MEMCACHED_IMAGE

要使用的 Memcached 镜像

registry.redhat.io/3scale-amp2/memcached-rhel7:3scale2.12

POSTGRESQL_IMAGE

要使用的 PostgreSQL 镜像

registry.redhat.io/rhscl/postgresql-13-rhel7

AMP_SYSTEM_IMAGE

要使用的 3scale 系统镜像

registry.redhat.io/3scale-amp2/system-rhel7:3scale2.12

AMP_BACKEND_IMAGE

要使用的 3scale 后端镜像

registry.redhat.io/3scale-amp2/backend-rhel8:3scale2.12

AMP_APICAST_IMAGE

使用的 3scale APIcast 镜像

registry.redhat.io/3scale-amp2/apicast-gateway-rhel8:3scale2.12

AMP_ZYNC_IMAGE

要使用的 3scale Zync 镜像

registry.redhat.io/3scale-amp2/zync-rhel8:3scale2.12

SYSTEM_BACKEND_SHARED_SECRET

用于将事件从后端导入到系统的共享机密。

N/A

SYSTEM_APP_SECRET_KEY_BASE

系统应用程序 secret 密钥基础

N/A

APICAST_MANAGEMENT_API

APIcast 管理 API 的范围。可以禁用、状态或调试。至少健康检查所需的状态。

status

APICAST_OPENSSL_VERIFY

下载配置时打开/关闭 OpenSSL 对等验证。可以设置为 true/false。

false

APICAST_RESPONSE_CODES

在 APIcast 中启用日志响应代码。

true

APICAST_REGISTRY_URL

解析到 APIcast 策略位置的 URL

http://apicast-staging:8090/policies

MASTER_USER

Master 管理员帐户用户名

master

MASTER_NAME

master 管理门户的子域值将附加 -master 后缀

master

MASTER_PASSWORD

随机生成的 master 管理员密码

N/A

MASTER_ACCESS_TOKEN

具有用于 API 调用 master 级别的权限的令牌

N/A

IMAGESTREAM_TAG_IMPORT_INSECURE

如果服务器可以在镜像导入过程中绕过证书验证或直接通过 HTTP 连接,则设置为 true。

false

2.5. 使用 Operator 部署 3scale

本节介绍了使用 APIManager 自定义资源通过 3scale 操作器安装和部署 3scale 解决方案。

注意
  • 自 3scale 2.6 起,已删除 通配符路由。

    • 这个功能由 Zync 在后台处理。
  • 创建、更新或删除 API 提供程序时,路由会自动反映这些更改。

先决条件

按照以下步骤,使用 Operator 部署 3scale:

2.5.1. 部署 APIManager 自定义资源

部署 APIManager 自定义资源将使 Operator 开始处理,并从中部署 3scale 解决方案。

流程

  1. Operators > Installed Operators

    1. Installed Operators 列表中,点 3scale Operator
  2. API Manager 选项卡。
  3. Create APIManager
  4. 清除示例内容,并将以下 YAML 定义添加到编辑器中,然后单击 Create

    • 在 3scale 2.8 之前,您可以通过将 HighAvailability 字段设置为 true 来配置自动添加副本。从 3scale 2.8 开始,对副本的添加会通过 APIManager CR 中的 replicas 字段来控制,如下例所示。

      注意

      wildcardDomain 参数可以是您想要将该解析为 IP 地址的任何所需名称,而 IP 地址是一个有效的 DNS 域。

    • 具有最低要求的 APIManager CR:

      apiVersion: apps.3scale.net/v1alpha1
      kind: APIManager
      metadata:
        name: apimanager-sample
      spec:
        wildcardDomain: example.com
    • 配置副本的 APIManager CR:

      apiVersion: apps.3scale.net/v1alpha1
      kind: APIManager
      metadata:
        name: apimanager-sample
      spec:
        system:
          appSpec:
            replicas: 1
          sidekiqSpec:
            replicas: 1
        zync:
          appSpec:
            replicas: 1
          queSpec:
            replicas: 1
        backend:
          cronSpec:
            replicas: 1
          listenerSpec:
            replicas: 1
          workerSpec:
            replicas: 1
        apicast:
          productionSpec:
            replicas: 1
          stagingSpec:
            replicas: 1
        wildcardDomain: example.com

2.5.2. 获取 APIManager 管理门户和主管理门户凭证

要在基于 operator 的部署后登录到 3scale 管理门户或 Master 管理门户,您需要每个单独的门户的凭证。要获得以下凭证:

  1. 运行以下命令来获取 Admin Portal 凭证:

    oc get secret system-seed -o json | jq -r .data.ADMIN_USER | base64 -d
    oc get secret system-seed -o json | jq -r .data.ADMIN_PASSWORD | base64 -d
    1. 以 Admin Portal 管理员身份登录,以验证这些凭据是否正常工作。
  2. 运行以下命令来获取主管理门户凭证:

    oc get secret system-seed -o json | jq -r .data.MASTER_USER | base64 -d
    oc get secret system-seed -o json | jq -r .data.MASTER_PASSWORD | base64 -d
    1. 以 Master Admin Portal 管理员身份登录,以验证这些凭据是否正常工作。

其他资源

如需有关 APIManager 字段的更多信息,请参阅参考文档

2.5.3. 获取管理门户 URL

当使用操作器部署 3scale 时,会创建一个带有固定 URL 的默认租户:3scale-admin.${wildcardDomain}

3scale 控制面板显示租户的新门户 URL。例如,如果 <wildCardDomain>3scale-project.example.com,则管理门户 URL 为 https://3scale-admin.3scale-project.example.com

wildcardDomain 是您在安装过程中提供的 <wildCardDomain> 参数。使用这个命令在浏览器中打开这个唯一 URL:

xdg-open https://3scale-admin.3scale-project.example.com

另外,您还可以在 MASTER 门户 URL 上创建新的租户:master.${wildcardDomain}

2.5.4. 配置微版本的自动应用程序

要获得微版本更新并使其被自动应用,3scale Operator 的批准策略必须设置为 Automatic。下面描述了自动手动设置之间的区别,并概述了从一个设置改为另一个流程的步骤。

自动和手动:

  • 在安装过程中,自动设置是所选选项。随着新的更新可用,就会安装新的更新。您可以在安装过程中或之后更改。
  • 如果您在安装过程中或以后选择了 Manual 选项,会在有可用情况下收到更新。接下来,您必须批准 Install Plan,并自行应用。

流程

  1. Operators > Installed Operators
  2. Installed Operators 列表中,单击 3scale API Management
  3. Subscription 标签页。在 Subscription Details 标题下,您将看到子标题 Approval
  4. Approval 下的链接。默认情况下,链接设置为 Automatic。系统将弹出一个标题为 Change Update Approval Strategy 的模态。
  5. 选择您首选的选项:自动(默认)Manual,然后单击 Save

其他资源

2.5.5. 使用 Operator 的 3scale 的高可用性

使用 operator 的 3scale 中的高可用性(HA) 提供不间断的运行时间(例如,在一个或多个数据库失败的情况下继续工作)。

如果要在基于 operator 部署的 3scale 中实现高可用性,请注意以下几点:

  • 在外部配置和部署 3scale 关键数据库。关键数据库包括系统数据库、系统 redis 和后端 redis 组件。确保您以使其具有高可用性的方式部署和配置这些组件。
  • 在部署 3scale 前,通过创建对应的 Kubernetes secret 来指定到这些组件的连接端点。

  • APIManager 自定义资源(CR)中,设置 .spec.externalComponents 属性来指定系统数据库、系统 redis 和 backend redis 为外部:

    externalComponents:
      backend:
        redis: true
    system:
      database: true
      redis: true
    zync:
      database: true

另外,如果您希望 zync 数据库高度可用,为了避免 zync 可能会在重启时丢失队列作业数据,请注意:

  • 在外部部署和配置 zync 数据库。确保以高可用性方式部署和配置数据库。
  • 通过在部署 3scale 前创建对应的 Kubernetes secret,指定到 3scale 的 zync 数据库的连接端点。

  • 通过将 APIManager CR 中的 .spec.externalComponents.zync.database 属性设为 true 来配置 3scale,以指定 zync 数据库是一个外部数据库。

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

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

先决条件

2.6.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.6.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.6.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.6.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 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.6.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 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,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.6.6. 评估部署的概念验证

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

重要

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

2.6.6.1. 默认部署配置
  • 容器将具有 Kubernetes 资源限值和请求

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

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

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

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

2.6.6.2. 评估安装

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

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

其他资源

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

2.6.7. 安装外部数据库

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

重要

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

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

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

数据库版本

redis

5.0

MySQL

8.0

PostgreSQL

13

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

2.6.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.6.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.6.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 数据库服务名称
2.6.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.6.7.5. 用于部署 3scale 的 APIManager 自定义资源
注意
  • 当启用外部组件时,必须在部署 3scale 前为每个外部组件(backend-redissystem-redissystem-databasezync)创建一个 secret。
  • 对于外部 system-database,仅选择一种数据库来外部化。

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

如果您的 backend-redissystem-redissystem-database 对于 3scale 是外部的,APIManager 自定义资源必须填充对应的 externalComponents 对象。例如:

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

2.6.8. Amazon Simple Storage Service 3scale Filestorage 安装

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

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

2.6.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.6.9. PostgreSQL 安装

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

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

其他资源

2.6.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.6.10.1. 默认 APIManager 组件计算资源

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

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

2.6.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.6.11. 组件级别的自定义节点关联性和容限

在 Red Hat 3scale API Management 中自定义 Kubernetes 关联性容限APIManager 自定义资源属性用于定制一个安装中的不同 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 CDR 参考

2.6.12. 协调

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

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

以下是可协调参数列表:

2.6.12.1. Resources

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

apiVersion: apps.3scale.net/v1alpha1
kind: APIManager
metadata:
  name: example-apimanager
spec:
  ResourceRequirementsEnabled: true/false
2.6.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.6.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.6.12.4. 系统副本

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

apiVersion: apps.3scale.net/v1alpha1
kind: APIManager
metadata:
  name: example-apimanager
spec:
  system:
    appSpec:
      replicas: X
    sidekiqSpec:
      replicas: Z
2.6.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

2.7. 使用 Oracle 作为系统数据库的操作器安装 3scale

作为红帽 3scale API 管理管理员,您可以使用 Oracle 数据库使用操作器安装 3scale。默认情况下,3scale 2.12 有一个名为 system 的组件,它将在 MySQL 数据库中存储配置数据 。您可以覆盖默认数据库,并将信息存储在外部 Oracle 数据库中。

注意
  • 当您只执行 3scale 的 Operator 安装时,OpenShift Container Platform(OCP)版本 4.2 和 4.3 不支持 Oracle 数据库。如需更多信息,请参阅 Red Hat 3scale API 管理支持的配置 页面。
  • 在本文档中,myregistry.example.com 用作 registry URL 的示例。将它替换为您的 registry URL。
  • 免责声明:包括在此处的外部网络链接仅为方便用户而提供。红帽没有审阅链接的内容,并不对其内容负责。包含任何指向外部网站的链接并不表示红帽认可该网站或其实体、产品或服务。您同意红帽对因您使用(或依赖)外部网站或内容而导致的任何损失或费用不承担任何责任。

先决条件

  • 一个容器 registry,用于推送容器镜像,该镜像可由安装 3scale 的 OCP 集群访问。
  • 3scale operator 的安装

    • 不要安装 APIManager 自定义资源,因为它将在以下步骤中创建。
  • 3scale 的 Registry 服务帐户
  • 可以从 OpenShift cluster 访问的一个 Oracle Database 的支持版本。
  • 访问 Oracle Database 系统用户以获取安装过程

要使用 Oracle 作为系统数据库通过操作器安装 3scale,请执行以下步骤:

2.7.1. 准备 Oracle 数据库

作为 3scale 管理员,当您决定将其用作默认值时,您必须为 3scale 安装准备 Oracle 数据库。

流程

  1. 创建新数据库。
  2. 应用以下设置:

    ALTER SYSTEM SET max_string_size=extended SCOPE=SPFILE;
  3. 在使用 3scale 安装 Oracle 数据库前,需要先创建一个常规的、非系统用户。

    1. Oracle 数据库的常规的、非系统用户的密码必须是唯一的,且与 system 的密码不匹配。
    2. Oracle Database 初始化脚本运行以下 SQL 命令:

      ALTER USER {DB_USER} IDENTIFIED BY {DB_PASSWORD}
      • 在启动 3scale 安装前,请确保此 SQL 命令正确执行。
      • {DB_USER}{DB_PASSWORD} 是常规的非系统用户的用户名和密码。
      • 如果参数 PASSWORD_REUSE_TIME and PASSWORD_REUSE_MAX 被设置为限制重新使用相同的密码,则数据库配置可能会阻止这个命令成功完成。
      • Oracle 数据库 system 用户以系统权限执行命令。

      • 当有要运行的模式迁移时,也需要升级 system 用户,因此可能会执行前面链接中包括的其他命令。

其他资源

2.7.2. 构建自定义系统容器镜像

流程

  1. GitHub 存储库下载 3scale OpenShift 模板并提取存档:

    tar -xzf 3scale-amp-openshift-templates-3scale-2.12.0-GA.tar.gz
  2. Instant Client Downloads 页面中下载:

  3. 查看 Red Hat 3scale API Management 支持的配置中的以下 Oracle 软件组件:

    • Oracle Instant 客户端软件包:Basic 或 Basic Light
    • Oracle Instant 客户端软件包:SDK
    • Oracle Instant 客户端软件包:ODBC

      表 2.3. Oracle 19c 示例软件包(3scale)
      Oracle 19c 软件包名称压缩的文件名

      基本的

      instantclient-basic-linux.x64-19.8.0.0.0dbru.zip

      Basic Light

      instantclient-basiclite-linux.x64-19.8.0.0.0dbru.zip

      SDK

      instantclient-sdk-linux.x64-19.8.0.0.0dbru.zip

      ODBC

      instantclient-odbc-linux.x64-19.8.0.0.0dbru.zip

      表 2.4. Oracle 19c 示例软件包用于 ppc64le 和 3scale
      Oracle 19c 软件包名称压缩的文件名

      基本的

      instantclient-basic-linux.leppc64.c64-19.3.0.0.0dbru.zip

      Basic Light

      instantclient-basiclite-linux.leppc64.c64-19.3.0.0.0dbru.zip

      SDK

      instantclient-sdk-linux.leppc64.c64-19.3.0.0.0dbru.zip

      ODBC

      instantclient-odbc-linux.leppc64.c64-19.3.0.0.0dbru.zip

    注意

    如果本地下载并存储的客户端软件包版本与 3scale 期望不匹配,3scale 将自动下载并使用以下步骤中的相应版本。

  4. 将 Oracle Database Instant Client Package 文件放在 3scale-amp-openshift-templates-3scale-2.12-GA/amp/system-oracle/oracle-client-files 目录中。
  5. 使用您在创建 registry 服务帐户中创建的凭证登录到 registry.redhat.io 帐户。

    $ docker login registry.redhat.io
  6. 构建基于 Oracle 的自定义系统镜像.镜像标签必须是固定镜像标签,如下例所示:

    $ docker build . --tag myregistry.example.com/system-oracle:2.12.0-1
  7. 将基于 Oracle 的系统镜像推送到 OCP 集群可访问的容器注册表。此容器 registry 是安装 3scale 解决方案的位置:

    $ docker push myregistry.example.com/system-oracle:2.12.0-1

2.7.3. 使用操作器安装带有 Oracle 的 3scale

流程

  1. 通过使用对应字段创建 system-database secret,设置 Oracle Database URL 连接字符串和 Oracle Database 系统密码。请参阅为 Oracle 数据库安装外部数据库
  2. 通过创建 APIManager 自定义资源来安装 3scale 解决方案。按照使用 operator 部署 3scale 中的说明进行操作。

    • APIManager 自定义资源必须指定设置为您之前构建的基于 Oracle 的系统的 .spec.system.image 字段:

      apiVersion: apps.3scale.net/v1alpha1
      kind: APIManager
      metadata:
        name: example-apimanager
      spec:
        imagePullSecrets:
        - name: threescale-registry-auth
        - name: custom-registry-auth
        system:
          image: "myregistry.example.com/system-oracle:2.12.0-1"
        externalComponents:
          system:
            database: true

2.8. 常见 3scale 安装问题的故障排除

这部分包含常见安装问题列表,并为它们解决提供指导。

2.8.1. 以前的部署导致存在脏的持久性卷声明

问题

之前的部署尝试导致脏的持久性卷声明(PVC),从而导致 MySQL 容器无法启动。

原因

在 OpenShift 中删除项目不会清理与其关联的 PVC。

解决方案

流程

  1. 使用 oc get pvc 命令查找包含错误 MySQL 数据的 PVC:

    # oc get pvc
    NAME                    STATUS    VOLUME    CAPACITY   ACCESSMODES   AGE
    backend-redis-storage   Bound     vol003    100Gi      RWO,RWX       4d
    mysql-storage           Bound     vol006    100Gi      RWO,RWX       4d
    system-redis-storage    Bound     vol008    100Gi      RWO,RWX       4d
    system-storage          Bound     vol004    100Gi      RWO,RWX       4d
  2. 点 OpenShift UI 中的 cancel 部署,以停止 system-mysql 容器集的部署。
  3. 删除 MySQL 路径下的所有内容,以清理卷。
  4. 启动新的 system-mysql 部署。

2.8.2. 经过身份验证的用户 registry 的错误或缺少凭证

问题

Pod 没有启动。镜像流显示以下错误:

! error: Import failed (InternalError): ...unauthorized: Please login to the Red Hat Registry

原因

在 OpenShift 4.x 上安装 3scale 时,OpenShift 无法启动 pod,因为 ImageStreams 无法拉取它们引用的镜像。这是因为 pod 无法针对它们所指向的 registry 进行身份验证。

解决方案

流程

  1. 键入以下命令以验证容器 registry 身份验证的配置:

    $ oc get secret
    • 如果 secret 存在,您会在终端中看到以下输出:

      threescale-registry-auth          kubernetes.io/dockerconfigjson        1         4m9s
    • 但是,如果没有看到输出结果,您必须执行以下操作:
  2. 创建 registry 服务帐户时,使用之前设置的凭证来创建您的 secret。
  3. 使用在 OpenShift 中配置 registry 身份验证的步骤,替换 oc create secret 命令中的 <your-registry-service-account-username> and <your-registry-service-account-password>
  4. 在与 APIManager 资源相同的命名空间中生成 threescale-registry-auth secret。您必须在 <project-name> 中运行以下命令:

    oc project <project-name>
    oc create secret docker-registry threescale-registry-auth \
      --docker-server=registry.redhat.io \
      --docker-username="<your-registry-service-account-username>" \
      --docker-password="<your-registry-service-account-password>"
      --docker-email="<email-address>"
  5. 删除并重新创建 APIManager 资源:

    $ oc delete -f apimanager.yaml
    apimanager.apps.3scale.net "example-apimanager" deleted
    
    $ oc create -f apimanager.yaml
    apimanager.apps.3scale.net/example-apimanager created

验证

  1. 键入以下命令,以确认部署的状态为 StartingReady :pod 会开始生成:

    $ oc describe apimanager
    (...)
    Status:
      Deployments:
        Ready:
          apicast-staging
          system-memcache
          system-mysql
          system-redis
          zync
          zync-database
          zync-que
        Starting:
          apicast-production
          backend-cron
          backend-worker
          system-sidekiq
          system-sphinx
        Stopped:
          backend-listener
          backend-redis
          system-app
  2. 键入以下命令以查看每个 pod 的状态:

    $ oc get pods
    NAME                               READY   STATUS             RESTARTS   AGE
    3scale-operator-66cc6d857b-sxhgm   1/1     Running            0          17h
    apicast-production-1-deploy        1/1     Running            0          17m
    apicast-production-1-pxkqm         0/1     Pending            0          17m
    apicast-staging-1-dbwcw            1/1     Running            0          17m
    apicast-staging-1-deploy           0/1     Completed          0          17m
    backend-cron-1-deploy              1/1     Running            0          17m

2.8.3. 从 Docker registry 中拉取错误

问题

在安装过程中出现以下错误:

svc/system-redis - 1EX.AMP.LE.IP:6379
  dc/system-redis deploys docker.io/rhscl/redis-32-rhel7:3.2-5.3
    deployment #1 failed 13 minutes ago: config change

原因

OpenShift 通过发出 docker 命令来搜索和调取容器镜像。此命令引用 docker.io Docker registry,而不是 registry.redhat.io 红帽生态系统目录。

当系统包含 Docker 容器化环境的意外版本时,会出现这种情况。

解决方案

2.8.4. 在本地挂载持久性卷时 MySQL 的权限问题

问题

system-msql pod 崩溃且不部署,从而导致其他系统依赖它失败部署。pod 日志显示以下错误:

[ERROR] Cannot start server : on unix socket: Permission denied
[ERROR] Do you already have another mysqld server running on socket: /var/lib/mysql/mysql.sock ?
[ERROR] Aborting

原因

MySQL 进程启动时不正确的用户权限。

解决方案

流程

  1. 用于持久性卷的目录 MUST 具有 root 组的写入权限。对 root 用户具有读写权限不够,因为 MySQL 服务以 root 组中的不同用户身份运行。以 root 用户身份执行以下命令:

    chmod -R g+w /path/for/pvs
  2. 执行以下命令以防止 SElinux 阻止访问:

    chcon -Rt svirt_sandbox_file_t /path/for/pvs

2.8.5. 无法上传徽标或图像

问题

无法上传徽标 - system-app 日志显示以下错误:

Errno::EACCES (Permission denied @ dir_s_mkdir - /opt/system/public//system/provider-name/2

原因

OpenShift 无法写入持久卷。

解决方案

流程

确保您的持久卷可由 OpenShift 写入。它应归 root 组所有,并且可写入组。

2.8.6. 测试在 OpenShift 中无法正常工作的调用

问题

测试调用在创建新服务和 OpenShift 上的路由后无法正常工作。通过 curl 直接调用也失败,带有 service not available 信息。

原因

3scale 默认需要 HTTPS 路由,并且 OpenShift 路由不受保护。

解决方案

流程

确保 OpenShift 路由器设置中点击了 安全路由 复选框。

2.8.7. 来自 3scale 的一个不同项目上部署 APIcast 失败

问题

APIcast 部署失败(pod 没有变为蓝色)。您在日志中看到以下错误:

update acceptor rejected apicast-3: pods for deployment "apicast-3" took longer than 600 seconds to become ready

您在 pod 中看到以下错误:

Error synching pod, skipping: failed to "StartContainer" for "apicast" with RunContainerError: "GenerateRunContainerOptions: secrets \"apicast-configuration-url-secret\" not found"

原因

该机密没有正确设置。

解决方案

流程

使用 APIcast v3 创建 secret 时,指定 apicast-configuration-url-secret

oc create secret generic apicast-configuration-url-secret --from-literal=password=https://<ACCESS_TOKEN>@<TENANT_NAME>-admin.<WILDCARD_DOMAIN>

2.9. 其他资源

第 3 章 安装 APIcast

APIcast 是基于 NGINX 的 API 网关,用于将您的内部和外部 API 服务与红帽 3scale API 管理平台集成。APIcast 利用循环实现负载平衡。

在本指南中,您将了解部署选项、提供的环境以及如何入门。

先决条件

APIcast 不是独立的 API 网关。需要连接到 3scale API Manager。

要安装 APIcast,请执行以下部分中所述的步骤:

3.1. APIcast 部署选项

您可以使用托管或自我管理的 APIcast。在这两种情况下,APIcast 必须连接到 3scale API 管理平台的其余部分:

3.2. APIcast 环境

默认情况下,当您创建 3scale 帐户时,您将在两个不同的环境中获取嵌入式 APIcast:

  • Staging:仅在配置和测试 API 集成时使用。当您确认您的设置按预期工作时,您可以选择将其部署到生产环境中。OpenShift 模板设置 Staging APIcast 的参数,以便在每次 API 调用上重新载入配置(APICAST_CONFIGURATION_LOADER: lazy,APICAST_CONFIGURATION_CACHE):0).快速测试 APIcast 配置中的更改非常有用。
  • Production:此环境专用于生产环境。在 OpenShift 模板中为 Production APIcast 设置以下参数:APICAST_CONFIGURATION_LOADER: boot,APICAST_CONFIGURATION_CACHE:300.这意味着,在 APIcast 启动时将完全加载配置,并将缓存 300 秒(5 分钟)。5 分钟后将重新加载配置。这意味着,当您将配置提升到生产环境时,可能需要 5 分钟才能应用,除非您触发新的 APIcast 部署。

3.3. 配置集成设置

作为 3scale 管理员,配置运行 3scale 的环境的集成设置。

先决条件

具有管理员特权的 3scale 帐户。

流程

  1. 进入 [Your_API_name] > Integration > Settings
  2. Deployment 中,默认选项如下:

    • 部署选项:APIcast 3scale 管理
    • 身份验证模式:API 密钥。
  3. 更改到您首选的选项。
  4. 要保存您的更改,请点击 Update Product

3.4. 配置服务

您必须在 Private Base URL 字段中声明您的 API 后端,这是 API 后端的端点主机。在处理了所有身份验证、授权、速率限值和统计数据后,APIcast 将所有流量重定向到您的 API 后端。

本节将指导您配置服务:

3.4.1. 声明 API 后端

通常,您的 API 的私有基本 URL 将会像 https://api-backend.yourdomain.com:443 一样在您管理的域中(yourdomain.com)。例如,如果您与 Twitter API 集成,则私有基本 URL 为 https://api.twitter.com/

在本例中,您将使用 3scale 托管的 Echo API,它是一个简单的 API,接受任何路径并返回有关请求的信息(路径、请求参数、标头等)。其专用基础 URL 是 https://echo-api.3scale.net:443

流程

  • 测试您的私有(非受管)API 是否正常工作。例如,对于 Echo API,您可以使用 curl 命令进行以下调用:

    curl "https://echo-api.3scale.net:443"

    您将获得以下响应:

    {
        "method": "GET",
        "path": "/",
        "args": "",
        "body": "",
        "headers": {
          "HTTP_VERSION": "HTTP/1.1",
          "HTTP_HOST": "echo-api.3scale.net",
          "HTTP_ACCEPT": "*/*",
          "HTTP_USER_AGENT": "curl/7.51.0",
          "HTTP_X_FORWARDED_FOR": "2.139.235.79, 10.0.103.58",
          "HTTP_X_FORWARDED_HOST": "echo-api.3scale.net",
          "HTTP_X_FORWARDED_PORT": "443",
          "HTTP_X_FORWARDED_PROTO": "https",
          "HTTP_FORWARDED": "for=10.0.103.58;host=echo-api.3scale.net;proto=https"
        },
        "uuid": "ee626b70-e928-4cb1-a1a4-348b8e361733"
      }

3.4.2. 配置身份验证设置

您可以在 [Your_product_name] > Integration > SettingsAUTHENTICATION 部分中为 API 配置身份验证设置。

表 3.1. 可选的身份验证字段
字段描述

Auth user key

设置与凭据位置关联的用户密钥。

Credentials location

定义凭据是作为 HTTP 标头、查询参数还是 HTTP 基本身份验证传递。

Host Header

定义自定义主机请求标头。如果您的 API 后端仅接受来自特定主机的流量,则需要此设置。

Secret Token

用于阻止开发人员向 API 后端发出请求。设置此处标头的值,并确保您的后端只允许使用此机密标头调用。

另外,您可以在 [Your_product_name] > Integration > Settings 下配置 GATEWAY RESPONSE 错误代码。为错误定义 Response CodeContent-typeResponse Body:身份验证失败、缺少身份验证和不匹配。

表 3.2. 响应代码和默认响应正文
响应代码响应正文

403

身份验证失败

403

缺少身份验证参数

404

没有匹配的映射规则

429

超过用量限制

3.4.3. 配置 API 测试调用

配置 API 涉及使用产品测试后端,并将 APIcast 配置提升到暂存和生产环境,以根据请求调用进行测试。

对于每个产品,请求会根据路径重定向到对应的后端。当您将后端添加到产品时会配置这个路径。例如,如果您在某个产品中添加了两个后端,每个后端都有自己的路径。

先决条件

流程

  1. 进入到 [Your_product_name] > Integration > Configuration,将 APIcast 配置提升到 Staging。
  2. APIcast 配置 下,您将看到添加到产品的每个后端的映射规则。点 Promote v.[n] to Staging APIcast

    • v.[n] 表示要提升的版本号。
  3. 提升到暂存后,您可以将其提升为 Production。在 Staging APIcast 下,点 Promote v.[n] to Production APIcast

    • v.[n] 表示要提升的版本号。
  4. 要在命令行中测试对您的 API 的请求,请使用用于测试的curl 示例中提供的命令。

    • curl 命令示例基于产品中的第一个映射规则。

在测试对 API 的请求时,您可以通过添加方法和指标来修改映射规则

每次修改配置时,并在调用 API 之前,请确保提升到 Staging 和 Production 环境。当要提升到 Staging 环境的待处理更改时,您会在管理门户中看到一个声明标记,它位于 Integration 菜单项的旁边。

3scale Hosted APIcast 网关进行凭证验证,并应用您为 API 应用计划定义的速率限制。如果您在没有凭证的调用或具有无效凭证的调用,您会看到出错信息,Authentication failed

3.5. 在 Docker 容器化环境中部署 APIcast

这是一个分步骤指南,可在 Docker 容器引擎中部署 APIcast,它可以用作红帽 3scale API 管理 API 网关。

注意

在 Docker 容器化环境中部署 APIcast 时,受支持的 Red Hat Enterprise Linux(RHEL)和 Docker 版本如下:

  • RHEL 7.7
  • Docker 1.13.1

先决条件

要在 docker 容器化环境中部署 APIcast,请执行以下部分中所述的步骤:

3.5.1. 安装 Docker 容器化环境

本指南涵盖了在 RHEL 7.x 上设置 Docker 容器化环境的步骤。

红帽提供的 Docker 容器引擎作为 RHEL 中的 Extras 频道的一部分发布。要启用其他存储库,您可以使用 Subscription Manageryum-config-manager 选项。详情请查看 RHEL 产品文档

要在 Amazon Web Services(AWS)Amazon Elastic Compute Cloud(Amazon EC2)实例上部署 RHEL 7.x,请执行以下步骤:

流程

  1. 列出所有存储库:sudo yum repolist all.
  2. 查找 *-extras 存储库。
  3. 启用 extras 存储库:sudo yum-config-manager --enable rhui-REGION-rhel-server-extras.
  4. 安装 Docker 容器化环境软件包:sudo yum install docker

其他资源

对于其他操作系统,请参阅以下 Docker 文档:

3.5.2. 运行 Docker 容器化环境网关

重要

在 3scale 2.11 中,对作为 RHEL 7 中容器运行的 APIcast 部署的支持已弃用。在以后的发行版本中,3scale 将只支持 RHEL 8 和 Podman。如果您作为容器运行 APIcast 自我管理,请将安装升级到受支持的配置。

要运行 docker 容器化环境网关,请执行以下操作:

流程

  1. 启动 Docker 守护进程:

    sudo systemctl start docker.service
  2. 检查 Docker 守护进程是否正在运行:

    sudo systemctl status docker.service
  3. 从 Red Hat registry 下载可以使用 Docker 容器引擎镜像:

    sudo docker pull registry.redhat.io/3scale-amp2/apicast-gateway-rhel8:3scale2.12
  4. 在 Docker 容器引擎中运行 APIcast:

    sudo docker run --name apicast --rm -p 8080:8080 -e THREESCALE_PORTAL_ENDPOINT=https://<access_token>@<domain>-admin.3scale.net registry.redhat.io/3scale-amp2/apicast-gateway-rhel8:3scale2.12

    在这里,<access_token> 是 3scale 帐户管理 API 的访问令牌。您可以使用 Provider Key 而不是访问令牌。<domain>-admin.3scale.net 是 3scale 管理门户的 URL。

此命令在端口 8080 上运行名为 "apicast" 的 Docker 容器引擎,并从 3scale 管理门户获取 JSON 配置文件。有关其他配置选项,请参阅 安装 APIcast

3.5.2.1. docker 命令选项

您可以在 docker run 命令中使用以下选项:

  • --rm:容器退出时自动删除容器。
  • -d--detach:在后台运行容器并打印容器 ID。如果未指定,容器将以前台模式运行,您可以使用 CTRL + c 来停止容器。以分离模式启动时,您可以使用 docker attach 命令重新连接到容器,例如 docker attach apicast
  • -p--publish:将容器的端口发布到主机。该值的格式应为 <host port="">:<container port="">,因此 -p 80:8080 将容器的端口 8080 绑定到主机计算机的端口 80。例如,管理 API 使用端口 8090,因此您可能希望通过在 docker run 命令中添加 -p 8090:8090 来发布此端口。
  • -e--env :设置环境变量。
  • -v--volume :挂载卷。该值通常表示为 <host path="">:<container path="">[:<options>]<options> 是一个可选属性;您可以将其设置为 :ro 以指定卷是只读(默认情况下,以读写模式挂载)。示例: -v /host/path:/container/path:ro
3.5.2.2. 测试 APIcast

前面的步骤确保 Docker 容器引擎使用您自己的配置文件和 3scale registry 中的 Docker 容器镜像来运行。您可以通过 APIcast 在端口 8080 上测试调用,并提供正确的身份验证凭据,您可以从 3scale 帐户获得这些凭据。

测试调用不仅验证 APIcast 是否在正确运行,还验证身份验证和报告是否得到成功处理。

注意

确保您用于调用的主机与 Integration 页面的 Public Base URL 字段中配置的主机相同。

其他资源

3.5.3. 其他资源

3.5.4. 在 Podman 上部署 APIcast

这是在 Pod Manager(Podman)容器环境中部署 APIcast 的逐步指南,用作红帽 3scale API 管理 API 网关。

注意

在 Podman 容器环境中部署 APIcast 时,受支持的 Red Hat Enterprise Linux(RHEL)和 Podman 版本如下:

  • RHEL 8.x
  • Podman 1.4.2

先决条件

要在 Podman 容器环境中部署 APIcast,请执行以下部分中所述的步骤:

3.5.4.1. 安装 Podman 容器环境

本指南涵盖了在 RHEL 8.x 上设置 Podman 容器环境的步骤。RHEL 8.x 中不包括 Docker,因此请使用 Podman 来运行容器。

有关 RHEL 8.x 的 Podman 的详情,请参阅容器命令行参考

流程

  • 安装 Podman 容器环境软件包:

    sudo dnf install podman

其他资源

对于其他操作系统,请参阅以下 Podman 文档:

3.5.4.2. 运行 Podman 环境

要运行 Podman 容器环境,请按照以下步骤操作。

流程

  1. 从 Red Hat registry 下载就绪的 Podman 容器镜像:

    podman pull registry.redhat.io/3scale-amp2/apicast-gateway-rhel8:3scale2.12
  2. 在 Podman 中运行 APIcast:

    podman run --name apicast --rm -p 8080:8080 -e THREESCALE_PORTAL_ENDPOINT=https://<access_token>@<domain>-admin.3scale.net registry.redhat.io/3scale-amp2/apicast-gateway-rhel8:3scale2.12

    在这里,<access_token> 是 3scale 帐户管理 API 的访问令牌。您可以使用 Provider Key 而不是访问令牌。<domain>-admin.3scale.net 是 3scale 管理门户的 URL。

此命令在端口 8080 上运行名为 "apicast" 的 Podman 容器引擎,并从 3scale 管理门户获取 JSON 配置文件。有关其他配置选项,请参阅 安装 APIcast

3.5.4.2.1. 使用 Podman 测试 APIcast

上述步骤确保 Podman 容器引擎使用您自己的配置文件和 3scale registry 中的 Podman 容器镜像来运行。您可以通过 APIcast 在端口 8080 上测试调用,并提供正确的身份验证凭据,您可以从 3scale 帐户获得这些凭据。

测试调用不仅验证 APIcast 是否在正确运行,还验证身份验证和报告是否得到成功处理。

注意

确保您用于调用的主机与 Integration 页面的 Public Base URL 字段中配置的主机相同。

3.5.4.3. podman 命令选项

您可以在 podman 命令中使用以下选项示例:

  • -d :以 detached mode 运行容器并打印容器 ID。如果未指定,容器将以前台模式运行,您可以使用 CTRL + c 来停止容器。以分离模式启动时,您可以使用 podman attach 命令重新附加到容器,例如 podman attach apicast
  • ps-a :Podman ps 用于列出创建和运行容器。将 -a 添加到 ps 命令将显示所有运行和停止的容器,例如 podman ps -a
  • inspect-l :检查正在运行的容器。例如,使用 inspect 查看分配给容器的 ID。使用 -l 获取最新容器的详细信息,例如 podman inspect -l | grep Id\":
3.5.4.4. 其他资源

3.6. 使用 OpenShift 模板部署 APIcast

您可以使用 OpenShift 模板部署 APIcast API 网关。部署 APIcast API 网关可帮助您保护 API,您可以分析和监控它们的流量。

先决条件

  • 您必须根据安装 APIcast 在 Red Hat 3scale API 管理门户中配置 APIcast。
  • 确保将 自助管理的网关 选为集成设置中的部署选项。
  • 您应当已将暂存和生产环境都配置为继续操作。

流程

  1. 默认情况下,您以 developer 用户身份登录,并可继续下一步。

    否则,请从您在上一步中下载和安装的 OpenShift 客户端工具使用 oc login 命令登录 OpenShift。默认登录凭证为 username = "developer"password = "developer":

    oc login https://OPENSHIFT-SERVER-IP:8443

    您应当会在输出中看到 Login successful.

  2. 创建您的项目。本例设置显示名为 gateway

    oc new-project "3scalegateway" --display-name="gateway" --description="3scale gateway demo"

    响应应如下所示:

    Now using project "3scalegateway" on server "https://172.30.0.112:8443"

    忽略命令提示符处文本输出中的建议后续步骤,再继续下面的下一步。

  3. 通过将 <access_token><domain> 替换为您自己的凭证来创建新 secret 来引用项目。有关 <access_token><domain> 的更多信息,请参阅下方。

    oc create secret generic apicast-configuration-url-secret --from-literal=password=https://<access_token>@<admin_portal_domain>  --type=kubernetes.io/basic-auth

    这里的 <access_token> 是 3scale 帐户的 访问令牌<domain>-admin.3scale.net 是 3scale 管理门户的 URL。

    响应应如下所示:

    secret/apicast-configuration-url-secret
  4. 从模板为您的 APIcast 网关创建一个应用程序,并启动部署:

    oc new-app -f https://raw.githubusercontent.com/3scale/3scale-amp-openshift-templates/2.12.0.GA/apicast-gateway/apicast.yml

    您应该在输出的底部看到以下信息:

        --> Creating resources with label app=3scale-gateway ...
            deploymentconfig "apicast" created
            service "apicast" created
        --> Success
            Run 'oc status' to view your app.

3.7. 使用操作器部署 APIcast 网关自助管理解决方案

本指南提供了通过 Openshift Container Platform 控制台使用 APIcast operator 部署 APIcast 网关自助管理解决方案的步骤。

先决条件

流程

  1. 使用具有管理员特权的帐户登录 OCP 控制台。
  2. Operators > Installed Operators
  3. Installed Operators 列表中点 APIcast Operator
  4. APIcast > Create APIcast

3.7.1. APIcast 部署和配置选项

您可以使用两种方法部署和配置 APIcast 网关自我管理解决方案:

另请参阅:

3.7.1.1. 提供 3scale 系统端点

流程

  1. 创建一个包含 3scale 系统管理门户端点信息的 OpenShift secret:

    oc create secret generic ${SOME_SECRET_NAME} --from-literal=AdminPortalURL=${MY_3SCALE_URL}
    • ${SOME_SECRET_NAME} 是 secret 的名称,只要它与现有 secret 不冲突,可以是您想要的任何名称。
    • ${MY_3SCALE_URL} 是包含 3scale 访问令牌和 3scale 系统门户端点的 URI。如需了解更多详细信息,请参阅 THREESCALE_PORTAL_ENDPOINT

      示例

      oc create secret generic 3scaleportal --from-literal=AdminPortalURL=https://access-token@account-admin.3scale.net

      有关机密内容的更多信息,请参阅 管理门户配置 secret 参考。

  2. 为 APIcast 创建 OpenShift 对象

    apiVersion: apps.3scale.net/v1alpha1
    kind: APIcast
    metadata:
      name: example-apicast
    spec:
      adminPortalCredentialsRef:
        name: SOME_SECRET_NAME

    spec.adminPortalCredentialsRef.name 必须是包含 3scale 系统管理门户端点信息的现有 OpenShift secret 的名称。

  3. 确认与 APIcast 对象关联的 OpenShift Deployment 的 readyReplicas 字段是否为 1,以验证 APIcast 容器集正在运行并已就绪。或者,等待字段设置为:

    $ echo $(oc get deployment apicast-example-apicast -o jsonpath='{.status.readyReplicas}')
    1
3.7.1.1.1. 验证 APIcast 网关正在运行且可用

流程

  1. 确保 OpenShift Service APIcast 已公开给您的本地计算机,并执行测试请求。通过将 APIcast OpenShift Service 端口转发到 localhost:8080 来做到这一点:

    oc port-forward svc/apicast-example-apicast 8080
  2. 向配置的 3scale 服务发出请求,以验证 HTTP 响应是否成功。使用在服务的 Staging Public Base URLProduction Public Base URL 设置中配置的域名。例如:

    $ curl 127.0.0.1:8080/test -H "Host: myhost.com"
3.7.1.1.2. 通过 Kubernetes 入口公开 APIcast

要通过 Kubernetes Ingress 向外部公开 APIcast,请设置并配置 exposeHost 部分。当设置 exposeHost 部分中的 host 字段时,这会创建一个 Kubernetes Ingress 对象。然后,以前安装的和现有的 Kubernetes Ingress Controller 可以使用 Kubernetes Ingress 对象,使 APIcast 从外部访问。

要了解 Ingress Controller 可用于使 APIcast 外部访问,以及如何配置它们,请参阅 Kubernetes Ingress Controller 文档

以下示例使用主机名 myhostname.com 公开 APIcast:

apiVersion: apps.3scale.net/v1alpha1
kind: APIcast
metadata:
  name: example-apicast
spec:
  ...
  exposedHost:
    host: "myhostname.com"
  ...

这个示例使用 HTTP 在端口 80 上创建一个 Kubernetes Ingress 对象。当 APIcast 部署位于 OpenShift 环境中时,OpenShift 默认 Ingress Controller 将使用 Ingress 对象 APIcast 创建 Route 对象,以允许从外部访问 APIcast 安装。

您也可以为 exposeHost 部分配置 TLS。下表中可用字段的详情:

表 3.3. APIcastExposedHost 参考表
json/yaml 项类型必需默认值描述

主机

字符串

N/A

路由到网关的域名

tls

[]extensions.IngressTLS

N/A

ingress TLS 对象的数组。请参阅 TLS 的更多信息。

3.7.1.2. 提供配置 secret

流程

  1. 使用配置文件创建 secret:

    $ curl https://raw.githubusercontent.com/3scale/APIcast/master/examples/configuration/echo.json -o $PWD/config.json
    
    oc create secret generic apicast-echo-api-conf-secret --from-file=$PWD/config.json

    配置文件必须名为 config.json。这是一个 APIcast CRD 引用 要求。

    有关机密内容的更多信息,请参阅 管理门户配置 secret 参考。

  2. 创建 APIcast 自定义资源

    $ cat my-echo-apicast.yaml
    apiVersion: apps.3scale.net/v1alpha1
    kind: APIcast
    metadata:
      name: my-echo-apicast
    spec:
      exposedHost:
        host: YOUR DOMAIN
      embeddedConfigurationSecretRef:
        name: apicast-echo-api-conf-secret
    
    $ oc apply -f my-echo-apicast.yaml
    1. 以下是嵌入式配置 secret 的示例:

      apiVersion: v1
      kind: Secret
      metadata:
        name: SOME_SECRET_NAME
      type: Opaque
      stringData:
        config.json: |
          {
            "services": [
              {
                "proxy": {
                  "policy_chain": [
                    { "name": "apicast.policy.upstream",
                      "configuration": {
                        "rules": [{
                          "regex": "/",
                          "url": "http://echo-api.3scale.net"
                        }]
                      }
                    }
                  ]
                }
              }
            ]
          }
  3. 在创建 APIcast 对象时设置以下内容:

    apiVersion: apps.3scale.net/v1alpha1
    kind: APIcast
    metadata:
      name: example-apicast
    spec:
      embeddedConfigurationSecretRef:
        name: SOME_SECRET_NAME

    spec.embeddedConfigurationSecretRef.name 必须是包含网关配置的现有 OpenShift secret 的名称。

  4. 确认与 APIcast 对象关联的 OpenShift Deployment 的 readyReplicas 字段是否为 1,以验证 APIcast 容器集正在运行并已就绪。或者,等待字段设置为:

    $ echo $(oc get deployment apicast-example-apicast -o jsonpath='{.status.readyReplicas}')
    1
3.7.1.2.1. 验证 APIcast 网关正在运行且可用

流程

  1. 确保 OpenShift Service APIcast 已公开给您的本地计算机,并执行测试请求。通过将 APIcast OpenShift Service 端口转发到 localhost:8080 来做到这一点:

    oc port-forward svc/apicast-example-apicast 8080
  2. 向配置的 3scale 服务发出请求,以验证 HTTP 响应是否成功。使用在服务的 Staging Public Base URLProduction Public Base URL 设置中配置的域名。例如:

    $  curl 127.0.0.1:8080/test -H "Host: localhost"
    {
      "method": "GET",
      "path": "/test",
      "args": "",
      "body": "",
      "headers": {
        "HTTP_VERSION": "HTTP/1.1",
        "HTTP_HOST": "echo-api.3scale.net",
        "HTTP_ACCEPT": "*/*",
        "HTTP_USER_AGENT": "curl/7.65.3",
        "HTTP_X_REAL_IP": "127.0.0.1",
        "HTTP_X_FORWARDED_FOR": ...
        "HTTP_X_FORWARDED_HOST": "echo-api.3scale.net",
        "HTTP_X_FORWARDED_PORT": "80",
        "HTTP_X_FORWARDED_PROTO": "http",
        "HTTP_FORWARDED": "for=10.0.101.216;host=echo-api.3scale.net;proto=http"
      },
      "uuid": "603ba118-8f2e-4991-98c0-a9edd061f0f0"
3.7.1.3. 使用 APIcast operator 注入自定义虚拟环境

在使用自我管理的 APIcast 的 3scale 安装中,您可以使用 APIcast operator 注入自定义环境。自定义环境定义 APIcast 适用于网关服务的所有上游 API 的行为。要创建自定义环境,请在 Lua 代码中定义全局配置。

您可以注入自定义环境,作为 APIcast 安装的一部分或安装后。在注入自定义环境后,您可以将其删除,APIcast operator 会协调更改。

先决条件

  • 已安装 APIcast operator。

流程

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

    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. 定义一个 APIcast 自定义资源,用于引用您刚才创建的 secret。以下示例显示了相对于引用定义自定义环境的 secret 的内容。

    apiVersion: apps.3scale.net/v1alpha1
    kind: APIcast
    metadata:
      name: apicast1
    spec:
      customEnvironments:
        - secretRef:
            name: custom-env-1

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

  4. 创建 APIcast 自定义资源来添加自定义虚拟环境。例如,如果您在 apicast.yaml 文件中保存 APIcast 自定义资源,请运行以下命令:

    oc apply -f apicast.yaml

后续步骤

如果更新您的自定义环境,请确保重新创建其 secret,以便 secret 包含更新。APIcast operator 会监视是否有更新,并在找到更新时自动重新部署。

3.7.1.4. 使用 APIcast operator 注入自定义策略

在使用自助管理的 APIcast 的 3scale 安装中,您可以使用 APIcast operator 注入自定义策略。注入自定义策略会将策略代码添加到 APIcast。然后,您可以使用以下任一策略将自定义策略添加到 API 产品策略链中:

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

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

您可以注入自定义策略,作为 APIcast 安装的一部分或之后。注入自定义策略后,您可以将其删除,并且 APIcast 运算符协调更改。

先决条件

  • APIcast operator 已安装,或正在安装它。
  • 您已定义一个自定义策略,如写您自己的策略中所述。即,已创建了定义自定义策略的 my-first-custom-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. 定义一个 APIcast 自定义资源,用于引用您刚才创建的 secret。以下示例显示有关引用定义自定义策略的 secret 的内容。

    apiVersion: apps.3scale.net/v1alpha1
    kind: APIcast
    metadata:
      name: apicast1
    spec:
      customPolicies:
        - name: my-first-custom-policy
          version: "0.1"
          secretRef:
            name: my-first-custom-policy-secret

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

  3. 创建 APIcast 自定义资源,以添加自定义策略。例如,如果您在 apicast.yaml 文件中保存 APIcast 自定义资源,请运行以下命令:

    oc apply -f apicast.yaml

后续步骤

如果更新自定义策略,请确保重新创建其 secret,以便 secret 包含更新。APIcast operator 会监视是否有更新,并在找到更新时自动重新部署。

3.7.1.5. 使用 APIcast operator 配置 OpenTracing

在使用自助管理的 APIcast 的 3scale 安装中,您可以使用 APIcast operator 来配置 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 secret generic myjaeger --from-file myjaeger.yaml
  3. 定义一个 APIcast 自定义资源,指定 OpenTracing 属性。在 CR 定义中,将 spec.tracingConfigSecretRef.name 属性设置为包含您的 OpenTracing 配置详情的 secret 的名称。下例仅显示了与配置 OpenTracing 相关的内容。

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

    oc apply -f apicast1.yaml

后续步骤

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

3.8. 其他资源

要获取有关最新发布的及受支持 APIcast 版本的信息,请参阅文章:

第 4 章 在 OpenShift 上安装 3scale Operator

注意

3scale 支持 OpenShift Container Platform(OCP)的最后两个通用版本(GA)。如需更多信息,请参阅 Red Hat 3scale API 管理支持的配置 页面。

本文档演示了如何:

  • 创建新项目。
  • 部署红帽 3scale API 管理实例。
  • 通过 Operator Lifecycle Manager(OLM)安装 3scale Operator。
  • 部署 Operator 后,部署自定义资源。

先决条件

  • 使用具有管理员权限的帐户访问受支持的 OpenShift Container Platform 4 集群版本。

警告

在另一个新创建的空项目中部署 3scale 操作器和自定义资源定义(CRD)。如果您将其部署到包含基础架构的现有项目中,则可能会更改或删除现有的元素。

要在 OpenShift 上安装 3scale 操作器,请执行以下部分中所述的步骤:

4.1. 创建新的 OpenShift 项目

此流程说明了如何创建名为 3scale-project 的新 OpenShift 项目。将此项目名称替换为您自己的项目名称。

流程

要创建新 OpenShift 项目,请执行以下操作:

  • 使用字母数字字符和短划线表示有效的名称。例如,运行以下命令来创建 3scale-project

    oc new-project 3scale-project

这会创建新的 OpenShift 项目,其中将安装 operator、APIManager 自定义资源(CR)和 Capabilities 自定义资源。Operator 通过该项目中的 OLM 管理自定义资源。

4.2. 使用 OLM 安装和配置 3scale Operator

使用 Operator Lifecycle Manager(OLM)通过 OCP 控制台中的 OperatorHub 在 OpenShift Container Platform(OCP)4.6 集群上安装 3scale 操作器。您可以使用以下安装模式安装 3scale Operator:

  • 集群范围内的 Operator 在集群中的所有命名空间中可用。
  • 集群中的特定命名空间
注意

如果您在受限网络或断开连接的集群中使用 OpenShift Container Platform,Operator Lifecycle Manager 将不再使用 OperatorHub。按照在 受限网络中标题为"使用 Operator Lifecycle Manager"的指南中设置和使用 OLM 的说明

流程

  1. 在 OpenShift Container Platform 控制台中,使用具有管理员特权的帐户登录。

    注意

    菜单结构取决于您使用的 OpenShift 版本:

  2. Operators > OperatorHub
  3. Filter by keyword 框中,键入 3scale operator 来查找 3scale 运算符。
  4. 点 3scale operator。这时会显示 Operator 信息。
  5. 阅读有关 Operator 的信息,再点 Install。此时会打开 Install Operator 页面。
  6. Install Operator 页面中,在 Update channel 部分选择要更新的频道。
  7. Installation mode 部分中,选择安装 Operator 的位置。

    1. All namespaces on the cluster(default) - operator 在集群的所有命名空间中可用。
    2. A specific namespace on the cluster - operator 只能在您选择的集群的特定单一命名空间中可用。
  8. Subscribe.3scale operator 详情页面会显示,您可以查看 Subscription Overview
  9. 确认订阅升级状态显示为 Up to date
  10. 验证 3scale Operator ClusterServiceVersion(CSV)是否已显示,Operator 的 Status 最终会在您在 创建新 OpenShift 项目中定义的项目中 解析为 InstallSucceeded

    • Operators > Installed Operators。在这种情况下,成功安装将注册 APIManager CRD,以及与 OpenShift API 服务器 中 Operator Capabilities 功能相关的 CRD。
  11. 成功安装后,通过 oc get 查询 CRD 定义的资源类型。

    1. 例如,要验证 APIManager CRD 是否已正确注册,请执行以下命令:

      oc get apimanagers
  12. 您应该看到以下输出:

    No resources found.

除了指定的步骤外,在受限网络中使用 OCP 时,创建一个在 3scale 开发人员门户中使用的允许域的列表。请考虑以下示例:

  • 您打算添加到开发人员门户的任何链接。
  • 通过第三方 SSO 提供程序(如 GitHub)进行 SSO 集成.
  • 计费。
  • 触发外部 URL 的 Webhook。

4.2.1. 在断开连接的环境中的限制

以下列表概述了 3scale 2.12 在断开连接的环境中的当前限制:

  • GitHub 登录 Developer Portal 不可用。
  • 支持链接不可用。
  • 到外部文档的链接无法正常运行。
  • Developer Portal 中的 OpenAPI 规范(OAS)验证器不正常运行,会影响外部服务的链接。
  • ActiveDocs 的产品 概述 页面中,到 OAS 的链接不起作用。

    • 在创建新的 ActiveDocs 规格时,还需要检查 Skip swagger 验证选项。

其他资源

4.3. 使用 OLM 升级 3scale Operator

要将 3scale Operator 从单一命名空间升级到基于 Operator 部署的所有命名空间中集群范围的安装,您必须从命名空间中删除 3scale Operator,然后在集群中重新安装 Operator。

集群管理员可以使用 Web 控制台从所选命名空间中删除已安装的 Operator。卸载 Operator 不会卸载现有的 3scale 实例。

从命名空间中卸载 3scale Operator 后,您可以使用 OLM 在集群范围模式下安装 Operator。

先决条件

  • 3scale 管理员权限或具有命名空间删除权限的 OpenShift 角色。

流程

  1. 在 OpenShift Container Platform 控制台中,使用具有管理员特权的帐户登录。

    注意

    菜单结构取决于您使用的 OpenShift 版本:

  2. Operators > OperatorHub。此时会显示安装的 Operator 页面。
  3. Filter by name 中输入 3scale 来找到 Operator 并点它。
  4. Operator Details 页面中,从 Actions 下拉菜单中选择 Uninstall Operator,将其从特定命名空间中删除。
  5. 此时会显示 Uninstall Operator? 对话框,提醒您:

    Removing the operator will not remove any of its custom resource definitions or managed resources. If your operator has deployed applications on the cluster or configured off-cluster resources, these will continue to run and need to be cleaned up manually.
    This action removes the operator as well as the Operator deployments and pods, if any. Any operands and resources managed by the operator, including CRDs and CRs, are not removed. The web console enables dashboards and navigation items for some operators. To remove these after uninstalling the operator, you might need to manually delete the operator CRDs.
  6. 选择 Uninstall。此 operator 会停止运行,并且不再接收更新。
  7. 在 OpenShift Container Platform 控制台中点 Operators > OperatorHub
  8. Filter by keyword 框中,键入 3scale operator 来查找 3scale 运算符。
  9. 点 3scale operator。这时会显示 Operator 信息。
  10. Install。此时会打开 Install Operator 页面。
  11. Install Operator 页面中,在 Update channel 部分选择要更新的频道。
  12. Installation mode 部分中,选择 All namespaces on the cluster(default)。Operator 将在集群中的所有命名空间中可用。
  13. Subscribe.3scale operator 详情页面会显示,您可以查看 Subscription Overview
  14. 确认订阅升级状态显示为 Up to date
  15. 验证是否显示了 3scale operator ClusterServiceVersion(CSV)。

其它资源

第 5 章 在 OpenShift 上安装 APIcast operator

本指南提供通过 OpenShift Container Platform(OCP)控制台安装 APIcast Operator 的步骤。

流程

  1. 使用具有管理员特权的帐户登录 OCP 控制台。
  2. Projects > Create Project 中创建新项目 operator-test
  3. Operators > Installed Operators
  4. Filter by keyword 框中键入 apicast 以查找 APIcast operator。不要使用社区版本。
  5. 单击 APIcast 操作器。您将看到有关 APIcast 操作器的信息。
  6. InstallCreate Operator Subscription 页面会打开。
  7. Subscribe 接受 Create Operator Subscription 页面中的所有默认选择。

    1. 订阅升级状态 显示为最新
  8. Operators > Installed Operators 来验证 APIcast operator ClusterServiceVersion (CSV)状态是否在 operator-test 项目中显示为 InstallSucceeded

第 6 章 3scale 高可用性和评估模板

本文档描述了红帽 3scale API 管理 2.12 安装所使用的高可用性评估模板。

先决条件

  • 您需要有一个可用的 OpenShift 集群来部署高可用性和评估模板的元素。
重要

3scale 高可用性和评估模板只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

要部署高可用性和评估模板,请执行以下部分中所述的步骤:

6.1. 高可用性模板

High Availability(HA)模板允许您为关键数据库设置 HA。

先决条件

  • 在部署 HA 模板之前,您必须部署和配置外部数据库,并使用负载均衡端点在 HA 配置中配置它们。

使用 HA 模板

对于 HA,名为 amp-ha-tech-preview.yml 的模板允许您将关键数据库部署到 OpenShift 外部。这不包括:

  • Memcached
  • Sphinx
  • Zync

标准 amp.yml 模板和 amp-ha-tech-preview.yml 之间的区别包括:

  • 删除以下元素:

    • backend-redis 及其相关组件
    • system-redis 及其相关组件
    • system-mysql 及其相关组件
    • redis 和 MySQL 相关 ConfigMap
    • MYSQL_IMAGE, REDIS_IMAGE, MYSQL_USER, MYSQL_ROOT_PASSWORD 参数
  • 默认情况下,将非数据库 DeploymentConfig 对象类型的副本数从 1 增加到 2。
  • 添加以下强制参数,以便您控制外部数据库的位置:

    • BACKEND_REDIS_STORAGE_ENDPOINT
    • BACKEND_REDIS_QUEUES_ENDPOINT
    • SYSTEM_REDIS_URL
    • APICAST_STAGING_REDIS_URL
    • APICAST_PRODUCTION_REDIS_URL
    • SYSTEM_DATABASE_URL

使用 amp-ha-tech-preview.yml,您需要通过新增的强制参数从集群中配置数据库连接(不包括 system-memcachezync-databasesystem-sphinx )。端点需要数据库负载均衡的连接字符串,包括身份验证信息。另外,对于非数据库部署,pod 副本数默认增加到 2,以在应用级别具有冗余性。

6.1.1. 为高可用性设置 RWX_STORAGE_CLASS

ReadWriteMany(RWX) PersistentVolumeClaims(PVC)使用存储类 RWX_STORAGE_CLASS。

必需 :false

null

  • 将此设置为 null 会向 OpenShift 发出信号,指出您希望该存储类自动发现(无值)。
  • 如果将其设置为空字符串或没有默认值,它会向 OpenShift 发送信号,表示您希望字符串存储为空。这是无效的设置。

6.2. 评估模板

出于评估目的,有一个名为 amp-eval-tech-preview.yml 的模板,模板可在无资源请求或限制的情况下部署 3scale 环境。

与 standard amp.yml 模板相比,唯一功能区别在于已删除资源限制和请求。这意味着,在此版本中,CPU 和内存级别的 pod 上已删除了最低硬件要求。此模板仅用于评估、测试和开发目的,因为它尝试使用给定的硬件资源以最佳的方式部署组件。

第 7 章 对 3scale 的 redis 高可用性(HA)支持

重要

红帽官方不支持为零停机时间设置 Redis、为 3scale 配置后端组件或 Redis 数据库复制和分片。其内容仅供参考。另外,3scale 不支持 Redis 集群模式

OpenShift 容器平台(OCP)为大多数组件提供高可用性(HA)。如需更多信息,请参阅 OpenShift Container Platform 3.11 第 30 章。高可用性

红帽 3scale API 管理中的 HA 数据库组件包括:

  • backend-redis :用于统计存储和临时作业存储。
  • system-redis :为 3scale 的后台作业提供临时存储,也用作 system-app pod 的 Ruby 处理的消息总线。

backend-redissystem-dis 都可以与 Redis Sentinel 和 Redis Enterprise 支持的 Redis 高可用性变体一起工作。

如果 Redis pod 进入停止状态,或者 OpenShift Container Platform 停止它,则会自动创建新的 pod。持久存储将恢复数据,以便 pod 继续工作。在这些情况下,新容器集启动时会出现少量停机时间。这是因为 Redis 中不支持多主设置的限制。您可以通过在已部署 Redis 的所有节点上预安装 Redis 镜像来缩短停机时间。这将加快 pod 重启时间。

为零停机时间设置 Redis,并为 3scale 配置后端组件:

先决条件

  • 具有管理员角色的 3scale 帐户。

7.1. 为零停机时间设置 Redis

以 3scale 管理员身份,如果您不需要停机,请在 OCP 外部配置 Redis。使用 3scale pod 的配置选项进行设置的方法有几种:

  • 设置您自己的自助管理的 Redis
  • 使用 Redis Sentinel:参考 Redis Sentinel 文档
  • redis 作为服务提供:

    例如:

    • Amazon ElastiCache
    • redis Labs
注意

红帽不支持上述服务。提及任何此类服务并不意味着红帽认可这些产品或服务。您同意,由于您使用(或依赖)任何外部内容而可能导致的任何损失或费用,红帽不承担任何责任。

7.2. 为 3scale 配置后端组件

作为 3scale 管理员,在以下部署配置中为 后端组件环境变量配置 Redis HA(failover):backend-cronbackend-listenerbackend-worker。这些配置是 3scale 中红帽 HA 所必需的。

注意

如果要将 Redis 与 sentinels 搭配使用,您必须在 backend-redissystem-redis 或两个 secret 中提供 sentinel 配置。

7.2.1. 创建 backend-redissystem-redis secret

按照以下步骤相应地创建 backend-redissystem-redis secret:

7.2.2. 为 HA 部署 3scale 的新安装

流程

  1. 使用以下字段创建 backend-redissystem-redis secret:

    backend-redis

    REDIS_QUEUES_SENTINEL_HOSTS
    REDIS_QUEUES_SENTINEL_ROLE
    REDIS_QUEUES_URL
    REDIS_STORAGE_SENTINEL_HOSTS
    REDIS_STORAGE_SENTINEL_ROLE
    REDIS_STORAGE_URL

    system-redis

    NAMESPACE
    SENTINEL_HOSTS
    SENTINEL_ROLE
    URL

    • 当使用 sendinels 为 Redis 配置时,backend-redissystem-redis 中的对应 URL 字段以 redis://[:redis-password@]redis-group[/db] 格式引用 Redis 组,其中 [x] 表示可选元素 xredis-passwordredis-groupdb 是变量:

      示例

      redis://:redispwd@mymaster/5

    • SENTINEL_HOSTS 字段采用以下格式以逗号分隔:

      redis://:sentinel-password@sentinel-hostname-or-ip:port
      • 对于列表的每个元素,[x] 表示可选元素 xsendinel-passwordfinel-hostname-or-ipport 是相应地替换的变量:

        示例

        :sentinelpwd@123.45.67.009:2711,:sentinelpwd@other-sentinel:2722

    • SENTINEL_ROLE 字段为 masterslave 字段。
  2. 按照使用 operator 部署 3scale 中的内容部署 3scale。

    1. 忽略因为 backend-redis system-redis 已存在的错误。

7.2.3. 将 3scale 的非 HA 部署迁移到 HA

  1. 使用所有字段编辑 backend-redissystem-redis secret,如 部署 3scale 为 HA 所示。
  2. 确保为后端容器集定义了以下 backend-redis 环境变量。

    name: BACKEND_REDIS_SENTINEL_HOSTS
      valueFrom:
        secretKeyRef:
          key: REDIS_STORAGE_SENTINEL_HOSTS
          name: backend-redis
    name: BACKEND_REDIS_SENTINEL_ROLE
      valueFrom:
        secretKeyRef:
          key: REDIS_STORAGE_SENTINEL_ROLE
          name: backend-redis
  3. 确保为 system-(app|sidekiq|sphinx) pod 定义了以下 system-redis 环境变量。

    name: REDIS_SENTINEL_HOSTS
      valueFrom:
        secretKeyRef:
          key: SENTINEL_HOSTS
          name: system-redis
    name: REDIS_SENTINEL_ROLE
      valueFrom:
        secretKeyRef:
          key: SENTINEL_ROLE
          name: system-redis
  4. 继续执行说明以使用模板升级 3scale
7.2.3.1. 使用 Redis Enterprise
  1. 在 OpenShift 中使用 Redis Enterprise,具有三个不同的 redis-enterprise 实例:

    1. 编辑 system-redis secret:

      1. system-redis 中的系统 redis 数据库设置为 URL
    2. backend-redis 中的后端数据库设置为 REDIS_QUEUES_URL
    3. 将第三个数据库设置为 backend-redisREDIS_STORAGE_URL
7.2.3.2. 使用 Redis Sentinel
注意

您可以选择将 Redis Sentinels 应用到任何数据库。但是,红帽建议将 Redis Sentinels 应用到所有系统以实现 HA。

  1. 用于统计信息的后端 redis:更新 backend-redis secret 并为其提供值:

    • REDIS_STORAGE_URL
    • REDIS_STORAGE_SENTINEL_ROLE
    • REDIS_STORAGE_SENTINEL_HOSTS

      REDis_STORAGE_SENTINEL_ROLE 设置为一个以逗号分隔的主机和端口列表,例如: :sentinelpwd@123.45.67.009:2711,:sentelpwd@other-sentinel:2722

  2. 用于队列的后端 redis:更新 backend-redis secret 并为其提供值:

    • REDIS_QUEUES_URL
    • REDIS_QUEUES_SENTINEL_ROLE
    • REDIS_QUEUES_SENTINEL_HOSTS

      REDIS_QUEUES_SENTINEL_ROLE 设置为一个以逗号分隔的主机和端口列表,例如: :sentinelpwd@123.45.67.009:2711,:sentelpwd@other-sentinel:2722

  3. 使用 Redis 数据库的 Redis Sentinel:
  4. 用于数据的 redis:更新 system-redis secret 并为其提供值:

    注意

    编辑 system-redis secret:URL

    • SENTINEL_ROLE
    • NAMESPACE
    • URL
    • SENTINEL_HOSTS

      SENTINEL_HOSTS 设置为以逗号分隔的主机和端口列表,例如: :sentinelpwd@123.45.67.009:2711,:sentinelpwd@other-sentinel:2722

备注

  • system-appsystem-sidekiq 组件直接连接到 后端 Redis 以检索统计信息。

    • 从 3scale 2.7 开始,使用发送时这些系统组件也可以连接到 后端 Redis(存储)。
  • system-appsystem-sidekiq 组件 仅使用 backend-redis 存储,而不使用 backend-redis 队列。

    • 对系统组件所做的更改支持带有 sendinels 的 backend-redis 存储。

7.3. 重新删除数据库分片和复制

分片有时称为分区,可将大型数据库隔离为称为分片的较小数据库。通过复制,您的数据库使用托管在独立计算机上的同一数据集的副本进行设置。

分片

分片有助于添加更多领导实例,当您有如此多的数据并不适用于单个数据库中,或者 CPU 负载接近 100% 时,这也会很有用。

使用 Red Hat is HA for 3scale 时,以下两个原因是分片非常重要的原因:

  • 拆分和扩展大量数据,并调整特定索引的分片数量,以帮助避免瓶颈。
  • 跨不同节点分布操作,因此可以提高性能,例如当多台机器处理同一个查询时。

禁用集群模式的 Redis 数据库分片的三个主要解决方案是:

  • Amazon ElastiCache
  • 通过 Redis 发送的标准 Redis
  • redis Enterprise

复制

redis 数据库复制通过在不同机器之间复制您的数据集来确保冗余性。通过利用复制功能,您可以在领导机停机时让 Redis 保持工作。然后,从单个实例(领导)中拉取数据,以确保高可用性。

通过适用于 3scale 的 HA,数据库复制可确保主分片的高可用性副本。操作原则包括:

  • 当主分片失败时,副本分片将自动提升到新的主分片。
  • 恢复原始主分片后,它会自动成为新主分片的副本分片。

Redis 数据库复制的三个主要解决方案是:

  • redis Enterprise
  • Amazon ElastiCache
  • 通过 Redis 发送的标准 Redis

使用 twemproxy 进行分片

对于 Amazon ElastiCache 和 Standard Redis,分片涉及基于密钥分割数据。您需要给定特定密钥的代理组件知道要查找的分片,如 twemproxytwemproxy 也称为 nutcracker,它是一个适用于 Redis 协议的轻量级代理解决方案,它根据特定的密钥或服务器映射找到分配给它们的分片。使用 twemproxy 在 Amazon ElastiCache 或 Standard Redis 实例中添加分片功能具有以下优点:

  • 在多个服务器间自动分片数据的功能。
  • 支持多种哈希模式,支持一致的散列和发行版。
  • 在多个实例中运行的能力,允许客户端连接到第一个可用的代理服务器。
  • 减少与后端上缓存名称服务器的连接数量。
注意

redis Enterprise 使用自己的代理,因此不需要 twemproxy

其他资源

7.4. 附加信息

第 8 章 配置外部 MySQL 数据库

本指南提供有关将 MySQL 数据库外部化 第 6 章 3scale 高可用性和评估模板 的信息。这可以通过使用默认 amp.yml 文件来完成。当使用默认的 system-mysql 容器集存在多个基础架构问题(如网络或文件系统)时,这非常有用。

这种方法和 第 6 章 3scale 高可用性和评估模板 中的区别在于,如果 Red Hat 3scale API 管理最初使用默认 amp.yml 模板,这为外部化 MySQL 数据库提供了一种方法。

注意

红帽支持使用外部 MySQL 数据库的 3scale 配置。但是,数据库本身不在支持范围之内。

先决条件

要为高可用性(HA)配置外部 MySQL 数据库,请执行以下部分中所述的步骤:

8.1. 外部 MySQL 数据库限制

外部化 MySQL 数据库的过程存在一些限制:

3scale 内部内部版本

它仅在 3scale 的 2.5 个内部版本和 2.6 内部部署版本中进行测试并验证。

MySQL 数据库用户

URL 必须为以下格式:

<database_scheme>://<admin_user>:<admin_password>@<database_host>/<database_name>

<admin_user> 必须是外部数据库中的现有用户,具有 <database_name> 逻辑数据库的完整权限。<database_name> 必须是外部数据库中已存在的逻辑数据库。

MySQL 主机

使用来自外部 MySQL 数据库的 IP 地址,而不是 主机名,否则不会解析。例如,使用 1.1.1.1 而不是 mysql.mydomain.com

8.2. 外部化 MySQL 数据库

使用以下步骤,将 MySQL 数据库完全外部化。

警告

这将在进程持续期间导致环境中的停机。

流程

  1. 登录到托管 3scale On-premises 实例的 OpenShift 节点,并更改到其项目:

    oc login -u <user> <url>
    oc project <3scale-project>

    <user><url><3scale-project> 替换为您自己的凭证和项目名称。

  2. 按照下方的步骤,按照所示的顺序缩减所有 pod。这将避免丢失数据。

    停止 3scale 内部部署

    从 OpenShift Web 控制台或命令行界面(CLI),按以下顺序将所有部署配置缩减为零副本:

    • apicast-wildcard-routerzync 适用于 3scale 2.6 之前的版本,zync-quezync 适用于 3scale 2.6 和以上版本。
    • apicast-stagingapicast-production
    • system-sidekiqbackend-cronsystem-sphinx.

      • 3scale 2.3 包括 system-resque
    • system-app
    • backend-listenerbackend-worker
    • backend-redissystem-memcachesystem-mysqlsystem-rediszync-database.

      以下示例演示了如何在 CLI 中为 apicast-wildcard-routerzync 执行此操作 :

      oc scale dc/apicast-wildcard-router --replicas=0
      oc scale dc/zync --replicas=0
      注意

      可以同时缩减每个步骤的部署配置。例如,您可以将 apicast-wildcard-routerzync 一起缩减。但是,最好等待每个步骤中的 pod 终止,然后再缩减后续 pod。3scale 实例将完全无法访问,直到它被完全启动。

  3. 要确认 3scale 项目上没有运行任何 pod,请使用以下命令:

    oc get pod

    命令应返回 No resources found

  4. 使用以下命令再次扩展数据库级别的 pod:

    oc scale dc/{backend-redis,system-memcache,system-mysql,system-redis,zync-database} --replicas=1
  5. 确保您可以通过 system-mysql pod 登录外部 MySQL 数据库,然后继续后续步骤:

    oc rsh system-mysql-<system_mysql_pod_id>
    mysql -u root -p -h <host>
    • <system_mysql_pod_id>:system-mysql 容器集的标识符。
    • 用户应当始终为 root。如需更多信息,请参阅 外部 MySQL 数据库限制

      1. CLI 现在将显示 mysql>。键入 exit,然后按 返回。在下一提示中再次键入 exit 以 返回到 OpenShift 节点控制台。
  6. 使用以下命令执行完整的 MySQL 转储:

    oc rsh system-mysql-<system_mysql_pod_id> /bin/bash -c "mysqldump -u root --single-transaction --routines --triggers --all-databases" > system-mysql-dump.sql
    • <system_mysql_pod_id> 替换为您唯一的 system-mysql pod ID
    • 验证 system-mysql-dump.sql 是否包含有效的 MySQL 级别转储,如下例所示:

      $ head -n 10 system-mysql-dump.sql
      -- MySQL dump 10.13  Distrib 8.0, for Linux (x86_64)
      --
      -- Host: localhost    Database:
      -- ------------------------------------------------------
      -- Server version   8.0
      
      /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
      /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
      /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
      /*!40101 SET NAMES utf8 */;
  7. 缩减 system-mysql pod,并保留为 0(零)副本:

    oc scale dc/system-mysql --replicas=0
  8. 查找与 URL mysql2://root:<password>@<host>/system 等效的 base64,相应地替换 <password><host>

    echo "mysql2://root:<password>@<host>/system" | base64
  9. 在远程 MySQL 数据库上创建默认的 'user'@'%'。它只需要具有 SELECT 特权。找到它的 base64 对等信息:

    echo "user" | base64
    echo "<password>" | base64
    • 将 <password> 替换为 'user'@'%' 的密码。
  10. 执行备份并编辑 OpenShift secret system-database

    oc get secret system-database -o yaml > system-database-orig.bkp.yml
    oc edit secret system-database
    • URL :使用 [step-8] 中的值替换它。
    • DB_USERDB_PASSWORD :将上一步中的值用于这两者。
  11. system-mysql-dump.sql 发送到远程数据库服务器,并将转储导入到其中。使用命令导入它:
  12. 使用以下命令将 system-mysql-dump.sql 发送到远程数据库服务器,并将转储导入到服务器:

    mysql -u root -p < system-mysql-dump.sql
  13. 确保创建了名为 system 的新数据库:

    mysql -u root -p -se "SHOW DATABASES"
  14. 使用以下说明启动 3scale 内部部署,以正确顺序扩展所有 pod。

    启动 3scale 内部部署

    • backend-redissystem-memcachesystem-mysqlsystem-rediszync-database.
    • backend-listenerbackend-worker
    • system-app
    • system-sidekiqbackend-cronsystem-sphinx

      • 3scale 2.3 包括 system-resque
    • apicast-stagingapicast-production
    • apicast-wildcard-routerzync 适用于 3scale 2.6 之前的版本,zync-quezync 适用于 3scale 2.6 和以上版本。

      以下示例演示了如何在 CLI 中为 backend-redissystem-memcachesystem-mysqlsystem-rediszync-database 执行此操作 :

      oc scale dc/backend-redis --replicas=1
      oc scale dc/system-memcache --replicas=1
      oc scale dc/system-mysql --replicas=1
      oc scale dc/system-redis --replicas=1
      oc scale dc/zync-database --replicas=1

      system-app pod 现在应该已启动并运行,且没有任何问题。

  15. 验证后,按照所示的顺序扩展其他容器集。
  16. 备份 system-mysql DeploymentConfig 对象。您可以在几分钟后删除所有内容,确定一切运行正常。如果将来再次执行此步骤,删除 system-mysql DeploymentConfig 可避免以后出现混淆。

8.3. 回滚

如果 system-app pod 没有完全在线,并且其根本原因在第 14 步 后无法决定或解决,请执行回滚步骤。

  1. 使用来自 system-database-orig.bkp.yml 的原始值编辑 system-database。请参阅 [step-10]:

    oc edit secret system-database

    URLDB_USERDB_PASSWORD 替换为其原始值。

  2. 缩减所有容器集,然后再次向上扩展,包括 system-mysqlsystem-app pod 和在启动后启动的其他 pod 应启动并再次运行。运行以下命令确认所有 pod 都已备份并正在运行:

    oc get pods -n <3scale-project>

8.4. 附加信息

法律通告

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.