2.7. 常见 3scale 安装问题的故障排除
这部分包含常见安装问题列表,并为它们解决提供指导。
2.7.1. 以前的部署导致存在脏的持久性卷声明
问题
之前的部署尝试导致脏的持久性卷声明(PVC),从而导致 MySQL 容器无法启动。
原因
在 OpenShift 中删除项目不会清理与其关联的 PVC。
解决方案
流程
使用
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
-
点 OpenShift UI 中的
cancel 部署
,以停止 system-mysql 容器集的部署。 - 删除 MySQL 路径下的所有内容,以清理卷。
-
启动新的
system-mysql
部署。
2.7.2. 经过身份验证的用户 registry 的错误或缺少凭证
问题
Pod 没有启动。镜像流显示以下错误:
! error: Import failed (InternalError): ...unauthorized: Please login to the Red Hat Registry
原因
在 OpenShift 4.x 上安装 3scale 时,OpenShift 无法启动 pod,因为 ImageStreams 无法拉取它们引用的镜像。这是因为 pod 无法针对它们所指向的 registry 进行身份验证。
解决方案
流程
键入以下命令以验证容器 registry 身份验证的配置:
$ oc get secret
如果 secret 存在,您会在终端中看到以下输出:
threescale-registry-auth kubernetes.io/dockerconfigjson 1 4m9s
- 但是,如果没有看到输出结果,您必须执行以下操作:
- 在创建 registry 服务帐户时,使用之前设置的凭证来创建您的 secret。
-
使用在 OpenShift 中配置 registry 身份验证的步骤,替换
oc create secret
命令中的<your-registry-service-account-username>
and<your-registry-service-account-password>
。 在与 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>"
删除并重新创建 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
验证
键入以下命令,以确认部署的状态为
Starting
或Ready
: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
键入以下命令以查看每个 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.7.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.7.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 进程启动时不正确的用户权限。
解决方案
流程
用于持久性卷的目录 MUST 具有 root 组的写入权限。对 root 用户具有读写权限不够,因为 MySQL 服务以 root 组中的不同用户身份运行。以 root 用户身份执行以下命令:
chmod -R g+w /path/for/pvs
执行以下命令以防止 SElinux 阻止访问:
chcon -Rt svirt_sandbox_file_t /path/for/pvs
2.7.5. 无法上传徽标或图像
问题
无法上传徽标 - system-app
日志显示以下错误:
Errno::EACCES (Permission denied @ dir_s_mkdir - /opt/system/public//system/provider-name/2
原因
OpenShift 无法写入持久卷。
解决方案
流程
确保您的持久卷可由 OpenShift 写入。它应归 root 组所有,并且可写入组。
2.7.6. 测试在 OpenShift 中无法正常工作的调用
问题
测试调用在创建新服务和 OpenShift 上的路由后无法正常工作。通过 curl 直接调用也失败,带有 service not available
信息。
原因
3scale 默认需要 HTTPS 路由,并且 OpenShift 路由不受保护。
解决方案
流程
确保 OpenShift 路由器设置中点击了 安全路由 复选框。
2.7.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>