透過 AWS Fargate 在 Amazon EKS 上使用 Amazon EFS 搭配使用持續資料儲存來執行可設定狀態的工作負載 - AWS Prescriptive Guidance

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

透過 AWS Fargate 在 Amazon EKS 上使用 Amazon EFS 搭配使用持續資料儲存來執行可設定狀態的工作負載

由里卡多·莫萊 (AWS) 和盧西奧·佩雷拉 (AWS) 創建

Envronment (環 PoC 或試驗

技能:容器與微服務;儲存與備份

工作負載:開放原始碼

AWS 服務:亞馬遜 EFS; 亞馬遜 EKS; AWS Fargate

Summary

此模式提供指導,讓 Amazon Elastic File System (Amazon EFS KS) 做為在 Amazon 彈性 Kubernetes 服務 (Amazon EKS) 上執行的容器使用 AWS Fargate 佈建您的運算資源。

此模式中描述的設定會遵循安全性最佳作法,並依預設提供靜態安全性和傳輸中的安全性。為了加密 Amazon EFS 檔案系統,它會使用 AWS Key Management Service (AWS KMS) 金鑰,但您也可以指定金鑰別名來傳送建立 KMS 金鑰的程序。

您可以依照此模式中的步驟為概念驗證 (PoC) 應用程式建立命名空間和 Fargate 設定檔、安裝用於整合 Kubernetes 叢集與 Amazon EFS 的 Amazon EFS 容器儲存介面 (CSI) 驅動程式、設定儲存類別以及部署 PoC 應用程式。這些步驟會產生 Amazon EFS 檔案系統,該檔案系統可在多個 Kubernetes 工作負載之間共用,並透過 Fargate 特執行。該模式是伴隨著指令碼來自動執行這些步驟。

每當您想要確保容器化應用程式中的資料持續性時,您都可以使用此模式,並避免擴充或擴充作業中的資料遺失。例如:

  • DevOps 工具 — 常見的案例是使用 Jenkins 做為持續整合和持續交付 (CI/CD) 工具。在這種情況下,您可以使用 Amazon EFS 做為共用檔案系統,在 CI/CD 工具的不同執行個體之間儲存組態,或者為 CI/CD 工具不同執行個體之間的管線階段儲存快取 (例如 Apache Maven 儲存庫)。

  • Web 服務器-一個常見的情況是使用 Apache 作為 HTTP Web 服務器。您可以使用 Amazon EFS 做為共享檔案系統,以儲存在 Web 伺服器不同執行個體之間共享的靜態檔案。在這個範例案例中,修改會直接套用至檔案系統,而不是將靜態檔案燒錄至 Docker 映像。

先決條件和限制

先決條件

  • 作用中的 AWS 帳戶

  • 使用 Kubernetes 1.17 版或更新版本的現有 Amazon EKS 叢集

  • 叢集管理許可

  • 設定為指向所需 Amazon EKS 叢集的內容

限制

  • 您必須先建立 Amazon EFS 檔案系統,才能使用 CSI 驅動程式將其作為永久磁碟區掛載到容器內。目前,CSI 驅動程式不會自動佈建 Amazon EFS 檔案系統。

  • 當您使用亞馬遜 EKS 搭配 Fargate 特使用時,有一些限制需要考慮。例如,不支援守護符和特殊容器。如需詳細資訊,請參閱「」AWS Fargate 考量在 Amazon EKS 文檔中。

  • 此樣式提供的程式碼支援執行 Linux 或 macOS 的工作站。

產品版本

  • AWS Command Line Interface (AWS CLI) 版本 2 或更新版本

  • Amazon EFS CSI 驅動程式 1.0 版或更新版本

  • eksctl0.24.0 版本或更新版本

  • jq1.6 版本或更新版本

  • kubectl1.17 或更新版本

  • Kubernetes 1.17 或更新版本

Architecture

目標架構包括下列服務和元件,並遵循AWS Well-Architected Framework最佳實務:

  • Amazon EFS,提供簡單、可擴展、全受管的彈性 NFS 檔案系統。這是用來做為所有在網格中執行的 PoC 應用程式複寫之間的共用檔案系統,這些複寫分佈在所選 Amazon EKS 叢集的私有子網路中。

  • 每個私有子網路的 Amazon EFS 掛載目標。這會在叢集的虛擬私有雲端 (VPC) 內提供每個可用區域的備援。

  • 亞馬遜 EKS,它運行庫伯內特工作負載。您必須在使用此模式之前佈建 Amazon EKS 叢集,如先決條件」區段。

  • AWS KMS,為儲存在 Amazon EFS 檔案系統中的內容提供靜態加密。

  • Fargate,負責管理容器的運算資源,讓您可以專注於業務需求,而不需要基礎結構負擔。Fargate 配置文件是為所有私有子網創建的。它會在叢集的虛擬私有雲端 (VPC) 內提供每個可用區域的冗餘。

  • Kubernetes 網格,用於驗證內容可以共享,消耗和由應用程序的不同實例編寫。

Tools

工具

  • AWS CLI— AWS Command Line Interface (AWS CLI) 是一種開放原始碼工具,您可從命令列用它來與 AWS 服務互動。

  • eksctl— eksctl 是用於在 Amazon EKS 上建立和管理 Kubernetes 叢集的命令列公用程式。

  • 葛貝— kubectl 是用於與叢集 API 伺服器通訊的命令列公用程式。

  • jq— jq 是用於剖析 JSON 的命令列工具。

AWS 服務

  • Amazon EFS— Amazon Elastic File System (Amazon EFS) 會管理 AWS 雲端中的檔案儲存。在此模式中,它提供簡單、可擴展、全受管和共用的檔案系統,可與 Amazon EKS 搭配使用。

  • Amazon EKS— Amazon Elastic Kubernetes Service (Amazon EKS) 可協助您在 AWS 執行 Kubernetes,而無需安裝或操作您自己的叢集。

  • AWS Fargate— AWS Fargate 是適用於亞馬遜 EKS 的無伺服器運算引擎。它會為您的 Kubernetes 應用程式建立和管理運算資源。

  • AWS KMS— AWS Key Management Service (AWS KMS) 是一項加密和金鑰管理服務,可協助您保護應用程式資料。

Code

這種模式的代碼在GitHub 回購。腳本由史詩組織, 在文件夾 epic01 到 epic06, 對應於下一節的順序. 如需如何使用指令碼自動執行此模式中的史詩,請參閱其他資訊」區段。

Epics

任務描述所需技能
為應用程式工作負載建立 Kubernetes 命名空間。

建立命名空間,以接收與 Amazon EFS 互動的應用程式工作負載。若要執行指令碼以自動化這個史詩般的步驟,請參閱其他資訊」區段。

具有授與權限的 Kubernetes 使用者
建立自訂 Fargate 描述檔。

建立連結至您建立的命名空間的自訂 Fargate 設定檔。

具有授與權限的 Kubernetes 使用者
任務描述所需技能
產生唯一的記號。

Amazon EFS 需要建立字符,以確保等冪操作 (使用相同建立字符呼叫操作不會有任何效果)。若要滿足此需求,您必須透過可用的技術產生唯一的權杖。例如,您可以產生通用唯一識別碼 (UUID),以作為建立權杖使用。建立 Token 之後,您可以執行指令碼來自動化此史詩中的剩餘步驟;請參閱其他資訊」區段。

系統管理員
建立 KMS 金鑰。

(選用) 在您的 AWS 帳戶和 AWS 區域中建立唯一的對稱 AWS KMS 金鑰。此金鑰用於檔案系統加密,因此病毒碼可以使用 KMS 金鑰來處理靜態加密。如果未指定,則會使用 AWS 受管金鑰。

系統管理員
建立 Amazon EFS 檔案系統。

建立檔案系統,以接收由應用程式工作負載讀取和寫入的資料檔案。您可以建立加密或未加密的檔案系統。最佳作法是,此模式的程式碼會建立加密系統,以便在預設情況下啟用靜態加密。)

