专用VPC集群:为什么无法连接到 OpenShift 控制台?
排除在只有专用服务端点的群集上连接 OpenShift 控制台的问题。
本故障排除指南中的信息仅适用于具有专用服务端点的VPC集群。
1. 了解集群连接流程
下图显示了VPC集群的连接流程,其中包含用于连接 OpenShift Web控制台的私有服务端点。 本图假定群集使用默认的 OAuth 设置。 请查看此图和以下描述,以便更好地了解可能需要采取哪些故障排除步骤。
- 网络浏览器通过虚拟专用网络连接到集群主应用程序接口服务器。 交换签名证书,并使用重定向指令让网络浏览器连接到 OpenShift 控制台负载均衡器。
- (a) Web浏览器通过VPN连接到 OpenShift 控制台负载均衡器,该负载均衡器公开了 OpenShift 控制台。(b) 此请求被发送到两个openshift-console容器中的一个。
- openshift-console pod 会连接到群集主服务器 OAuth 端口,检查连接是否已通过身份验证。 如果请求已通过身份验证,则与 OpenShift 网络控制台的连接完成,可以访问网络控制台。 如果请求未通过身份验证,用户将被重定向到群集主服务器上的群集 OAuth 服务。
- 网络浏览器通过 VPN 连接到群集的 OAuth 服务器端口,该端口会将客户端重定向到 IAM。
- 网络浏览器通过公共网络连接到IAM。 用户输入密码,必要时还需输入 2FA 验证信息。 如果该步骤成功,用户将被重定向到群集的 OAuth 服务器。
- 网络浏览器通过 VPN 再次连接到群集的 OAuth 服务器端口。 连接会重定向回 OpenShift 控制台负载平衡器。
- 网络浏览器通过VPN连接到 OpenShift 控制台负载均衡器,从而暴露了 OpenShift 控制台。 该请求会发送到两个 openshift-console pod 中的一个,后者会再次连接到群集主服务器 OAuth 端口,检查连接是否已通过身份验证。 如果用户输入了密码和 2FA 验证,则验证通过,用户将连接到 OpenShift 控制台主网页。
2. 检查您的VPC和集群配置
请确认您的VPC和集群配置正确。 配置不正确可能会导致您无法访问 OpenShift 网络控制台。
-
请确保您的网络浏览器运行在客户端系统中,该客户端系统与您的集群位于同一 VPC 中,或通过 VPN 连接到该 VPC。 OpenShift 控制台由专用VPC负载均衡器提供,只能通过VPC的专用网络访问。
-
确保客户系统能够访问IAM的公共服务终端,可通过
iam.cloud.ibm.com和login.ibm.com访问。 -
对于运行版本 4.13:
- 如果您的集群使用默认的 4.13 Oauth配置,或者您已将集群设置为使用VPE Gateway进行Oauth,请确保您的客户端正在使用VPC的专用DNS,并且该DNS流量通过VPN路由到VPC。 除非您使用自定义的DNS解析器,否则私人DNS通常是
161.26.0.7和161.26.0.8。 这是必需的,以便可以在VPC的专用DNS中找到任何公共DNS中都不存在的apiserver和Oauth的VPE网关。
- 如果您的集群使用默认的 4.13 Oauth配置,或者您已将集群设置为使用VPE Gateway进行Oauth,请确保您的客户端正在使用VPC的专用DNS,并且该DNS流量通过VPN路由到VPC。 除非您使用自定义的DNS解析器,否则私人DNS通常是
-
对于运行任何受支持版本(除 4.13:
- 如果您使用的是默认的Oauth集群设置,请确保VPN配置中存在路由,以便所有
166.8.0.0/14流量都通过同一VPN或连接到 IBM Cloud 的其他VPN进行路由。 这是连接群集 API 服务器和 OAuth 服务器端口所需的。
- 如果您使用的是默认的Oauth集群设置,请确保VPN配置中存在路由,以便所有
3. 收集集群数据
请按照以下步骤收集故障诊断所需的集群信息。 您使用这些命令收集的输出将在后续步骤中使用。
-
找到集群API服务器 URL。 在以后的命令中,这个 URL 被称为
${CLUSTER_APISERVER_URL}。- 运行
ibmcloud ks cluster get -c CLUSTER_ID命令。
ibmcloud oc cluster get -c CLUSTER_ID ``` 2. 在输出的 `Master` 部分,找到 `URL`。 URL 的格式应为:`https://c<XXX>-e.private.<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 ``` 2. 在输出中,找到以下格式之一的 URL。 - 如果 VPE 网关未用于 OAuth:`https://c<XXX>-e.private.<REGION>.containers.cloud.ibm.com:<ZZZZZ>`。 - 如果 VPE 网关用于 OAuth:`https://<CLUSTERID>.vpe.private.<REGION>.containers.cloud.ibm.com:<ZZZZZ>`。 - 运行
-
找到入口子域。 在以后的命令中,这个子域被称为
${CONSOLE_LOAD_BALANCER}。- 运行
ibmcloud oc cluster get -c CLUSTER_ID命令。
ibmcloud oc cluster get -c CLUSTER_ID ``` 2. 在输出中,找到符合以下格式的子域:`<CLUSTER-NAME-PLUS-RANDOM-UNIQUE-STRING>.<REGION>.containers.appdomain.cloud`。 请注意,如果您配置了自定义入口子域,则格式将改为与您的自定义配置匹配。 - 运行
4. 验证连接并进行故障排除
请按照以下步骤检查 连接流程中 描述的连接。 如果您发现连接有问题,请使用这些信息排除故障。
-
检查入口是否正常,路由器和控制台是否正常。
- 运行命令。
ibmcloud oc cluster get -c CLUSTERID ibmcloud oc ingress status-report get -c CLUSTERID ``` 2. 如果输出显示错误状态,请使用 [入口故障排除文档](/docs/openshift?topic=openshift-ingress-status) 解决问题。 -
请确认 OpenShift 集群操作员是否健康。
- 运行命令。
oc get clusteroperators ``` 2. 如果输出显示任何操作员不健康或未运行当前版本,请使用 [OpenShift 集群版本故障排除文档](/docs/openshift?topic=openshift-ts-cluster-version-downlevel) 来解决这个问题。 或者,您也可以在 IBM 和 Red Hat 文档中搜索显示的任何特定错误。 3. 如果控制台操作员特别不健康,请检查 `openshift-console/console...` 和 `openshift-console-operator/console-operator...` pod 日志,查看是否有安全组、ACL 或 DNS 自定义阻止 pod 连接到 OAuth 端口或 OpenShift 控制台 URL。 安全组、访问控制列表或域名系统(DNS)的配置可能会阻止连接。 -
确认与集群主API服务器的连接是否成功。
- 运行命令。 请填写您在 之前步骤 中找到的集群管理服务器 URL。
curl -k -vvv ${CLUSTER_APISERVER_URL}/version ``` 2. 如果连接不成功,请进行以下检查并解决您发现的任何问题。 1. 通过运行 `ibmcloud oc cluster get -c <CLUSTER-ID>` 命令检查集群主节点是否健康。 请参阅 [《审查主健康](/docs/openshift?topic=openshift-debug_master) 》以了解如何解决集群主问题。 2. 检查 URL 的主机名部分是否已通过DNS解析。 使用 `dig $(echo ${CLUSTER_APISERVER_URL} | cut -d/ -f3 | cut -d: -f1)` 命令并指定集群API服务器 URL。 3. 请确认您的VPN中有一条连接到集群API服务器 URL 的路径。 4. 如果集群apiserver URL 包含您的集群ID(这表明集群使用VPE网关连接集群apiserver),请检查集群主机的VPE网关安全组是否允许来自您的VPN客户端子网的流量。 请按照 [OAuth 访问设置为 VPE 网关时访问 OpenShift 控制台](/docs/openshift?topic=openshift-console-apiserver-oauthvpe) 中的步骤操作。 5. 检查是否任何安全组、访问控制列表或自定义的虚拟专用网络路由阻止了VPN与集群API服务器之间的通信。 您可以暂时允许所有入站和出站流量通过VPN安全组和访问控制列表,然后检查是否解决了问题,以此来测试。 如果是这样,请对您的安全组、访问控制列表或自定义路由进行必要的更改,以允许流量通过。 6. 检查群集中是否有任何基于上下文的限制 (CBR) 规则阻止客户端连接群集 API 服务器。 您可以暂时在CBR规则中添加一个允许所有IP和子网的网络区域来测试这一点。 如果临时更改能解决问题,则对规则进行必要更改,以允许流量。 -
验证与集群负载均衡器的连接是否成功,该负载均衡器暴露了 OpenShift 控制台。
- 运行命令。 请填写您在 之前步骤 中找到的入口子域名。
curl -k -vvv https://console-openshift-console.${CONSOLE_LOAD_BALANCER}/ ``` 2. 如果连接不成功,请进行以下检查并解决您发现的任何问题。 1. 检查子域的主机名部分是否已通过 DNS 解析。 使用 `dig console-openshift-console.${CONSOLE_LOAD_BALANCER}` 命令。 2. 验证您的VPN中是否存在一条通往该负载均衡器子域的路径。 确认路由中包含负载均衡器使用的所有IP或子网。 `dig console-openshift-console.${CONSOLE_LOAD_BALANCER}` 命令的输出包括当前负载均衡器的IP和子网,但请注意,这些可能会随着负载均衡器的扩展或缩减而改变。 3. 如果您修改了应用于负载均衡器的任何安全组、访问控制列表或自定义VPC路由,请检查您应用的任何更改或规则是否阻止了连接。 如果您没有修改任何组件,且它们使用默认值,则可以跳过此步骤。 4. 检查是否任何安全组、访问控制列表或自定义的虚拟专用网络路由阻止了VPN与负载均衡器之间的通信。 您可以暂时允许所有入站和出站流量通过VPN安全组和访问控制列表,然后检查是否解决了问题,以此来测试。 如果是这样,请对您的安全组、访问控制列表或自定义路由进行必要的更改,以允许流量通过。 -
验证与群集 OAuth 服务器的连接是否成功。
- 运行命令。 指定在 前面步骤 中找到的群集 OAuth URL。
curl -k -vvv ${CLUSTER_OAUTH_URL}/healthz ``` 2. 如果连接不成功,请进行以下检查并解决您发现的任何问题。 1. 通过运行 `ibmcloud oc cluster get -c <CLUSTER-ID>` 命令检查集群主节点是否健康。 请参阅 [《审查主健康](/docs/openshift?topic=openshift-debug_master) 》以了解如何解决集群主问题。 2. 检查群集 OAuth URL 的主机名部分是否已通过 DNS 解析。 使用 `dig $(echo ${CLUSTER_OAUTH_URL} | cut -d/ -f3 | cut -d: -f1)` 并指定群集 OAuth URL。 3. 验证是否有路由通过 VPN 连接到群集主服务器 OAuth URL。 4. 检查应用到 VPN 的任何安全组、ACL 或自定义 VPC 路由是否阻止了 VPN 和群集 OAuth 服务器之间的流量。 您可以暂时允许所有入站和出站流量通过VPN安全组和访问控制列表,然后检查是否解决了问题,以此来测试。 如果是这样,请对您的安全组、访问控制列表或自定义路由进行必要的更改,以允许流量通过。 5. 检查群集中是否有任何基于上下文的限制 (CBR) 规则阻止客户端连接到群集 OAuth 服务器。 您可以暂时在CBR规则中添加一个允许所有IP和子网的网络区域来测试这一点。 如果临时更改能解决问题,则对规则进行必要更改,以允许流量。 -
验证与IAM的连接是否成功。
- 运行命令。
curl -vvv https://iam.cloud.ibm.com/healthz curl -vvv -o /dev/null -s https://login.ibm.com/ ``` 2. 如果这两个命令中的任何一个失败,请检查客户端系统是否能可靠地连接这些URL,以及这些URL是否被任何客户端或公司防火墙阻止。 请注意,这些URL需要访问公共互联网。
5. 联系客服
如果您已完成上述所有步骤,但问题仍未解决,请联系支持部门。 提交 支持案例。 在案例详情中,请务必附上相关的日志文件、错误信息或命令输出。