docker - 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
解决方案
正如 user2511126 在他/她的评论中提到的:
preStop 钩子不使用环境变量。我搬到了 bash 脚本,现在可以工作了
根据 kubernetes文档:
预停
在容器因 API 请求或管理事件(例如活动探测失败、抢占、资源争用等)而终止之前立即调用此钩子。如果容器已经处于终止或完成状态,则调用 preStop 挂钩失败。它是阻塞的,意味着它是同步的,所以它必须在删除容器的调用被发送之前完成。没有参数传递给处理程序。
终止行为的更详细描述可以在 Pod 的终止中找到。
不能将参数传递给处理程序,这包括环境变量。
推荐阅读
- spring-boot - 在 Stripe Dashboard Webhooks 端点中添加授权请求标头
- c# - 使用自动映射器进行复杂映射
- python - 根据另一列中的值将列的一个值映射到该列的 nan 值
- java - 如何计算字符串中的特定模式?
- symfony - Api 平台 - 替代非规范化?
- javascript - VueJs 部署问题:Chrome 缓存旧版本,不更新应用
- javascript - Highcharts:在百分比/值之间错误地呈现价格
- verdaccio - 删除 Verdaccio https 重定向
- sql - 由信号 119 终止的容器化进程
- python - 是否有任何 xarray 函数可以提取与其他文件类似的时间?