EKS中,当使用AWS Load Balancer Controller时,ALB有两种模式,Internet-facing和Internet,当使用Internet模式时,ALB注册的是NodeIP;使用Internet-facing模式时,ALB注册的则是Pod IP。从模式上来说,Internet-facing模式因少了一层转发,通信效率将更高,但因ALB特性,也会在重启服务时,ALB的IP注册销毁存在滞后性,从而导致服务出现短暂中断,这个场景主要有两种:
- 新IP注册时,需要初始化及健康监测两个步骤,当新的Pod已经创建,但旧的Pod已销毁,但ALB层面未完成新的IP注册,可能短暂出现无可用Pod的局面
- 在实测过程中,当新的Pod IP处于healthy状态,旧的处于draining状态的Pod IP仍有可能接受到请求
解决方案
## 通过下面命令为服务所在命令空间添加相应标签,以启动Readiness Gate功能,该功能在Pod重启时,会先等新的IP health后再执行销毁旧的IP
kubectl label namespace 命名空间 elbv2.k8s.aws/pod-readiness-gate-inject=enabled
设置preStop,延迟20秒销毁Pod,这样可以避免将流量打到draining状态的IP
spec:
containers:
- image: public.ecr.aws/l6m2t8p7/docker-2048:latest
imagePullPolicy: Always
name: app-2048
lifecycle:
preStop:
exec:
command: ["sleep 20"]