建構在 AWS 上使用容器的 12 因素微服務應用程序的指南

建構在 AWS 上使用容器的 12 因素微服務應用程序的指南

2024.04.24

若您在 2017 年開發軟體,您可能會考慮基於微服務的架構。微服務是一種應用開發方法,大型應用通過一套模塊化的服務構建。由於容器提供的隔離和打包能力,它們天生就非常適合。容器進一步實現了速度、資源密度、靈活性和可攜性。

要想從容器和微服務中獲益,可以參考被稱為 12 因素應用的方法論,這是一套流行的方法論,用於構建“軟體即服務應用”,它們:

  1. 使用聲明式格式進行設置自動化;
  2. 與底層操作系統有清晰的契約,提供在執行環境間最大的可移植性;
  3. 適合在現代雲平台上部署;
  4. 最小化開發與生產之間的差異,實現最大敏捷的持續部署;
  5. 可以在不對工具、架構或開發實踐進行重大變更的情況下進行擴展。

在這篇文章中,我們將重點介紹如何使用 AWS 的基本組件在容器中部署應用時實施上述範式。

開發微服務

實現系統中清晰契約的有效方式是為服務定義特定於您應用設計的邊界。微服務在應用層定義了清晰的契約。微服務可以在版本控制系統中追蹤,如 Git 或 AWS CodeCommit,後者是一種完全管理的源控制服務,使公司能夠安全、高度可擴展地托管私有 Git 倉庫,作為 GitHub 的替代品。

需要考慮崩潰的隔離、安全的隔離和獨立的擴展。容器將應用程式代碼包裝在一個部署單元中,捕獲代碼及其依賴的快照,從而擴展了可移植性。微服務架構天生保證如果服務的一小部分出現故障,只有該部分服務會下線。

Docker 提供操作系統、應用程式及依賴的打包,從而實現可移植性。大規模運行多個 Docker 容器是一個難題,屬於 O(n2) 的問題。Amazon EC2 容器服務(ECS)是一個高度可擴展、高性能的容器管理服務,支援 Docker 容器,使基於 Docker 的應用程式能夠在管理的 Amazon EC2 實例群集上運行。Amazon ECS 免除了安裝、操作和擴展集群管理基礎設施的需要,實現了高度並發環境。

有多個容器編排平台能夠很好地在大規模上運行容器,但在平台本身管理它們是一個挑戰。這需要用戶花費大量時間操作平台,而不是專注於應用。

雖然 Docker 實現了軟件的乾淨打包,但應用應該寫作跨環境一致;應從代碼中移除環境依賴,以增強可棄性。

參數存儲(Parameter Store),Amazon EC2 系統管理員的一個功能,提供了一個集中化、加密的存儲,用於敏感信息如秘密和配置。該服務是完全管理的、高可用的和高安全的。參數存儲可以通過系統管理員 API、AWS CLI 和 AWS SDKs 訪問。秘密可以輕鬆旋轉和撤銷。參數存儲與 AWS KMS 集成,因此特定參數可以用預設或自定義的 KMS 密鑰在靜態下加密。導入 KMS 密鑰使您能夠使用自己的密鑰加密敏感數據。

圖 1:在參數存儲中儲存容器秘密

通過 IAM 策略可以控制對參數存儲的訪問,並支持訪問的資源級權限。一個授予對特定參數或命名空間權限的 IAM 策略可以用來限制對這些參數的訪問。如果為服務啟用了 CloudTrail 日誌,則會記錄任何訪問參數的嘗試。部署在 Amazon EC2 容器服務(ECS)上的容器,該服務為您的容器提供編排,可以從參數存儲中訪問這些秘密。

Amazon EC2 容器服務允許您通過賦予每項服務自己的 IAM 角色來鎖定對 AWS 資源的訪問。

可擴展性

ECS 服務可以配置為使用服務自動擴展來根據 CloudWatch 警報向上或向下調整其所需計數。自動擴展有效地利用了計算資源。Amazon ECS 發布 CloudWatch 指標,包括服務的平均 CPU 和內存使用情況。這些服務利用率指標可以用來在高峰時段應對高需求來擴展服務,並在低利用率時段縮減服務以降低成本。

