cronjob 完成后终止 istio-proxy

问题描述 投票:0回答:4

我有一个 k8s cronjob 运行我的 docker 镜像

transaction-service

它启动并成功完成其工作。当它结束时,我希望 Pod 终止,但是......

istio-proxy
仍然徘徊在那里:

containers

结果是:

unready pod

没什么太疯狂的,但我想解决它。

我知道我应该打电话

curl -X POST http://localhost:15000/quitquitquit

但我不知道在哪里以及如何。仅当事务服务处于完成状态时,我才需要调用 quitquitquit URL。我读到了有关

preStop
生命周期钩子的内容,但我认为我需要更多
postStop
的钩子。有什么建议吗?

kubernetes istio kubernetes-cronjob
4个回答
8
投票

您有几个选择:

  1. 在您的作业/cronjob 规范中,添加以下行以及紧随其后的您的作业:
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 >
  1. 在 Job/Cronjob 定义中的 Pod 级别禁用 Istio 注入:
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的模板上。


0
投票

您可以使用 kubernetes 文档中提到的 TTL 机制来完成作业,这有助于删除整个 pod。


0
投票

在我的 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

它有效。


0
投票

我实现了一个稍微不同的解决方案来合并 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
© www.soinside.com 2019 - 2024. All rights reserved.