调试 Ingress
虚拟私有云 经典基础架构
您可以在集群中为应用程序创建一个 Ingress 资源,从而公开应用程序。 但是,当您尝试通过 Ingress 子域或 Ingress 控制器的 IP 地址连接到应用程序时,连接将失败或超时。
以下各部分中的步骤可帮助您调试 Ingress 设置。
开始之前,请确保您具有 IBM Cloud Kubernetes Service的以下 IBM Cloud IAM 访问策略:
- 群集的编辑器或管理员平台访问角色
- 撰稿人或管理员服务访问角色
当您尝试访问应用程序的子域时,是否看到 应用程序不可用 页面? 检查应用程序部署和 Ingress 资源配置。 要查看 连接超时 页面吗? 检查 Ingress 控制器 pod 的运行状况。
步骤 1: 检查应用程序部署和 Ingress 资源配置
首先检查应用程序部署和 Ingress 资源部署中的错误。 部署中的错误信息可以帮助你找到故障的根本原因,并在接下来的章节中进一步调试你的 Ingress 设置。
-
在调试 Ingress 之前,请先检出 调试应用程序部署。 入口问题通常由应用程序部署或公开应用程序的
ClusterIP
服务中的底层问题导致。 例如,应用程序标签和服务选择器可能不匹配,或者应用程序和服务目标端口可能不匹配。 -
检查您的 Ingress 资源部署,查找警告或错误信息。
oc describe ingress <ingress_resource_name>
在输出的 Events 部分中,您可能会看到警告消息,提醒您所使用的 Ingress 资源或某些注释中有无效的值。 对于注释,请注意 Red Hat OpenShift 版本 4 中的 Ingress 控制器或 Ingress 资源不支持 IBM Cloud Kubernetes Service 注释 (
ingress.bluemix.net/<annotation>
) 和 NGINX 注释 (nginx.ingress.kubernetes.io/<annotation>
)。 如果要为运行 Red Hat OpenShift 版本 4 的集群中的应用程序定制路由规则,那么可以使用 特定于路由的 HAProxy 注释,其格式为haproxy.router.openshift.io/<annotation>
或router.openshift.io/<annotation>
。NAME: myingress Namespace: default Address: 169.xx.xxx.xxx,169.xx.xxx.xxx Default backend: default-http-backend:80 (<none>) Rules: Host Path Backends ---- ---- -------- mycluster-<hash>-0000.us-south.containers.appdomain.cloud /tea myservice1:80 (<none>) /coffee myservice2:80 (<none>) Annotations: custom-port: protocol=http port=7490; protocol=https port=4431 location-modifier: modifier='~' serviceName=myservice1;modifier='^~' serviceName=myservice2 Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning TLSSecretNotFound 1m router-default-69d6f598f8-vn8tj Failed to apply ingress resource. Warning AnnotationError 2s router-default-69d6f598f8-vn8tj Failed to apply ingress.bluemix.net/custom-port annotation. Warning TLSSecretNotFound 1m router-dal10-y2d4359tf4-g4ar7 Failed to apply ingress resource. Warning AnnotationError 2s router-dal10-y2d4359tf4-g4ar7 Failed to apply ingress.bluemix.net/custom-port annotation.
-
请检查 Ingress 资源配置文件。
oc get ingress -o yaml
-
确保一个主机仅在一个 Ingress 资源中进行定义。 如果一台主机定义在多个导入资源中,导入控制器可能无法正确转发流量,您可能会遇到错误。
-
检查子域和 TLS 证书是否正确。 要查找 IBM 提供的 Ingress 子域和 TLS 证书,请运行
ibmcloud oc cluster get --cluster <cluster_name_or_ID>
。 -
确保应用程序侦听的是在 Ingress 的 path 部分中配置的路径。
-
根据需要编辑资源配置 YAML。 关闭编辑器时,会保存并自动应用更改。
oc edit ingress <myingressresource>
-
-
检查是否达到每个帐户允许的最大 VPC 负载均衡器数。 请查看 VPC 配额文档,以了解 VPC 中所有 VPC 集群的 VPC 资源配额。
步骤 2:检查 Ingress 控制器的健康状况
验证 Ingress 操作程序和 Ingress 控制器是否正常运行。 入口控制器由 Ingress 操作程序管理。 Ingress 控制器仅根据 Ingress 资源中定义并由 Ingress 控制器实现的规则将请求转发到该应用程序的 pod。
- 检查入口操作员舱的状态。
-
获取集群中正在运行的 Ingress 操作员 pod。
oc get pods -n openshift-ingress-operator
-
通过检查 STATUS 列来确保所有 pod 都在运行。
-
如果 pod 没有
Running
状态,那么可以删除 pod 以将其重新启动。oc delete pod <pod> -n openshift-ingress-operator
-
获取 Ingress 操作程序的日志,并在日志中查找错误消息。
oc logs deployments/ingress-operator -n openshift-ingress-operator -c ingress-operator
-
- 检查 Ingress 控制器 pod 的状态和日志。
-
获取群集中正在运行的 Ingress 控制器 pod。
oc get pods -n openshift-ingress
-
通过检查 STATUS 列,确保任何其他区域中 Ingress 控制器的所有
router-default
pod 和 pod 都在运行。 如果您具有多专区集群,请注意,您具有工作程序节点的第一个专区中的 Ingress 控制器服务始终命名为router-default
,而随后添加到集群的专区中的 Ingress 控制器服务具有诸如router-dal12
之类的名称。 -
如果 pod 没有
Running
状态,那么可以删除 pod 以将其重新启动。oc delete pod <pod> -n openshift-ingress
-
获取每个 pod 的日志,并在日志中查找错误消息。
oc logs <pod> -n openshift-ingress
-
- 检查每个 Ingress 控制器服务上的事件和错误。
- 列出
openshift-ingress
名称空间中的服务。oc get svc -n openshift-ingress
dal10
和dal13
中具有工作程序节点的多专区集群的输出示例:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE router-dal13 LoadBalancer 172.21.47.119 169.XX.XX.XX 80:32318/TCP,443:30915/TCP 26d router-default LoadBalancer 172.21.47.119 169.XX.XX.XX 80:32637/TCP,443:31719/TCP 26d router-internal-default ClusterIP 172.21.51.30 <none> 80/TCP,443/TCP,1936/TCP 26d
- 描述每个 Ingress 控制器服务,并在输出的
Events
部分中检查消息。oc describe svc router-default -n openshift-ingress
- 例如,在 VPC 集群中,您可能会看到错误消息,例如
The VPC load balancer that routes requests to this Kubernetes LoadBalancer service is offline
。 有关更多信息,请参阅 VPC 集群: 为什么我的应用程序无法通过负载均衡器进行连接?。
- 例如,在 VPC 集群中,您可能会看到错误消息,例如
- 列出
步骤 3:Ping 入口子域和入口控制器公共 IP 地址
检查 Ingress 控制器的公共 IP 地址的可用性,并验证子域映射。 此外,请确保 Red Hat OpenShift 控制平面可以访问 Ingress 控制器以进行运行状况检查。
-
验证 Ingress 控制器运行状况检查是否可访问 Ingress 控制器服务。
-
经典: 如果使用 Calico DNAT 之前的网络策略或其他定制防火墙来阻止到集群的入局流量,您必须允许从 Red Hat OpenShift 控制平面和 Akamai 的 IPv4 IP 地址对 Ingress 控制器服务的 IP 地址进行入站访问,以便 Red Hat OpenShift 控制平面可以检查 Ingress 控制器的运行状况。 例如,如果使用 Calico 策略,那么 创建 Calico DNAT 前策略 以允许从 Akamai 的源 IP 地址 对 Ingress 控制器进行入站访问,这些 IP 地址用于检查端口 80 上的 Ingress 控制器的运行状况以及集群所在区域的 控制平面子网。 继续执行下一步以获取 Ingress 控制器服务 IP 地址。
-
VPC:如果在群集入口的 VPCLBaaSLoadBalancer-as-a-Service)实例上有自定义安全组,请确保安全组规则允许从Kubernetes 控制平面 IP 地址到端口 443 的必要健康检查流量。
-
-
获取 Ingress 控制器服务正在侦听的外部 IP 地址。 如果您具有多专区集群,请注意,您具有工作程序节点的第一个专区中的 Ingress 控制器服务始终命名为
router-default
,而随后添加到集群的专区中的 Ingress 控制器服务具有诸如router-dal12
之类的名称。 在 VPC 集群中,外部 IP 地址位于 VPC 负载均衡器分配的主机名后面,例如aabb1122-us-south.lb.appdomain.cloud
。oc get svc -n openshift-ingress
工作节点位于
dal10
和dal13
的经典多区集群的输出示例:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE router-dal13 LoadBalancer 172.21.47.119 169.XX.XX.XX 80:32318/TCP,443:30915/TCP 26d router-default LoadBalancer 172.21.47.119 169.XX.XX.XX 80:32637/TCP,443:31719/TCP 26d router-internal-default ClusterIP 172.21.51.30 <none> 80/TCP,443/TCP,1936/TCP 26d
如果 Ingress 控制器没有外部 IP 地址 (经典) 或主机名 (VPC),请参阅 版本 4: 为什么 Ingress 控制器不部署在区域中?。
-
检查 Ingress 控制器 pod (经典) 或主机名 (VPC) 的运行状况。
- 经典集群: 检查 Ingress 控制器 pod 的状态。
- VPC 集群: 多专区集群中的路由器服务是使用
/healthz
路径创建的,以便您可以检查每个服务 IP 地址的运行状况。 以下 HTTP cURL 命令使用/healthz
路径,该路径返回正常IP的ok
状态。
curl -X GET http://<router_svc_IP_or_hostname>/healthz -H "Host:router-default.<ingress_subdomain>"
如果一个或多个 IP 地址未返回
ok
,请 检查 Ingress 控制器 pod 的状态。 -
获取 IBM 提供的 Ingress 子域。
ibmcloud oc cluster get --cluster <cluster_name_or_ID> | grep Ingress
示例输出
Ingress Subdomain: mycluster-<hash>-0000.us-south.containers.appdomain.cloud Ingress Secret: mycluster-<hash>-0000
-
确保已向集群的 IBM提供的 Ingress 子域注册 Ingress 控制器 IP 地址。 例如,在多区群集中,每个有工作者节点的区的公共 Ingress 控制器 IP 必须在同一子域下注册。
host <ingress_subdomain>
示例输出
mycluster-<hash>-0000.us-south.containers.appdomain.cloud has address 169.XX.XX.XXX mycluster-<hash>-0000.us-south.containers.appdomain.cloud has address 169.XX.XXX.XX
-
如果使用自定义域,请确认已使用 DNS 提供商将自定义域映射到 IBM 提供的子域或 Ingress 控制器的公共 IP 地址。
- IBM-提供的子域 CNAME:检查您的自定义域是否已映射到集群 IBM 提供的 Canonical Name 记录 (CNAME) 中的子域。
示例输出host www.my-domain.com
www.my-domain.com is an alias for mycluster-<hash>-0000.us-south.containers.appdomain.cloud mycluster-<hash>-0000.us-south.containers.appdomain.cloud has address 169.XX.XX.XXX mycluster-<hash>-0000.us-south.containers.appdomain.cloud has address 169.XX.XX.XXX
- 公共 IP 地址 A 记录:检查您的自定义域是否已映射到 A 记录中 Ingress 控制器的可移植公共 IP 地址。
示例输出host www.my-domain.com
www.my-domain.com has address 169.XX.XX.XXX www.my-domain.com has address 169.XX.XX.XXX
- IBM-提供的子域 CNAME:检查您的自定义域是否已映射到集群 IBM 提供的 Canonical Name 记录 (CNAME) 中的子域。