隨著服務擴展並在 ECS 集群上運行多個應用時,動態端口映射變得至關重要。應用負載均衡器提供了一個高性能的負載平衡選項,該選項在應用層運作,允許根據內容定義路由規則。使用應用負載均衡器,您可以指定一個動態主機端口,當容器在 EC2 實例上調度時給予它一個未使用的端口。ECS 調度器將自動使用此端口將任務添加到應用負載均衡器。

使用 AWS CloudFormation 為開發人員和系統管理員提供了一種簡單的方法來創建和管理相關 AWS 資源的集合,如應用負載均衡器、ECS 集群、VPC、服務定義和任務定義。

如上所述,使用諸如參數存儲這樣的秘密管理存儲,允許應用在執行環境中作為一個或多個進程執行。服務是無狀態的,不共享任何內容,依賴於有狀態的後端服務來持久化數據。

服務可以依賴於後端服務,如數據存儲(Amazon RDS、DynamoDB、S3、EFS 和 RedShift)、消息/隊列系統(SNS/SQS、Kinesis)、SMTP 服務(SES)和緩存系統(Elasticache)。12 因素應用的代碼對本地服務和第三方服務沒有區別。

圖 2:在 AWS 上的一個微服務部署示例。

持續部署

在當今商業環境中,以高速交付軟體的新迭代是競爭優勢。組織能夠以多快的速度將創新交付給客戶並適應市場變化,越來越成為決定成功與否的關鍵屬性。

持續部署使開發人員能夠通過完全自動化的軟體發布流程發布功能和修復。開發人員不再需要聚集大量的發布在幾周或幾個月的時間里手動進行部署,而是可以利用自動化工具,每天多次交付應用程式的版本,隨著新的軟體修訂版本準備就緒即可為用戶提供。就像雲計算縮短了資源交付時間一樣,持續部署將新軟體向用戶的發布周期從幾週或幾個月縮短到幾分鐘。可以使用諸如滾動更新、藍綠部署和金絲雀部署等各種技術來實現持續交付管道。

在 Amazon ECS 中更新服務是在調度器層面啟用的。運行中的服務可以更新以改變由服務維護的任務數量或任務使用的任務定義。當服務調度器在更新過程中替換任務時,如果服務使用負載均衡器,則服務首先將任務從負載均衡器中移除並等待連接排空。AWS 提供了 AWS CodeCommit、CodePipeline 和 CodeBuild 來實現高效的持續交付管道。下面的參考架構展示了這樣一個管道。

圖 3:持續交付和部署

在上述參考架構中,開發人員將代碼提交至 CodeCommit,這將觸發 CodePipeline。CodePipeline 分支到使用 AWS CloudFormation 配置基礎設施並使用 CodeBuild 構建 Docker 映像。CodeBuild 構建 Docker 映像並將其推送到 ECR,同時 CloudFormation 已部署 ECS 集群。處於自動擴展模式的 ECS 服務選擇映像並進行部署。相同的工作流程也適用於更新,增加了更新堆棧的步驟。通過更新堆棧,CloudFormation 能夠理解增量變化,更新服務會用新映像替換容器。

藍/綠部署是一種不可變部署類型,幫助您以較低的風險部署軟體更新。通過為當前運行或“藍色”版本的應用和新的或“綠色”版本的應用創建單獨的環境,降低了風險。這種部署類型為您提供了在不影響應用當前運行版本的情況下,在綠色環境中測試功能的機會。當您確定綠色版本運行正常時,可以通過修改 DNS 逐漸將流量從舊的藍色環境重新路由到新的綠色環境。通過遵循此方法,您可以實現幾乎零停機時間的功能更新和回滾。

圖 4. 在 ECS 中實現藍綠部署

如上述參考架構所示,目標群組和應用負載平衡器的基於路徑的路由可以用來將流量從 ALB 導向藍色(生產)服務和綠色(測試)服務。一旦測試完成,目標群組可以切換,將所有生產流量重定向到綠色(生產)服務,並將所有內部流量重定向到藍色(已廢棄)服務。