系統管理員
建立安全群組。

建立安全群組以允許 Amazon EKS 叢集存取 Amazon EFS 檔案系統。

系統管理員
更新安全群組的傳入規則。

更新安全性群組的輸入規則,以允許下列設定的輸入流量:

  • TCP 通訊協定:連接埠 2049

  • 來源:VPC 中包含 Kubernetes 叢集之私人子網路的 CIDR 區塊範圍

系統管理員
為每個私人子網路新增掛載目標。

針對 Kubernetes 叢集的每個私人子網路,建立檔案系統和安全性群組的掛載目標。

系統管理員
任務描述所需技能
部署 Amazon EFS CSI 驅動程式。

將 Amazon EFS CSI 驅動程式部署到叢集中。驅動程式會根據應用程式所建立的持續磁碟區宣告佈建儲存裝置。若要執行指令碼以自動化這個史詩般的步驟,請參閱其他資訊」區段。

具有授與權限的 Kubernetes 使用者
部署儲存方案。

將儲存類別部署到適用於 Amazon EFS 佈建程式的叢集中。

具有授與權限的 Kubernetes 使用者
任務描述所需技能
部署持久性磁碟區。

部署永久磁碟區,並將其連結至建立的儲存類別,以及 Amazon EFS 檔案系統的 ID。應用程式會使用持續性磁碟區來讀取和寫入內容。您可以在儲存區域中為永久磁碟區指定任何大小。Kubernetes 需要此欄位,但由於 Amazon EFS 是彈性檔案系統,因此不會強制執行任何檔案系統容量。您可以使用或不使用加密來部署持續性磁碟區。Amazon EFS CSI 驅動程式預設會啟用加密,這是最佳做法。) 若要執行指令碼以自動化這個史詩般的步驟,請參閱其他資訊」區段。

