K8S中POD的生命周期之钩子函数

钩子函数

  • Kubernetes 中的容器生命周期钩子(lifecycle hooks)些钩子允许开发者在容器的生命周期中的特定时刻执行自定义操作。kubernetes在主容器的启动之后和停止之前提供了两个钩子函数:

    • Post Start Hook

      • 这个钩子在容器创建并成功运行之后立即执行。它可以用来执行容器启动后需要立即进行的任务,比如发送信号给其他服务,或者执行某些初始化逻辑。

      • 如果 Post Start 钩子失败,即执行的命令返回非零退出码,Kubernetes 会认为容器启动失败,并根据容器的重启策略决定是否重启容器。

    • Pre Stop Hook

      • 这个钩子在容器即将终止之前执行。它通常用于执行清理工作,如保存状态、优雅地关闭服务、释放资源等。

      • Pre Stop 钩子提供了一种优雅关闭容器的方式。如果容器在 Pre Stop 钩子执行期间没有停止,Kubernetes 将等待一段时间(默认为 30 秒)之后,发送 SIGKILL 信号强制终止容器。

Kubernetes 中容器生命周期钩子处理器支持的三种动作类型:ExecTCPSocketHTTPGet

  • Exec 命令

    • 这个动作类型允许在容器内执行一个命令行命令。

    • 如果命令执行成功(退出状态码为0),钩子继续执行;如果失败(非零退出状态码),则容器将被重启。

bash 复制代码
lifecycle:
  postStart:
    exec:
      command: ["cat", "/tmp/healthy"]

TCPSocket

  • 这个动作类型尝试在容器内访问指定的 TCP 端口。

  • 如果能够建立连接,则钩子动作成功;否则,容器将被重启。

bash 复制代码
lifecycle:
  postStart:
    tcpSocket:
      port: 8080

HTTPGet

  • 这个动作类型在容器内向指定的 URL 发起 HTTP GET 请求。

  • 如果请求成功(HTTP 状态码为 200-399),钩子动作成功;如果失败,则容器将被重启。

bash 复制代码
lifecycle:
  postStart:
    httpGet:
      path: /healthz  # URI地址
      port: 80        # 端口号
      host: 192.168.110.100  # 主机地址
      scheme: HTTP    # 支持的协议,可以是 HTTP 或 HTTPS
钩子函数使用实例(Exec为例)
bash 复制代码
[root@K8s-master-01 ~]# vim pod-hook-exec.yaml
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-hook-exec
  namespace: test
spec:
  containers:
  - name: main-container
    image: nginx:1.17.1
    ports:
    - name: nginx-port
      containerPort: 80
    lifecycle:
      postStart:
        exec:
          command: ["/bin/bash", "-c", "echo 'postStart...' > /usr/share/nginx/html/index.html"]
      preStop:
        exec:
          command: ["/usr/sbin/nginx", "-s", "quit"]

-- 容器 (`main-container`):
  - 使用 `nginx:1.17.1` 镜像。
  - 暴露端口 80,命名为 `nginx-port`。
-- 生命周期钩子 (`lifecycle`):
  - 这个字段包含两个钩子:`postStart` 和 `preStop`。
-- Post Start 钩子:
  - 这个钩子在容器创建并启动之后立即执行。
  - 通过 `exec` 动作执行命令:使用 `/bin/bash -c` 执行一个 shell 命令,该命令输出字符串 `'postStart...'` 到 Nginx 的网页根目录下的 `    	  index.html` 文件。这将修改 Nginx 服务器的默认首页内容。
-- Pre Stop 钩子:
  - 这个钩子在容器被停止之前执行。
  - 同样使用 `exec` 动作执行命令:发送 `nginx -s quit` 命令给 Nginx 服务器以优雅地关闭服务。这允许 Nginx 完成当前的请求并关闭监听的套接字,     而不是被强制终止。

测试:

bash 复制代码
[root@k8s-master ~]# kubectl create ns test
namespace/test created
[root@k8s-master ~]# kubectl apply -f pod-hook-exec.yaml 
pod/pod-hook-exec created

[root@k8s-master ~]# kubectl get pods  -n test
NAME            READY   STATUS              RESTARTS   AGE
pod-hook-exec   0/1     ContainerCreating   0          16s
[root@k8s-master ~]# kubectl get pods  -n test -w
NAME            READY   STATUS              RESTARTS   AGE
pod-hook-exec   0/1     ContainerCreating   0          20s
pod-hook-exec   1/1     Running             0          30s
^C[root@k8s-master ~]# kubectl get pods  -n test -o wide
NAME            READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
pod-hook-exec   1/1     Running   0          40s   10.244.169.129   k8s-node2   <none>           <none>
[root@k8s-master ~]# curl 10.244.169.129:80
postStart...
相关推荐
openFuyao27 分钟前
AI Native基础设施的目标形态和它存在的一些挑战有哪些?K8s驱动异构算力面临挑战,下一代的K8s是渐进式优化,还是革命式的驱动AI的发展
人工智能·容器·kubernetes
Albert Edison33 分钟前
【Docker】镜像仓库(Registry)
运维·docker·容器
小猿姐33 分钟前
MongoDB Kubernetes Operator 实测对比:Community、Percona 与 KubeBlocks,谁更适合团队落地?
数据库·mongodb·kubernetes
IT策士35 分钟前
第 41 篇 k8s之监控:Metrics Server 与 Prometheus 快速上手
容器·kubernetes·prometheus
这个DBA有点耶1 小时前
当时间数据不再只是“曲线”:聊聊时序数据库和融合分析
数据库·sql·程序人生·云原生·运维开发·时序数据库·业界资讯
呆萌的代Ma1 小时前
解决docker网络问题,通过GitHub Actions打包dockerfile
docker·容器·github
qq_452396231 小时前
第十七篇:《Docker 日志管理:驱动配置与集中收集》
运维·docker·容器
张青贤1 小时前
centos7通过kubekey部署k8s集群
kubernetes·etcd·kubekey
SilentSamsara1 小时前
Python 服务的 K8s 部署:HPA/ConfigMap/Secret 完整配置
开发语言·python·青少年编程·容器·kubernetes
Plastic garden2 小时前
K8s(1)前置ansible准备环境
容器·kubernetes·ansible