我的 Amazon Elastic Container Service (Amazon ECS) 服務會定期自行重新啟動。我希望 Amazon ECS 服務保持穩定。
簡短說明
由於下列其中一個原因,您的 Amazon ECS 服務可能無法穩定:
- 容器運作狀態檢查失敗。
- Elastic Load Balancing (ELB) 運作狀態檢查失敗。
- Amazon ECS 任務以非零結束代碼結束。
- 容器執行個體不滿足 Amazon ECS 任務要求。
- 容器執行個體意外終止。
- 服務中的 Amazon ECS 任務啟動失敗。
解決方法
使用 Amazon ECS 主控台上的 Amazon ECS 事件來檢查服務不穩定的原因。
容器運作狀態檢查失敗
在將應用程式部署到 Amazon ECS 之前,請使用運作狀態檢查來確保容器如預期運作。如果您的 Amazon ECS 服務突然容器運作狀態檢查失敗,請檢查應用程式日誌。如果您的應用程式使用 awslogs 驅動程式,請檢查 Amazon CloudWatch 中的日誌。
注意: 您在容器定義中指定的運作狀態檢查參數會覆寫容器映像檔中存在的 Docker 運作狀態檢查。
ELB 運作狀態檢查失敗
負載平衡器會定期在每台伺服器上執行容器執行狀況檢查,以確定可以安全地將流量引導到的伺服器。當 Amazon ECS 服務因 ELB 運作狀態檢查而失敗時,負載平衡器和服務之間可能會出現通訊問題。
若要檢查您是否正確設定了負載平衡器和 Amazon ECS 服務,請執行下列動作:
-
確認容器安全群組允許來自負載平衡器的流量。
-
在容器中執行以下命令以確保應用程式接聽正確的連接埠:
netstat -tulpn | grep LISTEN
-
確定運作狀態檢查路徑正確。
-
檢查應用程式日誌是否有錯誤。
-
對 Amazon Elastic Compute Cloud (Amazon EC2) 內的運作狀態檢查路徑執行 curl 命令。或者,在 AWS Fargate 上啟動 ECS exec 並執行 curl 命令,在容器內進行執行狀況檢查以確認回應代碼。
-
監控服務的 CPU 和記憶體指標,因為 CPU 使用率過高會導致應用程式無回應,且 ELB 運作狀態檢查失敗。
-
將最短運作狀態檢查寬限期設定為應用程式達到作用中狀態所需時間的 1.5 - 2.0 倍。
Amazon ECS 任務以非零結束代碼結束
如果容器中存在問題,則服務中的 Amazon ECS 任務會以非零結束代碼結束。所有任務必須至少具有一個必要容器。如果必要容器因任何原因結束,則整個任務將失敗,且 Amazon ECS 服務會變得不穩定。
以下結束代碼是 Amazon ECS 任務可能失敗的原因:
- 當出現應用程式錯誤時,您會收到 1 結束代碼。如需有關錯誤的詳細資訊,請查看應用程式日誌。
- 當容器的任務被迫結束 (SIGKILL) 或出現記憶體不足 (OOM) 錯誤時,您會收到 137 結束代碼。若要確認您是否遇到 OOM 問題,請查看 CloudWatch 指標。
- 當有分段錯誤時,您會收到 139 結束代碼。這通常會在應用程式嘗試存取無法使用的記憶體,或存在未設定環境變數或環境變數無效時發生。
- 當容器中的 ENTRYPOINT CMD 命令因錯誤而失敗時,您會收到 255 結束代碼。若要確認是否為這項原因,請查看 CloudWatch 指標。
注意: 您可以使用 DescribeTasks API 查看已停止任務的詳細資訊。但是,已停止任務的詳細資訊只會在結果中顯示 1 小時。
容器執行個體不滿足 Amazon ECS 任務要求
有關如何調整容器要求的詳細資訊,請參閱如何解決 Amazon ECS 中的「沒有容器執行個體滿足其所有要求」錯誤?
容器執行個體意外終止
如果您在 Amazon ECS 叢集中使用容量供應商而沒有受管終止,則容量供應商可能會終止正在執行任務的執行個體。當進行縮減動作且 AWS ECS 服務變得不穩定時,就會發生這種情況。啟動受管終止保護,以便容量供應商不會終止正在執行任務的容器執行個體。
若要啟動受管終止保護,您必須為 Auto Scaling 群組開啟執行個體縮減保護。
若要開啟縮減保護,請完成下列步驟:
- 開啟 Amazon EC2 console (Amazon EC2 主控台)。
- 在導覽窗格中,選擇 Auto Scaling Groups (Auto Scaling 群組),然後選擇您的 Auto Scaling 群組。
- 在 Details (詳細資訊) 標籤上的 Advanced configurations (進階組態) 下,選擇 Edit (編輯)。
- 在 Instance scale-in protection (執行個體縮減保護) 下,選取 Enable instance scale-in protection (啟用執行個體縮減保護)。
- 選擇 Update (更新)。
若要啟動受管終止保護,請完成以下步驟:
- 開啟 Amazon ECS console (Amazon ECS 主控台)。
- 在導覽窗格中,選取 Clusters (叢集)。
- 在 Clusters (叢集) 頁面上,選取您的叢集。
- 在 Cluster : name (叢集:名稱) 頁面上,選擇 Infrastructure (基礎架構),然後選擇 Update (更新)。
- 在 Create capacity providers (建立容量供應商) 頁面 Auto Scaling group (Auto Scaling 群組) 下的 Scaling policies (擴展政策) 下,設定下列選項:
選取 Turn on managed scaling (開啟受管擴展)。
選取 Turn on scaling protection (開啟擴展保護)。
- 選擇 Update (更新)。
注意: 請確定您使用的其他工具不會從 Auto Scaling 群組中移除 AmazonecsManaged 標籤。當工具移除標籤時,Amazon ECS 無法管理擴展。
服務內的 Amazon ECS 任務無法啟動
當您建立或更新服務時,該服務可能會不穩定,因為 Amazon ECS 任務無法提取映像檔。
若要解決此問題,請參閱以下 AWS 知識服務文章:
相關資訊
如何對 Amazon ECS 任務的容器運作狀態檢查失敗進行疑難排解?
如何解決 Amazon ECS 中容量供應商受管終止保護設定的錯誤?
為什麼我的 Amazon ECS 任務會停止?
控制 Amazon ECS 終止的執行個體
AWS 服務事件中繼資料