具有授與權限的 Kubernetes 使用者
部署應用程式要求的持續性磁碟區宣告。

部署應用程式要求的持續性磁碟區宣告,並將其連結至儲存類別。使用與先前建立的永久磁碟區相同的存取模式。您可以在儲存區域中為持續性磁碟區宣告指定任何大小。Kubernetes 需要此欄位,但由於 Amazon EFS 是彈性檔案系統,因此不會強制執行任何檔案系統容量。

具有授與權限的 Kubernetes 使用者
部署工作負載 1。

部署代表應用程式工作負載 1 的網繭。此工作負載會將內容寫入檔案 /資料/out1.tx。

具有授與權限的 Kubernetes 使用者
部署工作負載 2。

部署代表應用程式工作負載 2 的網繭。此工作負載會將內容寫入檔案 /資料/out2.tx。

具有授與權限的 Kubernetes 使用者
任務描述所需技能
驗證工作負載 1 可寫入檔案系統。

驗證應用程式的工作負載 1 是否正在寫入 Amazon EFS 檔案系統中的 /data/out1.txt 檔案。如需自動化此史詩中步驟的命令和指令碼,請參閱其他資訊」區段。

具有授與權限的 Kubernetes 使用者
驗證工作負載 2 可寫入檔案系統。

驗證應用程式的工作負載 2 是否正在寫入 Amazon EFS 檔案系統中的 /data/out2.txt 檔案。

具有授與權限的 Kubernetes 使用者
驗證工作負載 1 可以讀取工作負載 2 所寫入的檔案。

驗證應用程式的工作負載 1 是否能夠從檔案系統讀取應用程式的工作負載 2 所寫入的檔案 /data/out2.txt。

具有授與權限的 Kubernetes 使用者
驗證工作負載 2 可以讀取工作負載 1 所寫入的檔案。

驗證應用程式的工作負載 2 是否能夠從檔案系統讀取應用程式的工作負載 1 所寫入的檔案 /data/out1.txt。

具有授與權限的 Kubernetes 使用者
在移除應用程式元件後,驗證檔案是否保留。

