探针的生命周期
docker
创建:在创建阶段,你需要选择一个镜像来运行你的应用。这个镜像可以是公开的,如 Docker Hub 上的镜像,也可以是你自己创建的自定义镜像。创建自己的镜像通常需要编写一个 Dockerfile,这个文件定义了创建镜像所需的所有步骤,包括基础镜像、需要安装的软件包以及需要运行的命令。
运行:运行阶段是容器生命周期中最活跃的阶段。在此阶段,容器会运行定义在 Dockerfile 中的命令。你可以通过命令行工具如 Docker CLI,或者通过编排工具如 Kubernetes 来启动容器。一旦容器开始运行,它就会持续运行,直到进程结束或者被明确停止。
暂停和恢复:在某些情况下,你可能需要暂时停止容器的运行。这可以通过 Docker CLI 的 pause 命令来完成。当你准备恢复容器的运行时,可以使用 unpause 命令。这些命令可以让你在不完全停止容器的情况下,暂时释放一些系统资源。
停止:当你不再需要运行容器时,可以使用 Docker CLI 的 stop 命令来停止它。这会结束容器中的所有进程,并释放所有使用的系统资源。在某些情况下,你可能希望容器在完成一些任务后自动停止。这可以通过在 Dockerfile 中定义的命令来实现。
删除:如果你确定不再需要一个容器,可以使用 Docker CLI 的 rm 命令来删除它。这会从你的系统中完全移除容器,并释放所有相关的资源。
k8s
Pod 调度:一旦你创建了一个 Pod,Kubernetes 的调度器会找到一个合适的节点来运行这个 Pod。这个阶段,Pod 的状态为 Pending。
Pod 初始化:在 Pod 被调度到一个节点后,kubelet 会开始创建和启动 Pod 中的每个容器。对于每个容器,kubelet 会拉取所需的镜像(如果本地没有的话),然后运行这个镜像创建容器,最后执行用户指定的命令。如果 Pod 配置了 Init 容器,那么这些容器会在应用容器之前按顺序启动。
容器运行:一旦所有的容器都启动了,Pod 就进入 Running 状态。在运行过程中,kubelet 会定期执行用户配置的探针(如果有的话)来监控容器的健康状态。如果某个容器的探针检查失败,kubelet 可能会根据探针的配置来重启这个容器或者整个 Pod。
容器终止:当 Pod 要被删除时,或者 Pod 中的某个容器完成了它的任务并退出时,这个容器就进入终止阶段。在这个阶段,kubelet 会首先发送 SIGTERM 信号给容器中的进程,然后等待一段时间,最后如果进程还在运行,kubelet 就会发送 SIGKILL 信号强制终止这个进程。
Pod 删除:当所有的容器都终止后,Pod 就会被 kubelet 删除,并从 API server 中删除。删除后,这个 Pod 的所有资源都会被清理掉,包括日志、挂载的卷等。
流程图
prestop
我们添加 lifecycle 字段来添加一些生命周期钩子:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app:1.0.0
ports:
- containerPort: 8080
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
preStop:
exec:
command: ["/bin/sh", "-c", "nginx -s quit; while killall -0 nginx; do sleep 1; done"]
在这个配置中,我们添加了两个生命周期钩子。postStart 钩子就像是一个欢迎仪式,当容器创建后,它会打印一条欢迎消息。preStop 钩子则像是一个礼貌的道别,它会优雅地关闭 nginx 服务,然后等待所有的 nginx 进程退出。