跳至内容

重试

Argo Workflows 为失败步骤的重试提供了多种选项。

WorkflowSpec中配置retryStrategy

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: retry-container-
spec:
  entrypoint: retry-container
  templates:
  - name: retry-container
    retryStrategy:
      limit: "10"
    container:
      image: python:alpine3.6
      command: ["python", -c]
      # fail with a 66% probability
      args: ["import random; import sys; exit_code = random.choice([0, 1, 1]); sys.exit(exit_code)"]

retryPolicyexpression 会在每次尝试后重新评估。例如,如果您设置了 retryPolicy: OnFailure 并且第一次尝试失败,则会进行重试。如果第二次尝试产生错误,则不会再进行另一次尝试。

重试策略

使用 retryPolicy 来选择需要重试的失败类型:

  • Always: 重试所有失败的步骤
  • OnFailure: 重试那些在Kubernetes中被标记为主容器失败的步骤
  • OnError: 重试遇到Argo控制器错误的步骤,或其初始化或等待容器失败的步骤
  • OnTransientError: 重试遇到定义为瞬态错误的步骤,或匹配环境变量TRANSIENT_ERROR_PATTERN的错误。3.0及更高版本可用。

即使您同时指定了retryPolicyexpressionretryPolicy仍然适用,但在3.5或更高版本中,默认策略意味着除非您明确指定策略,否则将由表达式决定。

默认的retryPolicyOnFailure,除非在3.5或更高版本中同时提供了表达式时,它会变为Always。通过这张图可能更容易理解。

flowchart LR
  start([Will a retry be attempted])
  start --> policy
  policy(Policy Specified?)
  policy-->|No|expressionNoPolicy
  policy-->|Yes|policyGiven
  policyGiven(Expression Specified?)
  policyGiven-->|No|policyGivenApplies
  policyGiven-->|Yes|policyAndExpression
  policyGivenApplies(Supplied Policy)
  policyAndExpression(Supplied Policy AND Expression)
  expressionNoPolicy(Expression specified?)
  expressionNoPolicy-->|No|onfailureNoExpr
  expressionNoPolicy-->|Yes|version
  onfailureNoExpr[OnFailure]
  onfailure[OnFailure AND Expression]
  version(Workflows version)
  version-->|3.4 or earlier|onfailure
  always[Only Expression matters]
  version-->|3.5 or later|always

一个重试策略示例:

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: retry-on-error-
spec:
  entrypoint: error-container
  templates:
  - name: error-container
    retryStrategy:
      limit: "2"
      retryPolicy: "Always"
    container:
      image: python
      command: ["python", "-c"]
      # fail with a 80% probability
      args: ["import random; import sys; exit_code = random.choice(range(0, 5)); sys.exit(exit_code)"]

条件性重试

v3.2 及更高版本

你也可以使用expression来控制重试次数。 这是一个可以访问以下变量的expression表达式:

  • lastRetry.exitCode: 最后一次重试的退出代码,如果不可用则为"-1"
  • lastRetry.status: 最后一次重试的状态阶段: 错误(Error), 失败(Failed)
  • lastRetry.duration: 最后一次重试的持续时间,单位为秒
  • lastRetry.message: 最后一次重试输出的消息(从3.5版本开始可用)

如果expression的值为false,则该步骤将不会重试。

expression的结果将与retryPolicy进行逻辑运算。两者都必须为真才会触发重试。

查看example了解使用方法。

回退机制

您可以通过backoff配置重试之间的延迟时间。查看example了解使用方法。


有问题吗?

Search on GitHub Discussions and Slack.