目录
问题描述
问题分析
问题结论
解决方法
问题描述
先贴nginx的配置,下面是我的nginx ingress的upstream配置,将流量转发到aws的 alb 上,通过alb的负载均衡策略,去控制后端的两个实例。
upstream xxx-xxx {
server internal-xxx-1180960654.cn-northwest-1.elb.amazonaws.com.cn:8080 weight=1 max_fails=0 fail_timeout=120s;
}
但是在使用的过程中,一开始的请求是正常的,运行了大概一周后,通过浏览器访问页面时出现了访问超时的情况。
问题分析猜测是流量到了后端某个节点出现了网络问题,最有可能的就是nginx。
查看位于/var/log/nginx下的错误日志 ,查看到了大量的timeout错误。具体的错误日志路径,可以直接打开nginx.conf配置文件查看。所以可以断定,一定是转发请求的url有问题,大概率是dns解析的问题。
可以看到,我在通过域名请求的过程中,发生了ip地址的变化。
这里要说明一个机制,就是nginx在启动的时候,会对upstream里面配置的域名进行一次dns解析,并缓存起来。在运行的过程就不再进行动态的dns解析,除非再次进行加载,否则访问对应upstream就是通过一开始解析到的ip地址去访问。
于是手动执行
$ nginx -s reload
果然查看控制台后发现不再报错了
问题结论1.aws的alb是d性ip,这一点和阿里云不同,可能是历史遗留问题
2.nginx只在启动和热加载的时候做一次dns解析并缓存,没有做动态dns解析
解决方法aws针对这个问题有专门的解决方案
Using AWS Lambda to enable static IP addresses for Application Load Balancers | Networking & Content Delivery
这个是早期方案,需要借助lambda,S3,CloudWatch 来实现 ,还是比较重的方案,所以官方在后续更新了一个比较轻量级的方案,只需要配置一个包含alb的目标组,通过新建一个nlb去连接到这个目标组,就可以实现。缺点是aws的nlb需要额外收费。
Application Load Balancer 现可通过与网络负载均衡器直接集成来启用 AWS PrivateLink 和静态 IP 地址
简单来讲,就是alb作为七层负载均衡不具备提供静态ip的功能,新支持alb类型的目标组,将流量从nlb转发到alb,有nlb来提供静态ip。
首先,该方案需要在新版EC2下实践,点击控制台左上方的开关可以进行切换。
创建负载均衡,选择nlb,图示上可以看到alb类型的目标组可以作为nlb的后端。
在添加侦听器时需要创建新的目标组。
目标组的类型中选择alb,在对其的描述中可以发现该类型就是为alb提供静态ip地址的方案而生的。
创建好之后,只需要将nginx配置文件中的alb地址替换成nlb地址即可。通过nlb域名解析得到的ip地址一定是固定的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)