跳到主要内容

钩子

2024年08月30日
柏拉文
越努力,越幸运

一、认识


Pod 生命周期钩子(Hooks: 在 Kubernetes 中,Pod 生命周期钩子(Lifecycle Hooks)是一组允许用户在容器的生命周期中指定特定操作的机制。这些钩子为在容器启动前或终止前执行定制逻辑提供了灵活性,从而帮助确保应用程序的平滑启动和优雅终止。

Kubernetes 提供了两种主要的生命周期钩子:

  1. postStart 钩子:在容器启动后立即调用。容器已经创建并准备运行,但还没有开始处理请求或进入其主循环。因此, postStart 钩子可用于在应用程序正式启动前执行初始化任务,如注册服务、生成初始配置文件、检查依赖的服务状态等。

  2. preStop 钩子:在容器被终止之前执行。容器终止前,Kubernetes 会首先调用 preStop 钩子,等待其完成或达到超时限制,然后再终止容器。因此,preStop 常用于优雅地关闭应用程序,保存状态,或释放资源,例如关闭连接、刷新缓存、通知其他服务等。比如说: preStop 钩子可以帮助应用程序在终止前完成必要的清理工作,例如关闭数据库连接、提交未完成的事务、通知其他服务等。通过 preStop 钩子,在应用程序终止前保存重要数据或状态,确保在应用重启或扩展时不会丢失重要信息。

Pod 生命周期钩子的执行方式

  1. exec: 在容器内执行指定的命令。通常用于简单的操作或需要访问容器内部资源的任务。

  2. httpGet: 向容器内的某个 HTTP 端点发起 GET 请求。通常用于触发应用程序的特定逻辑,例如通知应用程序它将要停止。

二、preStop


preStop:在容器被终止之前执行。容器终止前,Kubernetes 会首先调用 preStop 钩子,等待其完成或达到超时限制,然后再终止容器。因此,preStop 常用于优雅地关闭应用程序,保存状态,或释放资源,例如关闭连接、刷新缓存、通知其他服务等。比如说: preStop 钩子可以帮助应用程序在终止前完成必要的清理工作,例如关闭数据库连接、提交未完成的事务、通知其他服务等。通过 preStop 钩子,在应用程序终止前保存重要数据或状态,确保在应用重启或扩展时不会丢失重要信息。

2.1 语法

exec 方式:

apiVersion: v1 
kind: Pod
metadata:
name: lifecycle
spec:
containers:
- name: lifecycle
image: registry.cn-hangzhou.aliyuncs.com/bolawen/nginx:stable-otel-linux-arm64
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "nginx -s quit; while killall -0 nginx; do sleep 1; done"]
ports:
- containerPort: 80

httpGet 方式

apiVersion: v1 
kind: Pod
metadata:
name: lifecycle
spec:
containers:
- name: lifecycle
image: registry.cn-hangzhou.aliyuncs.com/bolawen/nginx:stable-otel-linux-arm64
lifecycle:
preStop:
httpGet:
path: /shutdown
port: 8080
ports:
- containerPort: 80

2.2 场景

三、postStart


postStart:在容器启动后立即调用。容器已经创建并准备运行,但还没有开始处理请求或进入其主循环。因此, postStart 钩子可用于在应用程序正式启动前执行初始化任务,如注册服务、生成初始配置文件、检查依赖的服务状态等。

3.1 语法

exec 方式:

apiVersion: v1 
kind: Pod
metadata:
name: lifecycle
spec:
containers:
- name: lifecycle
image: registry.cn-hangzhou.aliyuncs.com/bolawen/nginx:stable-otel-linux-arm64
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
ports:
- containerPort: 80

httpGet 方式

apiVersion: v1 
kind: Pod
metadata:
name: lifecycle
spec:
containers:
- name: lifecycle
image: registry.cn-hangzhou.aliyuncs.com/bolawen/nginx:stable-otel-linux-arm64
lifecycle:
postStart:
httpGet:
path: /shutdown
port: 8080
ports:
- containerPort: 80

3.2 场景