由于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。
配置示例
创建一个设置了最大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 # 设置重启策略为不自动重启容器
确认ECI Pod的状态。
kubectl get pod <pod-name> -o=jsonpath='{.status.phase}'
示例如下:
等待一段时间,待超出设置的最大Pending时长后,确认ECI Pod的状态和事件信息。
由于restartPolicy为Never,因此超时后,Pod会处于Failed状态。
kubectl get pod <pod-name> -o=jsonpath='{.status.phase}'
示例如下:
查看Pod事件,可以看到对应事件信息。
kubectl get events --field-selector involvedObject.name=<pod-name>
示例如下:
说明您也可以通过弹性容器实例控制台确认ECI实例是否为运行失败(Failed)状态,同时在实例详情页的事件页签下查看对应事件信息。