AWS Route53环境下K8s集群中Prometheus Ingress访问故障排查
你好,先帮你梳理下之前zsh报错的原因——zsh会把方括号[]当成通配符解析,所以用大括号{}或者给参数加引号(比如--set alertmanager.ingress.hosts="alertmanager.earth.myzone.com")都能解决部署问题。现在重点解决访问不了的问题,咱们按优先级一步步排查:
第一步:确认Ingress资源状态
先看看Helm创建的Ingress是不是正常生成了,执行命令:kubectl get ingress -n default # 未指定命名空间的话默认是default重点看
ADDRESS字段:- 如果是空值,说明Ingress Controller没和Ingress资源关联上,大概率是集群没部署Ingress Controller(kops默认可能未预装),或者Controller运行异常。
- 如果有值(通常是AWS ELB的域名或IP),记下来,后面要和DNS解析做对比。
第二步:检查Ingress Controller是否正常运行
如果用的是常用的nginx-ingress,执行以下命令检查状态:# 查看Controller Pod运行状态 kubectl get pods -n kube-system -l app=nginx-ingress # 查看Controller Service状态 kubectl get svc -n kube-system -l app=nginx-ingress确保Pod都是
Running状态,没有频繁重启;Service类型是LoadBalancer,且EXTERNAL-IP字段有值(和刚才Ingress的ADDRESS一致)。如果Pod没正常启动,查看日志排查:kubectl logs -n kube-system <nginx-ingress-pod-name>第三步:验证Route 53域名解析
你的三个子域名需要指向Ingress Controller的外部地址(ELB域名或IP),用dig或nslookup验证解析是否正确:dig server.earth.myzone.com看返回的
ANSWER SECTION里的IP/域名是不是和Ingress的ADDRESS一致。如果不一致,去Route 53的托管区检查A记录或CNAME记录,确保解析配置正确。第四步:检查Ingress规则与后端服务
查看具体Ingress的详细配置,比如server的Ingress:kubectl describe ingress prometheus-server -n default重点关注:
Rules里的Host是不是正确的server.earth.myzone.comBackend里的Service名称和端口是不是和Prometheus server的Service匹配
然后检查后端Service的Endpoints是否正常:
kubectl get endpoints prometheus-server -n default如果
ENDPOINTS字段是空的,说明对应的Prometheus server Pod没正常运行,或者标签匹配错误。第五步:检查Prometheus相关Pod与Service状态
确认Prometheus核心组件的Pod都正常运行:kubectl get pods -n default -l app=prometheus确保所有Pod都是
Running状态,没有CrashLoopBackOff。再检查对应的Service:kubectl get svc -n default -l app=prometheus确认Service的
ClusterIP存在,且PORT(S)配置正确。第六步:集群内部测试访问
排除外部网络和DNS的干扰,在集群内部做测试:- 临时启动一个测试Pod:
kubectl run -it --rm test-pod --image=busybox:1.28 -- sh - 在Pod内部直接访问Service:
如果能访问,说明内部服务正常,问题出在Ingress或DNS解析;如果不能访问,说明后端服务本身有问题,去查看Pod日志排查。curl http://prometheus-server:9090
- 临时启动一个测试Pod:
第七步:检查AWS安全组配置
因为是AWS环境,还要检查两类安全组:- ELB的安全组是否开放了80(或443)端口给你的访问IP段(测试阶段可以临时开放0.0.0.0/0)
- 集群节点的安全组是否允许ELB的安全组访问Ingress Controller的80/443端口
内容的提问来源于stack exchange,提问作者online

