AWS上Kops部署的K8s集群Route53访问异常及服务类型疑问
问题分析与解决方案
先梳理下你遇到的两个核心问题,以及关于服务类型的疑问,逐一解答:
1. Route53 访问2048游戏出现504网关超时
你提到通过ALB的DNS可以正常访问,但Route53绑定的域名http://2048.mysite.com返回504,结合现象来看,ALB本身是正常工作的,问题大概率出在Route53的Alias配置或者DNS解析环节,建议按以下步骤排查:
- 确认Alias Target配置正确性:在Route53记录集里,确保你选择的Alias Target是同一个AWS区域的Application Load Balancer,并且是ALB的外部端点(不要选内部负载均衡)。检查目标ALB的ARN是否和你部署alb-ingress-controller时关联的ALB一致。
- 验证DNS解析结果:执行
dig 2048.mysite.com,对比返回的IP地址是否和ALB的DNS解析出的IP一致。如果不一致,可能是Route53记录尚未生效(TTL缓存),可以尝试刷新本地DNS缓存,或者等待TTL过期(默认通常是300秒)。 - 检查ALB安全组与目标组:虽然ALB DNS能访问,但还是确认下ALB的安全组是否允许来自互联网的80/443流量,以及目标组的健康检查是否正常(如果目标组健康检查失败,ALB可能会返回504,但你能通过ALB访问说明这一步大概率没问题)。
2. Prometheus服务访问出现连接拒绝
从你提供的kubectl get svc结果来看,Prometheus相关服务都是ClusterIP类型,这就是问题的核心:
- ClusterIP服务的限制:ClusterIP是Kubernetes默认的服务类型,仅能在集群内部(Pod或节点)访问,外部请求(比如你的本地机器或者互联网)无法直接连接到ClusterIP,所以会出现
Connection refused错误。
解决方案:用ALB Ingress Controller暴露ClusterIP服务
你已经配置了alb-ingress-controller,这是暴露ClusterIP服务的最佳方式,不需要改成NodePort。只需要为每个Prometheus组件创建Ingress资源即可,示例如下:
暴露Prometheus Server的Ingress
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: prometheus-server-ingress annotations: kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip spec: rules: - host: server.mysite.com http: paths: - path: /* backend: serviceName: steely-wombat-prometheus-server servicePort: 80
暴露Alertmanager的Ingress
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: prometheus-alertmanager-ingress annotations: kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip spec: rules: - host: alertmanager.mysite.com http: paths: - path: /* backend: serviceName: steely-wombat-prometheus-alertmanager servicePort: 80
暴露Pushgateway的Ingress
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: prometheus-pushgateway-ingress annotations: kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip spec: rules: - host: pushgateway.mysite.com http: paths: - path: /* backend: serviceName: steely-wombat-prometheus-pushgateway servicePort: 9091
创建这些Ingress后,alb-ingress-controller会自动配置ALB的路由规则,将对应域名的请求转发到ClusterIP服务。之后记得在Route53中把server.mysite.com等域名的Alias Target指向这个ALB即可。
3. 是否必须使用NodePort类型?
完全不需要。NodePort只是Kubernetes暴露服务的一种方式,适合快速测试或简单场景,但在生产环境中,更推荐的组合是ClusterIP服务 + Ingress Controller:
- ClusterIP服务保持内部访问,避免不必要的端口暴露,安全性更高。
- Ingress统一管理域名、路由规则,还支持SSL终止、路径匹配等高级功能,并且可以复用同一个ALB来暴露多个服务,降低成本。
- 如果你有特殊需求(比如需要直接通过节点IP访问),NodePort是可选的,但不是必须的。LoadBalancer类型适合需要独立负载均衡的服务,但会额外产生ALB费用,不如Ingress高效。
内容的提问来源于stack exchange,提问作者online
相关产品推荐
相关产品推荐

