设置ECI Pod的故障处理策略

默认情况下,ECI Pod创建失败后,系统会自动重试尝试创建。如果您希望尽快得到创建结果以便及时处理故障,可以修改ECI Pod的故障处理策略。

配置说明

在虚拟节点上创建ECI Pod时,可能会因为库存不足等原因导致Pod创建失败,默认情况下,系统会自动进行重调度,尝试重新创建Pod。您可以通过添加k8s.aliyun.com/eci-fail-strategy的Annotation来修改ECI Pod的故障处理策略,设置ECI Pod创建失败后是否尝试重新创建。

重要
  • Annotation请添加在Pod的metadata下,例如:创建Deployment时,Annotation需添加在spec>template>metadata下。

  • 仅支持在创建ECI Pod时添加ECI相关Annotation来生效ECI功能,更新ECI Pod时添加或者修改ECI相关Annotation均不会生效。

k8s.aliyun.com/eci-fail-strategy的取值说明如下:

取值

说明

场景

fail-back

失败自动恢复。即Pod创建失败后自动尝试重新创建。此时,Pod会保持Pending状态,直到创建成功变为Running状态。

侧重成功率,能够接受Pod延迟交付。

fail-over

失败转移。效果等同于fail-back。

fail-fast

快速失败。Pod创建失败后直接报错。Pod显示为ProviderFailed状态,由上层编排决定是否重试,或者把Pod创建调度到普通节点。

侧重效率,希望Pod快速交付,有完善的失败处理逻辑。

说明

不推荐通过k8s.aliyun.com/eci-reschedule-enable设置重调度。

配置示例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test
  labels:
    app: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      name: nginx-test
      labels:
        app: nginx
        alibabacloud.com/eci: "true" 
      annotations:
        k8s.aliyun.com/eci-fail-strategy: "fail-fast"  #设置Pod创建失败后直接报错,不再重新创建
        k8s.aliyun.com/eci-use-specs: "ecs.c6.large"
    spec:
      containers:
      - name: nginx
        image: registry.cn-shanghai.aliyuncs.com/eci_open/nginx:1.14.2
        ports:
        - containerPort: 80

以上YAML示例中,ECI Pod的故障处理策略为fail-fast。如果Pod长时间Pending,您可以查看Pod status.reason。

  • 如果Pod status.reason为ContainerInstanceScheduleFailed,则表示ECI调度失败。此时查看Pod status condition,通过ContainerInstanceCreated的reason和message可以确定具体原因,进而采取相应措施,例如修改指定的规格,设置多可用区等。更多信息,请参见ContainerInstanceCreated

  • 如果Pod status.reason为空(fail-fast一般不会出现该情况),可以查看Pod status condition,通过ContainerInstanceCreated的status确认调度状态。

    • 如果ContainerInstanceCreated为True,则表示ECI调度成功,是Sandbox创建异常。

    • 如果ContainerInstanceCreated为False,且reason不是Creating,则表示ECI调度还未成功,需要继续等待。

以库存不足创建ECI Pod失败为例,当Pod的故障处理策略为fail-fast时,Pod status condition为ContainerInstanceCreated的示例如下:

说明

如果Pod的故障处理策略为fail-back,Pod创建失败后系统会自动尝试重调度。此时,Pod status.reason不会显示ContainerInstanceScheduleFailed,您也可以查看Pod status condition,通过ContainerInstanceCreated的reason和message确定当前调度周期内调度失败的原因。

{
    "conditions": [
        {
            "lastProbeTime": "2023-03-30T18:11:31Z",
            "lastTransitionTime": "2023-03-30T18:11:31Z",
            "message": "Create ECI failed because the specified instance is out of stock. %s",
            "reason": "ContainerGroup.NoStock",
            "status": "False",
            "type": "ContainerInstanceCreated"
        }
    ],
    "Reason":"ContainerInstanceScheduleFailed",
    "phase": "Pending"
}