移除應用程式元件 (永續性磁碟區、永續性磁碟區宣告和網格),並驗證檔案 /data/out1.txt 和 /data/out2.txt 是否保留在檔案系統中。如需自動執行此步驟的指令碼,請參閱其他資訊」區段。

具有授與權限的 Kubernetes 使用者, 系統管理員
任務描述所需技能
監控應用程式記錄檔。

作為第二天操作的一部分,請將應用程式日誌發送到 Amazon CloudWatch 進行監控。

具有授與權限的 Kubernetes 使用者, 系統管理員
透過容器洞察監控 Amazon EKS 和 Kubernetes 容器。

作為第二天操作的一部分,使用亞馬遜 CloudWatch 容器洞察監控亞馬遜 EKS 和 Kubernetes 系統。此工具會收集來自不同層級和維度的容器化應用程式的指標。如需詳細資訊,請參閱相關資源」區段。

具有授與權限的 Kubernetes 使用者, 系統管理員
使用 CloudWatch 監控來監控亞馬遜 EFS。

操作的一部分,請使用 Amazon CloudWatch 監控檔案系統,前者會收集來自 Amazon EFS 的原始資料,並處理為可讀且近乎即時的指標。如需詳細資訊,請參閲 。相關資源」區段。

系統管理員
任務描述所需技能
清理該模式的所有創建的資源。

完成此模式後,請清理所有資源,以避免產生 AWS 費用。若要執行指令碼以自動化清理程序,請參閱其他資訊」區段。

具有授與權限的 Kubernetes 使用者, 系統管理員

相關資源

References

GitHub 教程和示例

必要工具

其他資訊

自動化這種模式的史詩和故事的腳本包含在GitHub 回購,並在下列各節中加以說明。

創建一個 Kubernetes 命名空間和一個鏈接的 Fargate 配置文件

執行下列指令碼,以實作這兩個步驟:

./scripts/epic01/create-k8s-ns-and-linked-fargate-profile.sh \     -c "MY_CLUSTER_NAME"

whereMY_CLUSTER_NAME是您 Amazon EKS 叢集的名稱。

建立 Amazon EFS 檔案系統

為 Amazon EFS 產生唯一權杖之後,請使用 create-efs.sh 指令碼建立加密或非加密的 Amazon EFS 檔案系統。

使用靜態加密,不使用 KMS 金鑰:

./scripts/epic02/create-efs.sh \     -c "MY_CLUSTER_NAME" \     -t "MY_EFS_CREATION_TOKEN"

whereMY_CLUSTER_NAME是您的亞馬遜 EKS 叢集的名稱,MY_EFS_CREATION_TOKEN是文件系統的唯一創建令牌。

使用 KMS 金鑰進行靜態加密:

./scripts/epic02/create-efs.sh \     -c "MY_CLUSTER_NAME" \     -t "MY_EFS_CREATION_TOKEN" \     -k "MY_KMS_KEY_ALIAS"

whereMY_CLUSTER_NAME是您的亞馬遜 EKS 叢集的名稱,MY_EFS_CREATION_TOKEN是文件系統的唯一創建令牌,MY_KMS_KEY_ALIAS是 KMS 金鑰的別名。

未使用加密:

./scripts/epic02/create-efs.sh -d \     -c "MY_CLUSTER_NAME" \     -t "MY_EFS_CREATION_TOKEN"

whereMY_CLUSTER_NAME是您的亞馬遜 EKS 叢集的名稱,MY_EFS_CREATION_TOKEN是文件系統的唯一創建令牌,–d會停用靜態加密。

將 Amazon EFS 元件安裝到 Kubernetes 叢集中

執行下列指令碼,將 Amazon EFS CSI 驅動程式和儲存類別部署到叢集中:

./scripts/epic03/create-k8s-efs-csi-sc.sh

這個指令碼會使用kubectl公用程式,因此請確定內容已配置為指向所需的 Amazon EKS 叢集。

安裝 PoC 應用程式

