具有公共和私有服务端点的 VPC 群集:为什么无法连接到 OpenShift 控制台?
排除在同时拥有公共和专用服务端点的群集上连接 OpenShift 控制台的问题。
本故障排除指南中的信息适用于既有公共服务终端又有私有服务终端的 VPC 群集。
1.了解群集连接流程
下图显示了一个 VPC 集群的连接流程,其中既有公共服务端点,也有私有服务端点,用于连接 OpenShift 网络控制台。 请注意,从网络浏览器到群集组件的所有连接都是通过公共网络进行的。 查看此图和以下说明,以便更好地了解可能需要采取的故障排除步骤。
- 网络浏览器连接到群集主 API 服务器。 交换签名证书后,重定向会指示网络浏览器转而连接到 OpenShift 控制台公共负载平衡器。
- (a) 网络浏览器连接到 OpenShift 控制台负载平衡器,该负载平衡器公开 OpenShift 控制台。(b) 该请求被发送到两个 openshift-console pod 中的一个。
- openshift-console pod 通过公共网络连接到群集主 OAuth 服务器端口,检查连接是否已通过身份验证。 如果请求已通过身份验证,则与 OpenShift 网络控制台的连接完成,可以访问网络控制台。 如果请求未通过验证,用户将被重定向到群集主控程序上的群集 OAuth 服务。
- 网络浏览器连接到群集的 OAuth 服务器端口,然后将客户端重定向到 IAM。
- 网络浏览器通过公共网络连接到 IAM。 用户输入密码,如果需要,还可输入 2FA 验证。 如果该步骤成功,用户将被重定向到群集的 OAuth 服务器。
- 网络浏览器再次连接到群集的 OAuth 服务器端口。 连接会重定向回 OpenShift 控制台负载平衡器。
- 网络浏览器连接到 OpenShift 控制台负载平衡器,该负载平衡器会显示 OpenShift 控制台。 该请求会发送到两个 openshift-console pod 中的一个,后者会再次连接到群集主 OAuth 服务器端口,以检查连接是否已通过身份验证。 如果用户输入了密码和 2FA 验证,则验证通过,用户将连接到 OpenShift 控制台主网页。
2.检查 VPC 和群集配置
- 确保网络浏览器可以访问公共网络,以便连接到群集 apiserver、OpenShift 控制台负载平衡器和 IAM(同时使用
iam.cloud.ibm.com
和login.ibm.com
) - 如果您修改了该群集或负载平衡器的任何安全组、ACL 或上下文限制 (CBR) 规则,请确保它们允许从该网络浏览器向这些资源传输流量
3.收集群组数据
按照以下步骤收集故障排除所需的群集信息。 通过这些命令收集的输出结果将用于后面的步骤。
-
查找群集 API 服务器 URL。 在后面的命令中,这个 URL 被称为
${CLUSTER_APISERVER_URL}
。- 运行
ibmcloud ks cluster get -c <cluster-id>
命令。ibmcloud oc cluster get -c <cluster-id>
- 在输出结果的
Master
部分,找到URL
。 URL 的格式如下:https://c<XXX>-e.<REGION>.containers.cloud.ibm.com:<YYYYY>
.
- 运行
-
查找群集 OAuth URL。 在后面的命令中,这个 URL 被称为
${CLUSTER_OAUTH_URL}
。- 运行
kubectl get --raw /.well-known/oauth-authorization-server | grep issuer
命令。 请勿使用ibmcloud oc cluster get -c <CLUSTER-ID>
,因为该命令可能会返回不同的 URL。kubectl get --raw /.well-known/oauth-authorization-server | grep issuer
- URL 的格式如下:
https://c<XXX>-e.<REGION>.containers.cloud.ibm.com:<ZZZZZ>
.
- 运行
-
查找 Ingress 子域。 在后面的命令中,这个子域被称为
${CONSOLE_LOAD_BALANCER}
。- 运行
ibmcloud oc cluster get -c <CLUSTER-ID>
命令。ibmcloud oc cluster get -c <CLUSTER-ID>
- 在输出结果中,找到符合以下格式的子域:
<CLUSTER-NAME-PLUS-RANDOM-UNIQUE-STRING>.<REGION>.containers.appdomain.cloud
. 请注意,如果您配置了自定义 Ingress 子域,格式将与您的自定义配置一致。
- 运行
4.验证连接并排除故障
按照以下步骤检查 连接流程 中描述的连接。 如果发现连接有问题,请使用这些信息排除故障。
-
验证 Ingress 是否正常,路由器和控制台 pod 是否正常。
- 运行命令。
ibmcloud oc cluster get -c <CLUSTERID> ibmcloud oc ingress status-report get -c <CLUSTERID>
- 如果输出显示错误状态,请使用 Ingress 故障排除文档 解决问题。
- 运行命令。
-
验证 OpenShift 集群操作员是否健康。
- 运行命令。
oc get clusteroperators
- 如果输出显示任何运算符不健康或未以当前版本运行,请使用 OpenShift 群集版本故障排除文档 解决问题。 或者,您可以搜索 IBM 和 Red Hat 文档,查找所显示的任何特定错误。
- 如果控制台操作员特别不健康,请检查
openshift-console/console...
和openshift-console-operator/console-operator...
pod 日志,查看是否有安全组、ACL 或 DNS 自定义阻止 pod 连接到 OAuth 端口或 OpenShift 控制台 URL。 安全组、ACL 或 DNS 的配置方式可能会阻止连接。
- 运行命令。
-
验证与群集主 API 服务器的连接是否成功。
- 运行命令。 指定在 前面步骤 中找到的群集 apiserver URL。
curl -k -vvv ${CLUSTER_APISERVER_URL}/version
- 如果连接不成功,请进行以下检查并解决发现的任何问题。
- 运行
ibmcloud oc cluster get -c <CLUSTER-ID>
命令检查群集主控程序是否正常。 有关解决集群主节点问题的信息,请参阅 检查主节点健康状况。 - 检查 URL 的主机名部分是否已通过 DNS 解析。 使用
dig $(echo ${CLUSTER_APISERVER_URL} | cut -d/ -f3 | cut -d: -f1)
命令并指定群集 API 服务器 URL。 - 检查群集中是否有任何基于上下文的限制 (CBR) 规则阻止客户端连接群集 API 服务器。 您可以在公共 CBR 规则中临时添加一个允许所有 IP 和子网的网络区域来进行测试。 如果临时更改能解决问题,则对规则进行必要更改,以允许流量。
- 运行
- 运行命令。 指定在 前面步骤 中找到的群集 apiserver URL。
-
验证与集群负载平衡器的连接是否成功,该集群负载平衡器暴露于 OpenShift 控制台。
- 运行命令。 指定在 前面步骤 中找到的 Ingress 子域。
curl -k -vvv https://console-openshift-console.${CONSOLE_LOAD_BALANCER}/
- 如果连接不成功,请进行以下检查并解决发现的任何问题。
- 检查子域的主机名部分是否已通过 DNS 解析。 使用
dig console-openshift-console.${CONSOLE_LOAD_BALANCER}
命令。 - 如果您修改了应用于负载平衡器的任何安全组、ACL 或自定义 VPC 路由,请检查您应用的任何更改或规则是否阻止了连接。 如果您未修改这些组件中的任何一个,且它们使用默认值,则可以跳过此步骤。
- 检查子域的主机名部分是否已通过 DNS 解析。 使用
- 运行命令。 指定在 前面步骤 中找到的 Ingress 子域。
-
验证与群集 OAuth 服务器的连接是否成功。
- 运行命令。 指定在 前面步骤 中找到的群集 OAuth URL。
curl -k -vvv ${CLUSTER_OAUTH_URL}/healthz
- 如果连接不成功,请进行以下检查并解决发现的任何问题。
- 运行
ibmcloud oc cluster get -c <CLUSTER-ID>
命令,检查群集主控是否正常。 有关解决集群主节点问题的信息,请参阅 检查主节点健康状况。 - 检查群集 OAuth URL 的主机名部分是否已通过 DNS 解析。 使用
dig $(echo ${CLUSTER_OAUTH_URL} | cut -d/ -f3 | cut -d: -f1)
并指定群集 OAuth URL。 - 检查群集上是否有任何基于上下文的限制 (CBR) 规则阻止客户端连接到群集 OAuth 服务器。 您可以在公共 CBR 规则中临时添加一个允许所有 IP 和子网的网络区域来进行测试。 如果临时更改能解决问题,则对规则进行必要更改,以允许流量。
- 运行
- 运行命令。 指定在 前面步骤 中找到的群集 OAuth URL。
-
验证与 IAM 的连接是否成功。
- 运行命令。
curl -vvv https://iam.cloud.ibm.com/healthz curl -vvv -o /dev/null -s https://login.ibm.com/
- 如果这些命令都失败,请检查客户端系统是否能够可靠地连接这些 URL,以及这些 URL 是否被任何客户端或公司防火墙阻止。 请注意,这些 URL 需要访问公共互联网。
- 运行命令。
5.联系支持
如果您已完成上述所有步骤,但仍未解决问题,请联系技术支持。 打开 支持案例。 在案件详情中,请确保包含任何相关日志文件、错误信息或命令输出。