上次说了静态的pod,静态pod也可以说在kubernetes中一种特殊的pod,它的特殊主要是它是由特定的节点的kubelet来进行管理的。不会通过master节点的apiserver来进行管理,yaml/json到mainfest路径下面就会自动创建pod,如果需要删除的话只能把yaml/json文件移除。pod也是有生命周期,我们都知道pod是kubernetes的最小调度单元,而pod是由容器组成。pod钩子(生命周期时间附加操作器)是什么概念。
由 kubelet 发起的,当容器中的进程启动前或者容器中的进程终止之前运行,这是包含在容器的生命周期之中。
容器创建成功后,运行前的任务,用于资源部署、环境准备等。异步非堵塞。不过需要注意的是如果钩子花费太长时间以至于不能运行或者挂起, 容器将不能达到running状态。
在容器被终止前的任务,用于优雅关闭应用程序、通知其他系统等等。同步阻塞。如果钩子在执行期间挂起, Pod阶段将停留在running状态并且永不会达到failed状态。 当用户请求删除含有pod的资源对象时(如RC、deployment等),K8S为了让应用程序优雅关闭(即让应用程序完成正在处理的请求后,再关闭软件),K8S提供两种信息通知:
postStart命令写了一个message文件在容器的/usr/share目录里面。preStop命令优雅的退出nginx。如果容器因为失败而退出这是非常有用的。
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-post
spec:
containers:
- name: lifecycle-post-container-pod
image: nginx
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
preStop:
exec:
command: ["/usr/sbin/nginx","-s","quit"]
kubectl apply -f post.yaml
kubectl get pods
进入容器的命令 exec
kubectl exec -it lifecycle-post -- /bin/bash
cat /usr/share/message
kubectl delete 命令支持 --grace-period=选项,这个选项允许用户用他们自己指定的值覆盖默认值。值'0'代表 强制删除 pod. 在 kubectl 1.5 及以上的版本里,执行强制删除时必须同时指定 --force --grace-period=0。 新建立abc.yaml
apiVersion: v1
kind: Pod
metadata:
name: stop-demo2
labels:
app: hook
spec:
containers:
- name: stop-demo2
image: nginx
ports:
- name: webport
containerPort: 80
volumeMounts:
- name: message
mountPath: /usr/share/
lifecycle:
preStop:
exec:
command: ['/bin/sh', '-c', 'echo Hello from the preStop Handler > /usr/share/message']
volumes:
- name: message
hostPath:
path: /tmp
删除pod,master节点本身是不做pod处理的都分到了node节点
kubectl delete -f abc.yaml
删除pod,然后在node1节点上查看是否输出
#在node节点查看
cat /tmp/message
PS:为了掩饰所以提供了挂载方便查看删除后的优雅处理输出了一段话,但是实际的生产中最好的方式就是关闭容器的服务。PostStart 和 PreStop的使用方法其实不难。k8s都是命令的集合用多了自然熟悉。