執行 deploy-poc-app.sh 指令碼以部署持續性磁碟區、持續性磁碟區宣告以及兩個工作負載。

在傳輸中使用加密:

./scripts/epic04/deploy-poc-app.sh \     -t "MY_EFS_CREATION_TOKEN"

whereMY_EFS_CREATION_TOKEN是文件系統的唯一創建令牌。

在傳輸中不使用加密:

./scripts/epic04/deploy-poc-app.sh -d \     -t "MY_EFS_CREATION_TOKEN"

whereMY_EFS_CREATION_TOKEN是文件系統的唯一創建令牌,–d在傳輸中停用加密。

驗證檔案系統持續性、耐久性和共用性

若要驗證工作負載 1 是否正在寫入 /data/out1.txt:

kubectl exec -ti poc-app1 -n poc-efs-eks-fargate -- tail -f /data/out1.txt

結果將類似下列內容:

... Thu Sep  3 15:25:07 UTC 2020 - PoC APP 1 Thu Sep  3 15:25:12 UTC 2020 - PoC APP 1 Thu Sep  3 15:25:17 UTC 2020 - PoC APP 1 ...

若要驗證工作負載 2 是否正在寫入 /data/out2.txt:

kubectl exec -ti poc-app2 -n poc-efs-eks-fargate -- tail -f /data/out2.txt

結果將類似下列內容:

... Thu Sep  3 15:26:48 UTC 2020 - PoC APP 2 Thu Sep  3 15:26:53 UTC 2020 - PoC APP 2 Thu Sep  3 15:26:58 UTC 2020 - PoC APP 2 ...

若要驗證工作負載 1 是否可以讀取工作負載 2 所寫入的檔案:

kubectl exec -ti poc-app1 -n poc-efs-eks-fargate -- tail -n 3 /data/out2.txt

結果將類似下列內容:

... Thu Sep  3 15:26:48 UTC 2020 - PoC APP 2 Thu Sep  3 15:26:53 UTC 2020 - PoC APP 2 Thu Sep  3 15:26:58 UTC 2020 - PoC APP 2 ...

若要驗證工作負載 2 是否可以讀取工作負載 1 所寫入的檔案:

kubectl exec -ti poc-app2 -n poc-efs-eks-fargate -- tail -n 3 /data/out1.txt

結果將類似下列內容:

... Thu Sep  3 15:29:22 UTC 2020 - PoC APP 1 Thu Sep  3 15:29:27 UTC 2020 - PoC APP 1 Thu Sep  3 15:29:32 UTC 2020 - PoC APP 1 ...

若要在移除應用程式元件後驗證檔案是否保留:

./scripts/epic05/validate-efs-content.sh \     -t "MY_EFS_CREATION_TOKEN"

whereMY_EFS_CREATION_TOKEN是文件系統的唯一創建令牌。

結果將類似下列內容:

pod/poc-app-validation created Waiting for pod get Running state... Waiting for pod get Running state... Waiting for pod get Running state... Results from execution of 'find /data' on validation process pod: /data /data/out2.txt /data/out1.txt

清除資源

完成使用 PoC 應用程式之後,執行 clean-up-resources.sh 指令碼以移除所有資源。

使用 KMS 金鑰進行靜態加密:

./scripts/epic06/clean-up-resources.sh \     -c "MY_CLUSTER_NAME" \     -t "MY_EFS_CREATION_TOKEN" \     -k "MY_KMS_KEY_ALIAS

whereMY_CLUSTER_NAME是您的亞馬遜 EKS 叢集的名稱,MY_EFS_CREATION_TOKEN是文件系統的創建令牌,MY_KMS_KEY_ALIAS是 KMS 金鑰的別名。

不使用靜態加密:

./scripts/epic06/clean-up-resources.sh \     -c "MY_CLUSTER_NAME" \ -t "MY_EFS_CREATION_TOKEN"

whereMY_CLUSTER_NAME是您的亞馬遜 EKS 叢集的名稱,MY_EFS_CREATION_TOKEN是文件系統的創建令牌。