【k8s系列十】k8s应用节点的钩子

319 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情

钩子

pod hook(钩子) 是有k8s管理的kubelet发起的. 当容器中的进程启动前或者终止前运行. 这时包含在容器的生命周期之中的,可以同时为pod中的所有容器配置hook

1. 钩子的类型

1) exec: 执行一段命令

2) http: 发送http请求

2. 钩子的案例分析

第一步: 准备资源清单

apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-hook-pod
spec:
  containers:
  - name: lifecycle-hook-container
    image: wangyanglinux/myapp:v1
    imagePullPolicy: IfNotPresent
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
      preStop:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the poststop handler > /usr/share/message"]

解析一下这个资源清单

  • spec中创建了一个容器,容器名是lifecycle-hook-container, 使用的镜像是wangyanglinux/myapp:v1, 镜像的策略是IfNotPresent

    • lifecycle定义了lifecycle-hook-container这个容器的生命周期

      • postStart: 开始前钩子函数

        • exec: 代表执行脚本

          • command: 执行脚本的命令. 命令是像/usr/share/message文件中打印一句话"echo Hello from the postStart handler"
      • preStop: 停止前钩子函数

        • exec: 表示结束前使用的钩子函数也是脚本

          • command: 表示执行的脚本明星. 命令是想/usr/share/message中打印一句话, 内容是"echo Hello from the poststop handler"

资源清单分析: 这个pod创建以后, 会创建一个应用容器, 这个容器有一个开始前钩子和结束前钩子. 钩子的内容都是像文件中打印一段文本.

第二步: 创建pod

kubectl create -f lifecycle-hook-pod.yaml

然后进入到pod的容器里面,可以看到文件中已经打印了启动前的脚本内容

kubectl exec lifecycle-hook-pod -c lifecycle-hook-container -it -- /bin/sh

image

可以看到启动前脚本已经执行了. 对于启动后脚本,我们可以通过无限循环打印文件内容来看效果.

while 2>1;
do
  cat /usr/share/message
done

另起一个终端, 执行delete pod的命令

kubectl delete lifecycle-hook-pod

image

这时看另一个终端的情况

image 终端可以看到, 在终止之前打印了终止前脚本. 因为是无限循环打印未见, 所以会看到打印了很多次.

\