如何获取Kubernetes应用的URL并排查无法访问问题
正确获取Kubernetes应用访问URL及排障步骤
一、根据Service类型匹配URL规则
不同类型的Service访问逻辑完全不同,先确认类型再拼接URL:
- ClusterIP(默认类型):仅集群内部可访问,URL格式为
http://<Service名称>.<所在命名空间>.svc.cluster.local:<Service端口>,集群外部无法直接访问 - NodePort:会在所有集群节点上开放30000-32767范围的主机端口,外部访问URL为
http://<任意集群节点的可达IP>:<分配的NodePort端口> - LoadBalancer:云托管集群常用类型,会自动分配公网/内网负载均衡地址,URL为
http://<EXTERNAL-IP字段显示的负载均衡IP>:<Service端口>,如果配置80/443端口可省略端口号 - 绑定Ingress的服务:如果Service前挂载了Ingress规则,直接使用Ingress中配置的域名访问即可,格式为
http://<Ingress规则中配置的HOST域名>
二、获取URL所需字段的命令
直接执行以下命令提取核心信息,避免手动拼接参数出错:
- 查看全集群Service信息:
kubectl get svc -A,输出结果中可直接看到Service所在命名空间、名称、类型、外部IP、端口映射关系,NodePort类型的端口列会以服务端口:节点开放端口/TCP的格式展示,直接提取对应值拼接即可 - 查看Ingress访问信息:
kubectl get ingress -A,输出中ADDRESS列为Ingress入口IP,HOSTS列为绑定的访问域名,确认域名解析到ADDRESS对应的IP后即可直接访问
三、访问异常逐点排查
按从底层到上层的顺序排查,不要跳步:
- 先确认后端Pod状态正常:执行
kubectl get pods -n <服务所在命名空间>,检查对应业务Pod是否为Running状态,READY列的就绪容器数是否和预期一致。如果Pod处于CrashLoopBackOff、ImagePullBackOff等异常状态,先执行kubectl logs <异常Pod名称> -n <命名空间>查看日志,解决应用启动、镜像拉取类问题 - 检查Service和Pod的关联关系:执行
kubectl describe svc <Service名称> -n <命名空间>,查看Endpoints字段是否挂载了正常运行的Pod IP。如果Endpoints列表为空,说明Service的selector标签和Pod实际标签不匹配,修改两边标签保持一致即可 - 校验端口配置正确性:确认Service中配置的targetPort和Pod实际暴露的容器端口一致,不要混淆Service端口、NodePort端口、容器端口;如果是NodePort/LoadBalancer类型,确认集群节点安全组、主机防火墙已经放通对应访问端口,不存在流量拦截
- 集群内连通性校验:启动一个同集群的调试Pod,在Pod内执行curl请求Service的集群内地址,如果集群内都访问不通,优先检查容器内应用是否绑定了0.0.0.0地址而非127.0.0.1回环地址——绑定回环地址时所有跨进程/跨主机的请求都会被拒绝
- Ingress场景额外校验:确认Ingress控制器Pod正常运行,Ingress规则中配置的serviceName、servicePort和实际Service信息完全一致,访问域名已经正确解析到Ingress控制器的入口IP
常见坑点:不要尝试用集群节点的localhost地址跨机器访问,NodePort需要用节点的非回环可达IP才能正常连通
内容的提问来源于stack exchange,提问作者Amaury Borges Souza
相关产品推荐
相关产品推荐

