k8s pod优雅下线实践

优雅下线的重要性

在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秒)。可通过延长terminationGracePeriodSecondspreStop休眠时间覆盖延迟。

日志与监控

记录下线过程的日志,监控以下指标:

  • Pod终止耗时
  • 请求失败率
  • 资源释放情况

测试验证流程

  1. 手动删除Pod观察行为:
kubectl delete pod <pod-name> --grace-period=60
  1. 模拟网络故障强制终止:
kubectl exec <pod-name> -- kill -9 1
  1. 检查日志是否显示清理逻辑被执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云原生运维

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值