我有一个 k8s cronjob 运行我的 docker 镜像
transaction-service
。
它启动并成功完成其工作。当它结束时,我希望 Pod 终止,但是......
istio-proxy
仍然徘徊在那里:
结果是:
没什么太疯狂的,但我想解决它。
我知道我应该打电话
curl -X POST http://localhost:15000/quitquitquit
但我不知道在哪里以及如何。仅当事务服务处于完成状态时,我才需要调用 quitquitquit URL。我读到了有关
preStop
生命周期钩子的内容,但我认为我需要更多 postStop
的钩子。有什么建议吗?
您有几个选择:
command: ["/bin/bash", "-c"]
args:
- |
trap "curl --max-time 2 -s -f -XPOST http://127.0.0.1:15020/quitquitquit" EXIT
while ! curl -s -f http://127.0.0.1:15020/healthz/ready; do sleep 1; done
echo "Ready!"
< your job >
apiVersion: batch/v1beta1
kind: CronJob
metadata:
...
spec:
...
jobTemplate:
spec:
template:
metadata:
annotations:
# disable istio on the pod due to this issue:
# https://github.com/istio/istio/issues/11659
sidecar.istio.io/inject: "false"
注意:注解应该在Pod的模板上,而不是在Job的模板上。
您可以使用 kubernetes 文档中提到的 TTL 机制来完成作业,这有助于删除整个 pod。
在我的 Dockerfile 中我放入了
ADD ./entrypoint.sh /entrypoint.sh
RUN ["chmod", "+x", "/entrypoint.sh"]
RUN apk --no-cache add curl
ENTRYPOINT ["/entrypoint.sh"]
我的入口点.sh 看起来像这样:
#!/bin/sh
/app/myapp && curl -X POST http://localhost:15000/quitquitquit
它有效。
我实现了一个稍微不同的解决方案来合并 onFailure 重启策略。如果 cronJob 由于失败而重新启动,它不会关闭 istio-proxy。它仅在成功完成作业或 istio 运行状况检查在最大尝试次数后失败时关闭 istio-proxy。
max_readiness_check_attempts=10
readiness_check_attempt_num=1
while ! curl -s -f http://127.0.0.1:15020/healthz/ready; do
if [ "$readiness_check_attempt_num" -ge "$max_readiness_check_attempts" ]; then
exit 0
fi
sleep 1
((attempt++))
done
< your job script >
exit_status=$?
if [ "$exit_status" -eq 0 ]; then
curl --max-time 2 -s -f -XPOST http://127.0.0.1:15020/quitquitquit
else
exit $exit_status