kubernetes-handbook/concepts/pod-hook.md

44 lines
1.9 KiB
Markdown
Raw Permalink Normal View History

2017-11-24 22:56:22 +08:00
# Pod hook
2020-06-08 20:32:34 +08:00
Pod hook钩子是由 Kubernetes 管理的 kubelet 发起的,当容器中的进程启动前或者容器中的进程终止之前运行,这是包含在容器的生命周期之中。可以同时为 Pod 中的所有容器都配置 hook。
2017-11-24 22:56:22 +08:00
2020-06-08 20:32:34 +08:00
Hook 的类型包括两种:
2017-11-24 22:56:22 +08:00
- exec执行一段命令
2020-06-08 20:32:34 +08:00
- HTTP发送 HTTP 请求。
2017-11-24 22:56:22 +08:00
参考下面的配置:
```yaml
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:
- name: lifecycle-demo-container
image: nginx
lifecycle:
postStart:
exec:
2020-06-08 20:32:34 +08:00
command: ["/bin/sh", "-c", "echo Hello from the postStart handler> /usr/share/message"]
2017-11-24 22:56:22 +08:00
preStop:
exec:
command: ["/usr/sbin/nginx","-s","quit"]
```
postStart 在容器创建之后(但并不能保证钩子会在容器 ENTRYPOINT 之前)执行,这时候 Pod 已经被调度到某台 node 上,被某个 kubelet 管理了,这时候 kubelet 会调用 postStart 操作,该操作跟容器的启动命令是在同步执行的,也就是说在 postStart 操作执行完成之前kubelet 会锁住容器,不让应用程序的进程启动,只有在 postStart 操作完成之后容器的状态才会被设置成为 RUNNING。
PreStop 在容器终止之前被同步阻塞调用,常用于在容器结束前优雅的释放资源。
2017-11-24 22:56:22 +08:00
2020-06-08 20:32:34 +08:00
如果 postStart 或者 preStop hook 失败,将会终止容器。
2017-11-24 22:56:22 +08:00
2020-06-08 20:32:34 +08:00
## 调试 hook
2017-11-24 22:56:22 +08:00
2020-06-08 20:32:34 +08:00
Hook 调用的日志没有暴露给 Pod 的 event所以只能通过 `describe` 命令来获取,如果有错误将可以看到 `FailedPostStartHook``FailedPreStopHook` 这样的 event。
2017-11-24 22:56:22 +08:00
## 参考
2021-12-25 21:42:34 +08:00
- [Attach Handlers to Container Lifecycle Events - kuberentes.io](https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/)
- [Container Lifecycle Hooks - kubernetes.io](https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/)