Pending の Elastic Container Instance (ECI) Pod は課金対象です。異常な Pod が長時間 Pending のまま迅速に処理されない場合、不要なコストが発生することがあります。デフォルトでは、ECI インスタンスの最大 Pending 期間は 4 時間です。ビジネス要件に基づいて、最大 Pending 期間をカスタマイズできます。この期間を超えた ECI インスタンスはシステムによって自動的に終了され、異常な Pod による不要なコストの発生が回避されます。
概要
各 ECI インスタンスは 1 つの Pod に対応します。ECI Pod を作成すると、対応する ECI インスタンスが Scheduling から Pending に移行した後に課金が開始されます。Pending フェーズ中に、イメージのプル失敗やボリュームのマウント失敗などの問題が発生した場合、ECI インスタンスは Pending のままとなり、課金が継続されます。デフォルトでは、ECI インスタンスの Pending 期間が 4 時間を超えると、システムが自動的にインスタンスを終了し、課金を停止します。特定の時間要件がある場合は、最大 Pending 期間をカスタマイズできます。
ECI インスタンスが Scheduling、Pending、または Restarting の状態にあるとき、対応する Pod のステータス (PodStatus.Phase) は常に Pending になります。カスタマイズ可能な Pending 期間は、ECI インスタンスが Pending の状態にある時間のみを指します。Scheduling または Restarting の状態にある時間は含まれません。詳細については、「ECI Pod のライフサイクル」をご参照ください。
設定
Pod のメタデータに k8s.aliyun.com/eci-max-pending-minute アノテーションを追加することで、対応する ECI インスタンスの最大 Pending 期間をカスタマイズできます。
-
値は 10 から 1,440 分 (1 日) までの整数でなければなりません。
重要ビジネス要件に基づいて、合理的な最大 Pending 期間を設定してください。イメージが大きく、イメージキャッシュが利用できない場合、イメージのプルにかなりの時間がかかることがあります。最大 Pending 期間が短すぎると、イメージのプルが完了する前に Pod が終了してしまう可能性があります。
-
このアノテーションが追加されていない場合、デフォルトの最大 Pending 期間は 4 時間です。
-
このアノテーションは、実行中の init コンテナを持つ ECI Pod には適用されません。
最大 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 # 再起動ポリシーを Never に設定します。 -
ECI Pod のステータスを確認します。
kubectl get pod <pod-name> -o=jsonpath='{.status.phase}'出力例:
:~$ kubectl get pod NAME READY STATUS RESTARTS AGE pending-test 0/1 ImagePullBackOff 0 25s :~$ kubectl get pod pending-test -o=jsonpath='{.status.phase}' Pending -
指定された最大 Pending 期間が経過した後、ECI Pod のステータスとイベントを確認します。
-
restartPolicyがNeverに設定されているため、タイムアウト後に Pod はFailedになります。kubectl get pod <pod-name> -o=jsonpath='{.status.phase}'出力例:
:~$ kubectl get pod NAME READY STATUS RESTARTS AGE pending-test 0/1 ContainerInstanceStartingFailed 0 15m :~$ kubectl get pod pending-test -o=jsonpath='{.status.phase}' Failed -
Pod のイベントを確認します。
kubectl get events --field-selector involvedObject.name=<pod-name>出力例:
Warning Failed pod/pending-test Error: ErrImagePull Normal BackOff pod/pending-test Back-off pulling image "test xxx om/eci_test/nginx:1.0" Warning Failed pod/pending-test Error: ImagePullBackOff Warning StartingFailed pod/pending-test [eci.containergroup]eci starting failed: The Eci pod stuck in Pending exceed eci-max-pending-minute 10, will be released.
説明Elastic Container Instance コンソールを使用して、ECI インスタンスが Failed の状態にあるかを確認することもできます。インスタンスの詳細ページで、イベント タブを開いてイベントを表示します。
-