首页 > 解决方案 > kubernetes prestop 钩子不适用于环境变量

问题描述

我有一个如下的部署模板。但是 prestop 钩子根本没有被执行。这里的想法是在 pod 终止之前将 zookeeper 节点设置为离线。

我正在运行kubectl rollout来重新启动 pod。而旧 pod 是在它终止时 prestop 不运行。有人可以检查一下有什么问题吗?

基本上它在成功停止的情况下如何执行?我需要这个功能,因为这里涉及到 zookeeper,并且 api 连接到 zookeeper 以发送请求。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: abcd
  labels:
    app: abcd
spec:
  replicas: 1
  selector:
    matchLabels:
      app: abcd
  template:
    metadata:
      labels:
        app: abcd
    spec:
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
#      terminationGracePeriodSeconds: 1
      containers:
      - name: se
        image: "xxx"
        lifecycle:
          preStop:
            exec:
              command: ["zookeepercli","--servers","zk-hs", "-c", "set", "$HOSTNAME", "offline"]
        ports:
        - containerPort: 2345
      - name: pe-1
        image: "xxx"
        lifecycle:
          preStop:
            exec:
              command: ["zookeepercli","--servers","zk-hs", "-c", "set", "$HOSTNAME", "offline"]
        ports:
        - containerPort: 2313

标签: dockerkubernetes

解决方案


正如 user2511126 在他/她的评论中提到的:

preStop 钩子不使用环境变量。我搬到了 bash 脚本,现在可以工作了

根据 kubernetes文档

预停

在容器因 API 请求或管理事件(例如活动探测失败、抢占、资源争用等)而终止之前立即调用此钩子。如果容器已经处于终止或完成状态,则调用 preStop 挂钩失败。它是阻塞的,意味着它是同步的,所以它必须在删除容器的调用被发送之前完成。没有参数传递给处理程序。

终止行为的更详细描述可以在 Pod 的终止中找到。

不能将参数传递给处理程序,这包括环境变量。


推荐阅读