金絲雀發布是一種減少在生產環境中引入新軟體版本風險的技術,通過慢慢地將變更推送到一小部分用戶,然後在將其推送到整個基礎設施並使其對所有人可用之前,對其進行全面推出。

圖 5. 在 AWS 上實施容器的金絲雀部署

在上述參考架構中,容器可以發出 CloudWatch 事件,這些事件可用於決定是否增加流量。當容器指出它可以接受更多流量時,Amazon R53 加權路由可以增加到應用負載平衡器,因而增加到容器的流量。隨著金絲雀的增加,維持每個金絲雀的狀態對於回滾和部署非常重要。DynamoDB 和 lambda 過濾器允許根據 CloudWatch 事件將狀態存儲在管道中。AWS Step Function 通過可視化工作流協調管道的組件。

另一個考慮因素是開發、測試和生產系統應盡可能相似。通過建立一個高效的部署管道可以實現這一點。從運營和開發的角度看,環境應該在操作系統、Docker 版本、共享庫和部署的微服務方面保持緊密一致。

開發人員也可以將一次性管理進程作為任務運行,在與應用的常規長期運行進程完全相同的環境中運行。它們對某個發布版本運行,使用與該發布版本上運行的任何進程相同的代碼庫和配置。管理代碼可以與應用代碼一起發布,以避免同步問題。

監控和治理

應用日誌出於多種原因非常有用。它們是故障排除信息的主要來源。在安全領域,它們對於取證至關重要。網絡服務器日誌經常用於大規模分析,以獲得使用情況、受眾和趨勢的洞察。12 因素應用從不關心其輸出流的路由或存儲。將所有運行進程和後端服務的輸出流收集的流式日誌,轉發到集中日誌,如 AWS CloudWatch。Amazon ECS 在任務定義中提供了一個 logdriver,將流式日誌發送到 CloudWatch。

集中日誌有多個好處:Amazon EC2 實例的磁盤空間不會被日誌消耗,日誌服務通常包括一些對運營有用的額外功能。例如,CloudWatch 日誌包含創建度量過濾器的能力,當錯誤過多時可以警報,並與 Amazon Elasticsearch Service 和 Kibana 集成,使您能夠執行強大的查詢和分析。

在調試問題時,追踪和故障排除是一個重要方面。AWS X-Ray 守護進程是一個軟件應用,它收集原始段數據並將其轉發到 AWS X-Ray API。守護進程與 AWS X-Ray SDKs 一起工作,必須運行,以便 SDKs 發送的數據能夠到達 X-Ray 服務。您可以輕鬆地在 ECS 集群上運行 AWS X-Ray 作為守護進程,以啟用容器的追踪。

治理是軟件設計和開發的關鍵方面。維持一致的風格和標準以及運營 SLA 對於企業部署至關重要。必須考慮圍繞安全性、恢復時間目標和恢復點目標的 SLA。AWS 服務目錄可以用於在目錄中列出微服務堆棧,並提供訪問控制和通知機制。

結論

Arun Gupta 是 Amazon Web Services 的首席開源技術專家。他在 Sun、Oracle、Red Hat 和 Couchbase 等公司領導開發者社區超過 12 年。他在領導跨職能團隊開發並執行策略、規劃和執行內容、市場活動和方案方面擁有深厚的專業知識。在此之前,他在 Sun 領導工程團隊,並是 Java EE 團隊的創始成員。他在 40 多個國家就各種話題擁有豐富的演講經驗,連續四年成為 JavaOne 搖滾明星。Gupta 還在美國創立了 Devoxx4Kids 分會,並繼續推廣兒童的技術教育。他是一位多產的博客作者、多本書的作者、熱情的跑步者、環球旅行者、Docker 領航員、Java 冠軍、JUG 領導者、NetBeans 夢之隊成員。

Asif Khan 是 Amazon Web Services 的技術領導者。他為地球上一些最大和最成功的 AWS 客戶和合作夥伴提供技術指導、設計建議和思想領導。他最深的專業知識涵蓋應用架構、容器、devops、安全、機器學習和 SaaS 商業應用。在過去的 12 年裡,他對多個行業中的挑戰性和深度技術角色帶來了強烈的客戶關注。他擁有多項專利,並成功領導產品開發、架構和客戶互動。

相關文章