當EAS提供的官方鏡像無法滿足特定業務或環境需求時,可通過自訂鏡像來封裝完整的運行環境,實現靈活、可靠的模型服務部署。
鏡像倉庫規劃
EAS部署服務時需要從鏡像倉庫拉取鏡像,推薦使用阿里雲Container RegistryACR儲存鏡像。拉取鏡像時使用VPC地址,以獲得更好的效能和安全性。
公網拉取鏡像存在安全風險,且速度會特別慢,不建議使用。
ACR個人版
免費提供,但只能在一個地區內開通使用,跨地區拉取鏡像只能通過公網地址。
建議僅在測試情境使用ACR個人版,並確保與EAS服務同地區。
ACR企業版
提供更強的安全、效能和全球同步能力,可實現EAS服務在同一地區或跨地區通過內網安全、高速地拉取鏡像。
推薦在生產環境中使用。
自建鏡像倉庫
如果在阿里雲VPC中使用Harbor等自建鏡像倉庫,地址僅支援在VPC中訪問,與ACR企業版類似,需要為EAS服務配置VPC,讓鏡像倉庫與EAS服務處於同一VPC中。
鏡像倉庫身份認證
使用需要認證的私人鏡像倉庫,需在服務部署時提供使用者名稱密碼資訊。
在JSON設定檔中通過dockerAuth參數指定認證資訊,值為username:password的Base64編碼形式。
例如,對於abcd:abcde12345,執行命令echo -n "abcd:abcde12345" | base64得到YWJjZDphYmNkZTEy****,即為dockerAuth的取值。
{"dockerAuth": "YWJjZDphYmNkZTEy****"}使用同一阿里雲帳號下同地區的ACR鏡像倉庫時,EAS可免密拉取鏡像,無需填寫使用者名稱密碼。
快速開始:製作並部署自訂鏡像
本節在阿里雲ECS執行個體上構建一個基於Gunicorn和Flask的Web服務鏡像,推送至ACR鏡像倉庫,並部署為EAS線上服務。
步驟一:環境準備
在開始之前,請確保已準備好以下環境和資源:
Virtual Private Cloud:EAS服務、ECS執行個體與ACR鏡像倉庫通過VPC通訊,確保鏡像推送拉取的穩定性和安全性。
容器鏡像倉庫 (ACR):用於儲存和管理自訂鏡像。參見使用企業版執行個體推送和拉取鏡像準備一個ACR企業版執行個體,並建立好所需的命名空間和鏡像倉庫。
開發環境:建立一個配置如下的ECS執行個體來製作鏡像。
執行個體規格:ecs.u1-c1m2.large
鏡像:Alibaba Cloud Linux 3.2104 LTS 64位
擴充程式:Docker社區版
網路:選擇的VPC需在ACR企業版執行個體的”存取控制”中添加,否則無法推送鏡像到ACR鏡像倉庫。詳情請參見為ACR配置專用網路的存取控制。
說明也可以使用本地或其他開發環境。
本地開發環境:安裝並運行 Docker,用於在本地構建鏡像。
使用DSW開發環境:在DSW執行個體的操作列中單擊制作镜像,系統將構建Docker鏡像並儲存到阿里雲Container RegistryACR中,部署時選擇自定义镜像即可下拉選擇。詳情請參見製作DSW執行個體鏡像。
步驟二:準備應用檔案
建立一個專案檔夾(例如 my-app),並包含以下三個檔案:
requirements.txt(應用依賴)flask gunicornapp.py(Web應用代碼)from flask import Flask app = Flask(__name__) @app.route('/hello/model') def hello_world(): # 此處可以整合您的模型推理或其他商務邏輯 return 'Hello World from Gunicorn!' # 注意:無需 app.run(),應用將由 Gunicorn 啟動
Dockerfile(鏡像構建指令)# 1. 使用輕量級的官方Python鏡像作為基礎 FROM python:3.9-slim # 2. 設定工作目錄 WORKDIR /app # 3. 複製依賴檔案並安裝,利用Docker緩衝機制加速後續構建 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ # 4. 複製應用代碼 COPY app.py . # 5. 聲明服務連接埠 EXPOSE 8000 # 6. 定義容器預設啟動命令(可被EAS控制台的“運行命令”覆蓋) CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:8000", "app:app"]
步驟三:構建並推送鏡像
開啟終端,進入專案檔夾(
my-app)。登入到您的ACR執行個體。將命令中的預留位置替換為實際資訊。
# 樣本: docker login --username=your_user my-registry.cn-hangzhou.aliyuncs.com docker login --username=<使用者名稱> <ACR倉庫網域名稱>構建Docker鏡像並為其打上完整的標籤。
# 樣本: docker build -t my-registry.cn-hangzhou.aliyuncs.com/my-namespace/flask-app:v1 . docker build -t <ACR倉庫網域名稱>/<命名空間>/<鏡像倉庫名>:<版本號碼> .(推薦)推送前本地驗證鏡像:將鏡像推送到 ACR 之前,建議先在本地運行以下命令驗證鏡像啟動是否正常,避免將問題鏡像推送至倉庫。
# 將 <連接埠號碼> 替換為 Dockerfile 中 EXPOSE 的連接埠(本樣本為 8000) docker run -p <連接埠號碼>:<連接埠號碼> <ACR倉庫網域名稱>/<命名空間>/<鏡像倉庫名>:<版本號碼>若應用正常響應,則說明鏡像可用,可繼續推送。
將構建好的鏡像推送到ACR。
# 樣本: docker push registry.cn-hangzhou.aliyuncs.com/my-namespace/flask-app:v1 docker push <ACR倉庫網域名稱>/<命名空間>/<鏡像倉庫名>:<版本號碼>
步驟四:部署服務
登入PAI控制台,在頁面上方選擇目標地區,並在右側選擇目標工作空間,然後單擊進入EAS。
單擊部署服务,選擇。
配置以下關鍵參數:
部署方式:選擇镜像部署。
镜像配置:選擇镜像地址,填寫上一步中推送的完整鏡像地址。
由於本樣本使用同一阿里雲帳號下的ACR,EAS可免密拉取鏡像,無需提供使用者名稱和密碼。
运行命令:
gunicorn -w 4 -b 0.0.0.0:8000 app:app邏輯說明:EAS控制台填寫的
運行命令會覆蓋 Dockerfile中的CMD指令。建議將啟動命令填寫在此處,便於後續調試和修改。端口号:8000。
部署资源:本樣本使用CPU資源即可。如選擇公共资源下的
ecs.c6.large。专有网络配置:選擇一個VPC、交換器和安全性群組。
請確保此處選擇的VPC已在ACR執行個體的“存取控制”中添加,否則將因網路不通導致鏡像拉取失敗(常見錯誤為
ImagePullBackOff)。
單擊部署,當服務狀態變為运行中,表示部署成功。
修改鏡像地址或更新服務配置:服務詳情頁展示的 JSON 配置為唯讀狀態,無法直接編輯。如需修改,請通過服務列表中的更新入口操作。
步驟五:服務測試
服務部署成功後,擷取訪問地址和Token,使用以下命令測試Flask服務:
# <endpoint>和<token>替換為服務的實際調用地址和Token
curl <endpoint>/hello/model -H "Authorization: <token>"如果返回 Hello World from Gunicorn!,則表示服務已成功部署並可正常訪問。
關於服務調用的更多資訊,請參見服務調用方式。
核心概念與限制
網路限制:EAS 服務通過VPC地址訪問內網資源,通常需要配置VPC。如果需要訪問公網資源(例如,使用
pip從公用源安裝依賴、調用外部 API 或通過公網拉取鏡像),還需為VPC配置NAT Gateway。詳情請參見EAS訪問公網或內網資源。成本提示:NAT Gateway是付費服務,會產生額外費用。
連接埠限制:
EAS服務引擎會佔用
8080和9090連接埠。您的應用程式監聽的連接埠必須避開這兩個連接埠,否則服務將因連接埠衝突啟動失敗。當服務包含多個容器時,各容器監聽的連接埠還必須互不相同。例如,若主容器使用
8000連接埠,Sidecar 容器也不能使用8000連接埠,否則將因連接埠衝突導致服務啟動失敗。
CUDA 版本:線上服務的 CUDA 版本由所選機型和基礎鏡像共同決定,無法在運行中直接更改。如需切換 CUDA 版本,須重新部署服務,並在部署時選擇支援目標 CUDA 版本的鏡像或機型。
Sidecar注入:為實現認證、鑒權和監控,EAS以Sidecar模式在服務執行個體中注入一個代理容器。這個代理是透明的,但會佔用少量資源,並負責將外部請求安全地轉寄到您配置的服務連接埠。
API協議支援:鏡像部署支援在鏡像中以HTTP、WebSocket、gRPC(HTTP2)三種協議提供API服務。
生產應用建議
鏡像與模型分離:始終將代碼和模型檔案分離。代碼打包進鏡像,模型存放在Object Storage Service或Apsara File Storage NAS上,在EAS部署頁面通過儲存掛載功能將模型掛載到容器內使用。這能縮短服務更新和擴容時的鏡像拉取時間。
使用內網拉取鏡像:為安全和效能,務必為服務配置專用網路,使其能通過 VPC 地址從 ACR 拉取鏡像。
預裝依賴以最佳化啟動速度:若服務每次重啟都需要重新下載 Python 依賴包或大體積模型檔案,會顯著增加冷啟動時間。建議在製作鏡像時將 Python 環境、依賴包(如 PyTorch、Transformers 等架構)及模型檔案直接預裝到鏡像中,確保容器啟動後立即提供服務,避免運行時動態下載。
註冊鏡像為AI資產:如果自訂的鏡像可在其他多種情境下應用,可使用PAI AI資產的鏡像功能,將其沉澱為AI資產統一管理。
配置健全狀態檢查:為服務配置健全狀態檢查,EAS 會據此自動重啟不健康的執行個體,保障服務穩定性。詳情請參見健全狀態檢查。
啟用自動擴縮容:當業務負載有明顯波動時,開啟水平自動擴縮容功能,以彈性、經濟的方式應對流量變化。
常見問題
Q:鏡像拉取失敗(ImagePullBackOff)
請依次排查:
鏡像地址正確性:請檢查鏡像地址、命名空間和版本號碼(Tag)是否正確,且鏡像已成功推送到倉庫。
系統硬碟空間:如有報錯
no space left on device,請擴容系統硬碟。網路連通性:
使用鏡像公網地址:請確認已為EAS配置能訪問公網的VPC,且為ACR開通公網訪問(跨地區使用公網地址速度特別慢,容易因網路問題失敗)。
使用鏡像內網地址:如果跨地區,僅支援使用ACR企業版,且需打通VPC。詳情請參見跨地區或從IDC訪問ACR企業版執行個體。
ACR存取控制:根據使用的鏡像地址類型檢查是否為ACR配置公網的存取控制、配置專用網路的存取控制。
倉庫認證:如果使用需要認證的私人鏡像倉庫(非本帳號下ACR),請檢查在鏡像配置中填寫的認證資訊是否正確。
Q:如何跨地區使用 ACR 鏡像?
EAS服務預設能通過 VPC 內網地址拉取同地區 ACR 倉庫中的鏡像。如果 ACR 執行個體與 EAS 服務不在同一地區,內網直連不可用。可通過以下方法解決:
方法一(推薦):在 EAS 服務所在地區重新建立 ACR 執行個體,將鏡像推送到同地區倉庫後再部署,從根本上避免跨地區問題。
方法二:通過 CEN(雲企業網)打通兩個地區的 VPC,實現跨地區內網拉取。具體操作參見跨地區或從IDC訪問企業版執行個體。
方法三(測試情境):通過公網地址拉取鏡像,需確認已為 ACR 開通公網訪問,並為 EAS 服務配置能訪問公網的 NAT Gateway。速度較慢且存在安全風險,僅建議用於測試情境。
Q:部署自訂鏡像報錯"no match for platform in manifest"怎麼辦?
該錯誤表示推送的鏡像架構(如arm64)與 EAS 執行個體的運行環境(通常為amd64/x86_64)不匹配,EAS 無法在該機型上運行此鏡像。常見於在 M 系列晶片 Mac(arm64)上構建鏡像後部署到 EAS(amd64)執行個體的情境。解決方案如下:
確認 EAS 目標執行個體的 CPU 架構(大多數 EAS 執行個體為
amd64)。在本地重新構建與 EAS 執行個體架構匹配的鏡像:
# 構建 amd64 架構鏡像(適用於大多數EAS執行個體) docker build --platform linux/amd64 -t <ACR倉庫網域名稱>/<命名空間>/<鏡像倉庫名>:<版本號碼> .將新鏡像推送到 ACR 後,重新部署服務。
Q:ACK 能串連EAS專屬鏡像庫(PAI官方鏡像)嗎?
EAS專屬鏡像庫不支援 ACK 直連,ACK 無法直接拉取EAS專屬鏡像庫中的鏡像。
更多問題,請參見EAS常見問題。