自定义设置ECI Pod的最大Pending时长

由于Pending状态的ECI实例(ECI Pod)是计费的,对于长时间处于Pending状态的异常Pod,如果您没有及时处理,会造成费用损失。默认情况下,ECI实例的最大Pending时长为4小时,您可以根据实际业务情况自定义设置最大Pending时长,系统会自动终止超时的ECI实例,可以在一定程度上规避因没有及时处理异常Pod而造成的费用损失。

功能说明

每个ECI实例相当于一个Pod。创建ECI Pod时,当对应的ECI实例从创建中(Scheduling)进入启动中(Pending)状态后,该ECI实例开始计费。在Pending阶段,如果出现镜像拉取失败、Volume挂载失败等问题,ECI实例会一直处于Pending状态并持续计费,您需要及时处理这类异常的ECI实例来避免费用损失。默认情况下,对于Pending时长超出4小时的ECI实例,系统会自动终止并停止计费。如果您对于时长有要求,可以自定义设置最大Pending时长。

重要

当ECI实例处于Scheduling、Pending、Restarting等状态时,对应的Pod状态(PodStatus.Phase)均为Pending。支持自定义设置的Pending时长指的是ECI实例处于Pending阶段的时长,不包括Scheduling、Restarting等阶段的时长。更多信息,请参见ECI Pod生命周期

配置说明

您可以在Pod metadata中添加k8s.aliyun.com/eci-max-pending-minute的Annotation来自定义设置Pod对应ECI实例的最大Pending时长。该Annotation的相关说明如下:

  • 该Annotation的取值范围为10~1440的整数,单位为分钟,即下限为10分钟,上限为1天。

    重要

    请根据实际业务情况合理设置最大Pending时长。如果镜像过大且没有镜像缓存的情况下,创建Pod时需要一定的时长来拉取镜像,此时如果最大Pending时长设置过短,可能会导致Pod创建失败。

  • 未添加该Annotation的情况下,默认的最大Pending时长为4小时。

  • 对于配置了initContainer,且initContainer在运行中的ECI Pod,不受该Annotation约束。

超出最大Pending时长后,系统会上报对应事件。此时,ECI实例的状态会变更为运行失败(Failed),对应的Pod状态(PodStatus.Phase)由restartPolicy决定。

  • restartPolicy为Always或OnFailure时,PodStatus.Phase为Pending。

  • restartPolicy为Never时,则PodStatus.Phase为Failed。

配置示例

  1. 创建一个设置了最大Pending时长的ECI Pod。

    kubectl create -f pending-test.yaml

    pending-test.yaml的内容示例如下,用于模拟镜像拉取失败导致Pod处于Pending状态。

    apiVersion: v1
    kind: Pod
    metadata:
      name: pending-test
      labels:
        alibabacloud.com/eci: "true"
      annotations:
        k8s.aliyun.com/eci-max-pending-minute: "10"    # 设置最大Pending时长为10分钟
    spec:
      containers:
      - image: test****-registry.example.com/eci_test/nginx:1.0  # 使用私有镜像来模拟镜像拉取失败,请根据实际替换镜像
        name: test-container
      restartPolicy: Never  # 设置重启策略为不自动重启容器
  2. 确认ECI Pod的状态。

    kubectl get pod <pod-name> -o=jsonpath='{.status.phase}'

    示例如下:

    pending时长1.png

  3. 等待一段时间,待超出设置的最大Pending时长后,确认ECI Pod的状态和事件信息。

    • 由于restartPolicy为Never,因此超时后,Pod会处于Failed状态。

      kubectl get pod <pod-name> -o=jsonpath='{.status.phase}'

      示例如下:

      pending时长2.png

    • 查看Pod事件,可以看到对应事件信息。

      kubectl get events --field-selector involvedObject.name=<pod-name>

      示例如下:

      pending时长3.png

    说明

    您也可以通过弹性容器实例控制台确认ECI实例是否为运行失败(Failed)状态,同时在实例详情页的事件页签下查看对应事件信息。