背景
某项目应用需迁移到k8s环境,其中有个应用配置了Ingress,但通过域名访问,始终返回503服务不可用,应用服务都是正常的
➜ curl -v http://mdm-sts-test.xxx.com
<center><h1>503 Service Temporarily Unavailable</h1></center>
<hr><center>nginx/1.19.2</center>
从错误日志可以看出503是nginx返回的,并不是后端服务返回(后端tomcat),也就是说请求可能根本没有到达后端服务
排查
将Ingress连接到其他应用的service,还是继续报错,将Ingress的域名换成其他域名,结果正常,所以从测试结果上看应该是域名出问题。因为该域名已经在dns中配置,所以怀疑是不是又解析回到dns造成死循环(虽然k8s不会犯这么低级的错误),把域名配置到了hosts文件也是一样的错误,而且有类似配置的应用也都是正常的,这个猜测被否定。
- 确认请求是否达到后端
通过nsenter
工具进入容器的网络空间(参考博文使用nsenter进行docker网络连通性测试使用tcpdump命名查看网络请求信息
tcpdump -i eth0 -vnn port 8080
发现并没有请求进入,更改域名后可以看到请求,说明确实请求根本没到达后端
- 查看Ingress日志
Ingress本质上是一个nginx容器,通过nginx实现路由,可以登录到主机找到该容器
# docker ps|grep nginx-ingress-controller
6dd0787af62d 1f0ca6d99110 "/usr/bin/dumb-init …" 4 weeks ago Up 4 weeks k8s_nginx-ingress-controller_nginx-ingress-controller-wd4kc_ingress-nginx_8f17f7f6-b426-447d-9c76-0f507bd79d77_3
6af11ee50bc4 10.116.16.46:30001/rancher/pause:3.1 "/pause" 4 weeks ago Up 4 weeks k8s_POD_nginx-ingress-controller-wd4kc_ingress-nginx_8f17f7f6-b426-447d-9c76-0f507bd79d77_3
非pause
的容器就是Ingress的容器,上面6dd0787af62d就是Ingress的容器,可以直接用docker logs
查看日志
docker logs -f -t --tail 100 6dd0787af62d
正常请求日志里面并没有有价值的内容,当更改Ingress的域名后,出现了以下错误信息
2021-04-14T03:04:35.009823820Z W0414 03:04:35.009743 8 controller.go:829] Error obtaining Endpoints for Service "default/mdm-sts-svc": no object matching key "default/mdm-sts-svc" in local store
mdm-sts-svc
这个service就是有问题的Ingress对应的后端Service,但是这里报错的是default/mdm-sts-svc
就很奇怪,实际上这个service并不在default命名空间下,用命令查了下
$ kubectl get svc --all-namespaces
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default mdm-stc-svc ClusterIP 10.43.129.200 <none> 8080/TCP 19h
果然有default下有这个svc,继续查Ingress
$ kubectl get ingress --all-namespaces
NAMESPACE NAME CLASS HOSTS ADDRESS PORTS AGE
default mdm-sts-svc-ingress <none> mdm-sts-test.xxxx.com 10.112.22.16,10.112.22.20 80 18h
在default下也是部署了一个名称相同的Ingress,并且域名使用的和上面配置的域名是一样的,但是这个svc对应的后端服务报错了,并没有可用的服务所以导致503,因为host和新创建的一致k8s选择了更早之前创建的这个ingress作为路由。
之所以在default上也存在一样的ingress,可能是因为开发人员在第一次部署时忘记选择命名空间从而错误的部署到了default命名空间下
修复
删除掉default下相关资源就行
kubect delete svc mdm-stc-svc -n default
kubect delete ingress mdm-stc-svc-ingress -n default
总结
k8s集群是有rancher管理,但是由于没有把default空间加入到rancher的项目中,所以一直没发现,也暴露k8s的一个问题,k8s在创建ingress时应该检测是否存在域名相同的ingress。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。