看房子建设进度的网站,软件开发费用明细,电脑做apk的网站h5,网站服务器在哪里买好Pod Hook
我们知道Pod是Kubernetes集群中的最小单元#xff0c;而 Pod 是有容器组组成的#xff0c;所以在讨论 Pod 的生命周期的时候我们可以先来讨论下容器的生命周期。
实际上 Kubernetes 为我们的容器提供了生命周期钩子的#xff0c;就是我们说的Pod Hook#xff0c…Pod Hook
我们知道Pod是Kubernetes集群中的最小单元而 Pod 是有容器组组成的所以在讨论 Pod 的生命周期的时候我们可以先来讨论下容器的生命周期。
实际上 Kubernetes 为我们的容器提供了生命周期钩子的就是我们说的Pod HookPod Hook 是由 kubelet 发起的当容器中的进程启动前或者容器中的进程终止之前运行这是包含在容器的生命周期之中。我们可以同时为 Pod 中的所有容器都配置 hook。
Kubernetes 为我们提供了两种钩子函数
PostStart这个钩子在容器创建后立即执行。但是并不能保证钩子将在容器ENTRYPOINT之前运行因为没有参数传递给处理程序。主要用于资源部署、环境准备等。不过需要注意的是如果钩子花费太长时间以至于不能运行或者挂起 容器将不能达到running状态。PreStop这个钩子在容器终止之前立即被调用。它是阻塞的意味着它是同步的 所以它必须在删除容器的调用发出之前完成。主要用于优雅关闭应用程序、通知其他系统等。如果钩子在执行期间挂起 Pod阶段将停留在running状态并且永不会达到failed状态。
如果PostStart或者PreStop钩子失败 它会杀死容器。所以我们应该让钩子函数尽可能的轻量。当然有些情况下长时间运行命令是合理的 比如在停止容器之前预先保存状态。
另外我们有两种方式来实现上面的钩子函数
Exec - 用于执行一段特定的命令不过要注意的是该命令消耗的资源会被计入容器。HTTP - 对容器上的特定的端点执行HTTP请求。
示例1 环境准备
以下示例中定义了一个Nginx Pod其中设置了PostStart钩子函数即在容器创建成功后写入一句话到/usr/share/message文件中。
apiVersion: v1
kind: Pod
metadata:name: hook-demo1
spec:containers:- name: hook-demo1image: nginxlifecycle:postStart:exec:command: [/bin/sh, -c, echo Hello from the postStart handler /usr/share/message]示例2 优雅删除资源对象
当用户请求删除含有 pod 的资源对象时如Deployment等K8S 为了让应用程序优雅关闭即让应用程序完成正在处理的请求后再关闭软件K8S提供两种信息通知
默认K8S 通知 node 执行docker stop命令docker 会先向容器中PID为1的进程发送系统信号SIGTERM然后等待容器中的应用程序终止执行如果等待时间达到设定的超时时间或者默认超时时间30s会继续发送SIGKILL的系统信号强行 kill 掉进程。使用 pod 生命周期利用PreStop回调函数它执行在发送终止信号之前。
默认所有的优雅退出时间都在30秒内。kubectl delete 命令支持 --grace-periodseconds选项这个选项允许用户用他们自己指定的值覆盖默认值。值’0’代表 强制删除 pod. 在 kubectl 1.5 及以上的版本里执行强制删除时必须同时指定 --force --grace-period0。
强制删除一个 pod 是从集群状态还有 etcd 里立刻删除这个 pod。 当 Pod 被强制删除时 api 服务器不会等待来自 Pod 所在节点上的 kubelet 的确认信息pod 已经被终止。在 API 里 pod 会被立刻删除在节点上 pods 被设置成立刻终止后在强行杀掉前还会有一个很小的宽限期。
以下示例中定义了一个Nginx Pod其中设置了PreStop钩子函数即在容器退出之前优雅的关闭 Nginx:
apiVersion: v1
kind: Pod
metadata:name: hook-demo2
spec:containers:- name: hook-demo2image: nginxlifecycle:preStop:exec:command: [/usr/sbin/nginx,-s,quit]---
apiVersion: v1
kind: Pod
metadata:name: hook-demo2labels:app: hook
spec:containers:- name: hook-demo2image: nginxports:- name: webportcontainerPort: 80volumeMounts:- name: messagemountPath: /usr/share/lifecycle:preStop:exec:command: [/bin/sh, -c, echo Hello from the preStop Handler /usr/share/message]volumes:- name: messagehostPath:path: /tmp另外Hook调用的日志没有暴露个给 Pod 的 event所以只能通过describe命令来获取如果有错误将可以看到FailedPostStartHook或FailedPreStopHook这样的 event。