Amazon Elastic Container Service (Amazon ECS) 是一項高度可擴展的快速容器管理服務,可輕鬆運行、停止和管理集羣上的 Docker 容器。
- 利用 Amazon ECS,可以通過簡單的 API 調用來啓動和停止基於容器的應用程序,可以從集中式服務獲取集羣狀態,並可以訪問許多熟悉的 Amazon EC2 功能
- 可以根據資源需求、隔離策略和可用性要求來安排容器在集羣中的位置。藉助ECS,無需操作自己的集羣管理和配置管理系統,也無需擔心擴展管理基礎設施。
- ECS 可用於創建一致的部署和構建體驗,在微服務模型上構建先進的應用程序架構
- ECS集成了Elastic Container Registry、Elastic Load Balancing、Elastic Block Store、Elastic Network Interfaces、Virtual Private Cloud、IAM 和 CloudTrail,可爲您提供運行各種容器化應用程序或服務的完整解決方案
Amazon Elastic Container Registry (Amazon ECR) 是一項AWS Docker 容器註冊表服務,可讓開發人員輕鬆存儲、管理和部署 Docker 容器映像。
啓動類型
ECS支持兩種啓動類型:Fargate和EC2。
Fargate 啓動類型
Fargate 啓動類型只需定義任務,無需預置和管理後臺基礎設施,即可運行容器化的應用程序。
EC2 啓動類型
EC2 啓動類型允許在您管理的 EC2 實例集羣上運行容器化的應用程序。
您可以使用 Fargate 啓動類型啓動服務或任務,運行在ECS 管理的無服務器基礎設施上,不必管理 Amazon EC2 實例服務器或集羣。若要進行更多控制,可以使用 EC2 啓動類型。
本文以部署Angular 9集成Spring Boot 2詳解中的Spring Boot和Angular應用爲例,利用Fargate 啓動類型來啓動ECS 容器。
創建Docker Image
下面分別是Spring Boot、Angular的Dockerfile文件:
Dockerfile.spring
FROM openjdk:8-jdk-slim
WORKDIR app
ARG APPJAR=target/heroes-api-1.0.0.jar
COPY ${APPJAR} app.jar
ENTRYPOINT ["java","-jar","app.jar"]
Dockerfile.angular
FROM httpd:2.4
ARG DISTPATH=./dist/
ARG CONFFILE=./heroes-httpd.conf
COPY ${DISTPATH} /usr/local/apache2/htdocs/
COPY ${CONFFILE} /usr/local/apache2/conf/httpd.conf
運行以下命令獲取httpd.conf:
docker run --rm httpd:2.4 cat /usr/local/apache2/conf/httpd.conf > heroes-httpd.conf
修改配置,啓用proxy_module、proxy_http_module、rewrite_module,在配置中添加如下內容:
ProxyPreserveHost on
ProxyPass "/api" "http://127.0.0.1:8080/api"
ProxyPa***everse "/api" "http://127.0.0.1:8080/api"
RewriteEngine on
RewriteRule ^/$ /en/index.html
# If an existing asset or directory is requested go to it as it is
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]
# If the requested resource doesn't exist, use index.html
RewriteRule ^/zh /zh/index.html
RewriteRule ^/en /en/index.html
我們將在一個任務中包含這兩個image,使用apache代理後臺地址。
構建Image
執行如下命令構建Image:
docker build --build-arg APPJAR=heroes-api-1.0.0.jar -f Dockerfile.spring -t heroes-api .
docker build -f Dockerfile.angular -t heroes-web .
推送Image
- 創建ECR存儲庫
首先創建兩個ECR存儲庫,可以從控制檯創建,也可以使用如下AWS CLI命令:
aws ecr create-repository --repository-name heroes/heroes-api
aws ecr create-repository --repository-name heroes/heroes-web
- 登錄ECR存儲庫
執行如下命令:
`aws ecr get-login --no-include-email`
或
aws ecr get-login-password | docker login --username AWS --password-stdin 888888888888.dkr.ecr.cn-north-1.amazonaws.com.cn
- 標記image
docker tag heroes-api:latest 888888888888.dkr.ecr.cn-north-1.amazonaws.com.cn/heroes/heroes-api:latest
docker tag heroes-web:latest 888888888888.dkr.ecr.cn-north-1.amazonaws.com.cn/heroes/heroes-web:latest
- 推送Image
docker push 888888888888.dkr.ecr.cn-north-1.amazonaws.com.cn/heroes/heroes-api:latest
docker push 888888888888.dkr.ecr.cn-north-1.amazonaws.com.cn/heroes/heroes-web:latest
創建集羣
Amazon ECS 集羣是任務或服務的邏輯分組。您可以在一個賬戶中創建多個集羣以保持資源獨立。
創建Fargate集羣非常簡單,進入ECS集羣控制檯,點擊“創建集羣”,選擇“僅限聯網”集羣模板,點擊“下一步”,然後輸入集羣名稱"heroes",點擊“創建”即可。
創建任務定義
任務定義類似於應用程序的藍圖,需要任務定義才能在Amazon ECS 中運行 Docker 容器。
可在Fargate任務定義中指定的一些參數:
- 用於任務的容器Docker 映像
- 用於任務的 CPU 和內存數量
- 任務的日誌記錄配置
- 任務使用的 IAM 角色
- 任務中用於容器的數據卷
- 容器在啓動時應運行的命令
執行以下步驟創建任務定義:
- 進入ECS 任務定義控制檯,點擊創建任務定義
- 選擇FARGATE啓動類型,點擊下一步
- 在配置任務和容器定義頁面中,輸入任務定義名稱(heroes),選擇任務角色,配置任務內存、CPU
內存、CPU的有效的組合
CPU 值 | 內存值 (MiB) |
---|---|
256 (.25 vCPU) | 512 MB、1 GB、2 GB |
512 (.5 vCPU) | 1 GB、2 GB、3 GB、4 GB |
1024 (1 vCPU) | 2 GB、3 GB、4 GB、5 GB、6 GB、7 GB、8 GB |
2048 (2 vCPU) | 4GB 到 16GB(以1GB爲增量) |
4096 (4 vCPU) | 8GB 到 30GB(以1GB爲增量) |
容器存儲與共享卷
Fargate 啓動類型的任務的最大容器存儲爲10GB,多個容器使用的共享卷的最大大小爲4GB。若要添加共享卷,在卷配置部分點擊“添加捲”,輸入卷名稱後點擊“添加”即可。注意,任務存儲是短暫存儲。Fargate 任務停止後,該存儲將被刪除。
添加容器
接下來,在容器定義部分點擊“添加容器”按鈕,添加heroes-api和heroes-web容器:
在高級容器配置下部的“存儲和日誌記錄”部分可以添加掛載點和配置日誌:
Fargate任務默認記錄日誌到CloudWatch Log,可以指定每個容器的日誌組名稱。
最後,點擊“創建”,完成任務定義。
創建Service
服務可在 Amazon ECS 集羣中同時運行和管理指定數量的任務定義實例。如果任務出於任何原因失敗或停止,服務計劃程序將啓動另一個任務定義實例來替換它並根據所用的計劃策略在服務中保留預期數量的任務。
除了在服務中保留預期數量的任務之外,還可選擇藉助負載均衡器運行您的服務。負載均衡器將在與服務關聯的各個任務間分配流量。
在ECS控制檯,從集羣和任務定義均可創建服務。以任務定義爲例,步驟如下:
配置基本參數
選中heroes任務定義,然後點擊操作 -> 創建服務,在配置服務頁面填充以下參數:
- 啓動類型:FARGATE
- 集羣:heroes
- 服務名稱:heroes
- 任務數:1
- 部署類型:滾動更新
點擊下一步。
網絡配置
在VPC 和安全組部分,選擇集羣 VPC、子網。默認會自動生成一個安全組名稱,您可以點擊編輯,修改安全組名稱,或者選擇一個現有安全組。若選擇新建安全組,默認配置了80端口的入站規則。
自動分配公有 IP,選擇DISABLED,我們將使用ELB,不需要公有IP。
負載均衡
我們新創建一個ALB,先不必創建目標羣組。
- 負載均衡器類型: Application Load Balancer
- 負載均衡器名稱:選擇前面新建的ALB
- 選擇一個容器: heroes-web:80:80,然後點擊“添加到負載均衡器”,輸入以下參數:
生產偵聽器端口:新建 80
生產偵聽器協議:HTTP
目標組名稱:新建 ecs-heroes
目標組協議:HTTP
設置 Auto Scaling
服務 Auto Scaling:請勿調整服務的預期計數
審覈
檢查無誤後點擊創建服務。
返回到集羣界面,可以看到heroes集羣含有一個服務,一個正在運行的任務。
服務限制
在集羣任務界面,我們若停止當前任務,稍後會自動重啓新任務,同時會自動更新ELB的目標羣組。
Amazon ECS 服務計劃程序包含限制服務任務在反覆啓動失敗後再啓動的頻率邏輯。
如果一個 ECS 服務的任務總是無法進入 RUNNING 狀態(直接從 PENDING 跳到 STOPPED),則後續重啓嘗試間隔的時間會逐漸拉長,最多達到 15 分鐘
訪問服務
進入heroes集羣 -> 任務,點擊任務,進入任務詳細信息頁面,可以看到任務的私有 IP 地址。在內部網絡中,可以使用私有IP訪問每個任務部署的應用。公網則通過ELB訪問我們的服務。