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

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

2.9.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.9.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 > 和 <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.9.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.9.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.9.5. 无法上传徽标或图像

问题

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

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

原因

OpenShift 无法写入持久卷。

解决方案

流程

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

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

问题

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

原因

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

解决方案

流程

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

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