重试¶
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)"]
retryPolicy 和 expression 会在每次尝试后重新评估。例如,如果您设置了 retryPolicy: OnFailure 并且第一次尝试失败,则会进行重试。如果第二次尝试产生错误,则不会再进行另一次尝试。
重试策略¶
使用 retryPolicy 来选择需要重试的失败类型:
Always: 重试所有失败的步骤OnFailure: 重试那些在Kubernetes中被标记为主容器失败的步骤OnError: 重试遇到Argo控制器错误的步骤,或其初始化或等待容器失败的步骤OnTransientError: 重试遇到定义为瞬态错误的步骤,或匹配环境变量中TRANSIENT_ERROR_PATTERN的错误。3.0及更高版本可用。
即使您同时指定了retryPolicy和expression,retryPolicy仍然适用,但在3.5或更高版本中,默认策略意味着除非您明确指定策略,否则将由表达式决定。
默认的retryPolicy是OnFailure,除非在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了解使用方法。