优雅下线的重要性
在Kubernetes中,Pod的优雅下线(Graceful Shutdown)是确保服务无中断的关键环节。当Pod需要终止时,系统会发送SIGTERM信号,预留时间让应用完成未完成的任务、释放资源并拒绝新请求,避免数据丢失或客户端错误。
配置terminationGracePeriodSeconds
在Pod的YAML中定义terminationGracePeriodSeconds,默认30秒。根据应用需求调整,例如设置为60秒:
spec:
terminationGracePeriodSeconds: 60
处理SIGTERM信号
应用需捕获SIGTERM信号并执行清理逻辑。以Go为例:
package main
import (
"context"
"os"
"os/signal"
"syscall"
)
func main() {
ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGTERM)
defer stop()
<-ctx.Done()
// 执行清理逻辑(如关闭数据库连接、等待请求完成)
}
使用preStop钩子
在容器配置中添加preStop钩子,延迟退出或调用健康检查接口:
lifecycle:
preStop:
exec:
command: ["sh", "-c", "sleep 10 && nginx -s quit"]
就绪探针与流量转移
确保就绪探针(readinessProbe)在终止时快速失效,从Service的Endpoints中移除Pod:
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
periodSeconds: 2
负载均衡器同步延迟
部分云厂商的负载均衡器存在同步延迟(如AWS ALB约需15秒)。可通过延长terminationGracePeriodSeconds或preStop休眠时间覆盖延迟。
日志与监控
记录下线过程的日志,监控以下指标:
- Pod终止耗时
- 请求失败率
- 资源释放情况
测试验证流程
- 手动删除Pod观察行为:
kubectl delete pod <pod-name> --grace-period=60
- 模拟网络故障强制终止:
kubectl exec <pod-name> -- kill -9 1
- 检查日志是否显示清理逻辑被执行。

408

被折叠的 条评论
为什么被折叠?



