搭配 AWS Fargate 使用 Amazon EKS 上的 Amazon EFS,以持續性資料儲存執行可設定狀態工作負載 - AWS 方案指引

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

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

由里卡多·莫拉斯(AWS),羅德里戈貝爾薩(AWS)和盧西奧·佩雷拉(AWS)創建

代碼存儲庫:Amazon EKS 與 Fargate 和 Amazon EFS

環境:PoC 或試點

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

工作負載:開源

AWS 服務:Amazon EFS;Amazon EKS;AWS Fargate

Summary

此模式提供有關啟用 Amazon Elastic File System (Amazon EFS) 作為在 Amazon 彈性 Kubernetes 服務 (Amazon EKS) 上執行之容器的儲存裝置的指導,方法是使用 AWS Fargate 佈建您的運算資源。

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

您可以按照此模式中的步驟為 proof-of-concept (PoC) 應用程式建立命名空間和 Fargate 設定檔、安裝用於將 Kubernetes 叢集與 Amazon EFS 整合的 Amazon EFS 容器儲存界面 (CSI) 驅動程式、設定儲存類別,以及部署 PoC 應用程式。這些步驟會產生 Amazon EFS 檔案系統,該系統會在多個 Kubernetes 工作負載之間共用,並透過 Fargate 執行。該模式伴隨著可以自動執行這些步驟的腳本。

如果您想要在容器化應用程式中保存資料,並希望避免在擴展作業期間遺失資料,則可以使用此模式。例如:

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

  • 網頁伺服器 — 常見的案例是使用 Apache 作為 HTTP 網頁伺服器。您可以使用 Amazon EFS 做為共用檔案系統來存放在 Web 伺服器的不同執行個體之間共用的靜態檔案。在此範例案例中,修改會直接套用至檔案系統,而不是將靜態檔案複製到 Docker 映像中。

先決條件和限制

先決條件

  • 有效的 AWS 帳戶

  • 具有 1.17 版或更新版本的現有 Amazon EKS 叢集 (測試至 1.27 版)

  • 現有的 Amazon EFS 檔案系統,可繫結 Kubernetes StorageClass 並動態佈建檔案系統

  • 叢集管理權限

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

限制

  • 當您將 Amazon EKS 與 Fargate 搭配使用時,需要考慮一些限制。例如,不支援使用某些 Kubernetes 建構 (例如 DaemonSets 和有權限的容器)。如需有關 Fargate 限制的詳細資訊,請參閱 Amazon EKS 文件中的 AWS Fargate 考量事項

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

產品版本

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

  • Amazon EFS CSI 驅動程式 1.0 版或更新版本 (測試至 2.4.8 版)

  • 版本為 0.24.0 或更高版本(測試至 0.158.0 版本)

  • jq 版本 1.6 或更新版本

  • 庫貝克特爾版本 1.17 或更新版本(測試至 1.27 版)

  • 庫伯尼特斯版本 1.17 或更新版本(測試至 1.27 版)

架構

使用 Amazon EFS 執行具有持續性資料儲存的可設定狀態工作負載的架構圖

目標架構由下列基礎結構組成:

  • 虛擬私有雲 (VPC)

  • 兩個可用區域

  • 具有 NAT 閘道的公用子網路,可提供網際網路存取

  • 具有 Amazon EKS 叢集和 Amazon EFS 掛接目標 (也稱為掛接點) 的私有子網路

  • VPC 層級的 Amazon EFS

以下是 Amazon EKS 叢集的環境基礎設施:

  • 可在命名空間層級容納 Kubernetes 建構的 AWS Fargate 設定檔

  • 具有以下內容的庫伯尼特斯命名空間:

    • 跨可用區域分配兩個應用程式網繭

    • 在叢集層級繫結至持續性磁碟區 (PV) 的一個持續性磁碟區宣告 (PVC)

  • 與命名空間中的 PVC 繫結,並指向叢集外部私有子網路中 Amazon EFS 掛載目標的全叢集 PV

工具

AWS 服務

其他工具

  • Docker 是一組平台即服務 (PaaS) 產品,它們在作業系統層級使用虛擬化,在容器中提供軟體。

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

  • kubectl 是一種命令列介面,可協助您針對 Kubernetes 叢集執行命令。

  • jq 是用於解析 JSON 的命令行工具。

Code

此模式的程式碼是使用 AWS Fargate GitHub 存放庫在 Amazon EKS 上使用 Amazon EFS 的持續性組態中提供。這些腳本由 Epic 組織,在文件夾中epic01通過epic06,對應於此模式中史部分中的順序。

最佳實務

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

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

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

  • Amazon EKS,用於執行庫伯尼特工作負載。您必須先佈建 Amazon EKS 叢集,然後才能使用此模式,如先決條件一節中所述。

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

  • Fargate 可管理容器的運算資源,讓您可以專注於業務需求,而不是基礎結構負擔。會針對所有私有子網路建立 Fargate 設定檔。它提供叢集虛擬私有雲 (VPC) 內每個可用區域的備援。

  • Kubernetes 網繭,用於驗證內容是否可由不同的應用程式執行個體共用、使用和寫入。

史诗

任務描述所需技能

建立 Amazon EKS 叢集。

如果您已部署叢集,請跳至下一個史詩。在您現有的 AWS 帳戶中建立 Amazon EKS 叢集。在GitHub 存放庫目錄中,使用其中一種模式,透過使用地形或 eksctl 來部署 Amazon EKS 叢集。如需詳細資訊,請參閱 Amazon EKS 文件中的建立 Amazon EKS 叢集。備註:在 Terraform 模式中,還有一些範例說明如何:將 Fargate 設定檔連結到 Amazon EKS 叢集、建立 Amazon EFS 檔案系統,以及在 Amazon EKS 叢集中部署 Amazon EFS CSI 驅動程式。

AWS 管理員、地形或其他管理員、Kubernetes 管理員

匯出環境變數。

執行 env.sh 指令碼。這會提供後續步驟所需的資訊。

source ./scripts/env.sh Inform the AWS Account ID: <13-digit-account-id> Inform your AWS Region: <aws-Region-code> Inform your Amazon EKS Cluster Name: <amazon-eks-cluster-name> Inform the Amazon EFS Creation Token: <self-genereated-uuid>

如果還沒有註明,您可以使用以下 CLI 命令獲取上述請求的所有信息。

# ACCOUNT ID aws sts get-caller-identity --query "Account" --output text
# REGION CODE aws configure get region
# CLUSTER EKS NAME aws eks list-clusters --query "clusters" --output text
# GENERATE EFS TOKEN uuidgen
AWS 系統管理員
任務描述所需技能

為應用程式工作負載建立 Kubernetes 命名空間和 Fargate 設定檔。

建立命名空間以接收與 Amazon EFS 互動的應用程式工作負載。執行 create-k8s-ns-and-linked-fargate-profile.sh 指令碼。您可以選擇使用自訂命名空間名稱或預設提供的命名空間poc-efs-eks-fargate

使用自訂應用程式命名空間名稱:

export $APP_NAMESPACE=<CUSTOM_NAME> ./scripts/epic01/create-k8s-ns-and-linked-fargate-profile.sh \ -c "$CLUSTER_NAME" -n "$APP_NAMESPACE"

沒有自訂應用程式命名空間名稱:

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

其中$CLUSTER_NAME是您的 Amazon EKS 集群的名稱。該-n <NAMESPACE>參數是可選的; 如果沒有通知,將提供默認生成的命名空間名稱。

具有授與權限的 Kubernetes 使用者
任務描述所需技能

產生唯一的權杖。

Amazon EFS 需要建立權杖以確保冪等作業 (使用相同建立權杖呼叫作業沒有任何作用)。為了滿足此要求,您必須通過可用的技術生成唯一令牌。例如,您可以生成一個通用唯一標識符(UUID)以用作創建令牌。

AWS 系統管理員

建立一個 Amazon EFS 檔案系統。

建立檔案系統,以接收應用程式工作負載讀取和寫入的資料檔案。您可以建立加密或非加密的檔案系統。最佳作法是,此模式的程式碼會建立加密系統,預設啟用靜態加密。) 您可以使用唯一的對稱 AWS KMS 金鑰來加密檔案系統。如果未指定自訂金鑰,則會使用 AWS 受管金鑰。

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

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

./scripts/epic02/create-efs.sh \ -c "$CLUSTER_NAME" \ -t "$EFS_CREATION_TOKEN"

其中$CLUSTER_NAME是 Amazon EKS 叢集的名稱,$EFS_CREATION_TOKEN是檔案系統的唯一建立權杖。

使用 KMS 金鑰的靜態加密功能:

./scripts/epic02/create-efs.sh \ -c "$CLUSTER_NAME" \ -t "$EFS_CREATION_TOKEN" \ -k "$KMS_KEY_ALIAS"

其中$CLUSTER_NAME是 Amazon EKS 叢集的名稱,$EFS_CREATION_TOKEN是檔案系統的唯一建立權杖,$KMS_KEY_ALIAS是 KMS 金鑰的別名。

沒有加密:

./scripts/epic02/create-efs.sh -d \ -c "$CLUSTER_NAME" \ -t "$EFS_CREATION_TOKEN"

其中$CLUSTER_NAME是 Amazon EKS 叢集的名稱,$EFS_CREATION_TOKEN是檔案系統的唯一建立權杖,並–d停用靜態加密。

AWS 系統管理員

建立安全群組。

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

AWS 系統管理員

更新安全性群組的輸入規則。

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

  • 通訊協定 — 連接埠 2049

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

AWS 系統管理員

為每個私有子網路新增掛載目標。

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

AWS 系統管理員
任務描述所需技能

部署 Amazon EFS CSI 驅動程式。

將 Amazon EFS CSI 驅動程式部署到叢集中。該驅動程序根據應用程序創建的持久性卷聲明佈建存儲。執行指create-k8s-efs-csi-sc.sh令碼以將 Amazon EFS CSI 驅動程式和儲存類別部署到叢集中。

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

此指令碼使用kubectl公用程式,因此請確定已設定內容,並指向所需的 Amazon EKS 叢集。

具有授與權限的 Kubernetes 使用者

部署儲存類別。

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

具有授與權限的 Kubernetes 使用者
任務描述所需技能

部署持續性磁碟區。

部署持續性磁碟區,並將其連結至建立的儲存類別和 Amazon EFS 檔案系統的 ID。應用程式會使用持續性磁碟區來讀取和寫入內容。您可以在儲存區欄位中為持續性磁碟區指定任何大小。Kubernetes 需要此欄位,但由於 Amazon EFS 是彈性檔案系統,因此不會強制執行任何檔案系統容量。您可以使用或不使用加密來部署持續性磁碟區。Amazon EFS CSI 驅動程式預設會啟用加密,這是最佳實務。) 執行指deploy-poc-app.sh令碼以部署持續性磁碟區、持續性磁碟區宣告和兩個工作負載。

使用傳輸中的加密:

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

其中$EFS_CREATION_TOKEN是檔案系統的唯一建立權杖。

傳輸中沒有加密:

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

其中$EFS_CREATION_TOKEN是檔案系統的唯一建立權杖,並–d停用傳輸過程中的加密。

具有授與權限的 Kubernetes 使用者

部署應用程式要求的持續性磁碟區宣告。

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

具有授與權限的 Kubernetes 使用者

部署工作負載 1.

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

具有授與權限的 Kubernetes 使用者

部署工作負載 2.

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

具有授與權限的 Kubernetes 使用者
任務描述所需技能

檢查的狀態PersistentVolume

輸入下列命令以檢查的狀態PersistentVolume

kubectl get pv

如需範例輸出,請參閱其他資訊一節。

具有授與權限的 Kubernetes 使用者

檢查的狀態PersistentVolumeClaim

輸入下列命令以檢查的狀態PersistentVolumeClaim

kubectl -n poc-efs-eks-fargate get pvc

如需範例輸出,請參閱其他資訊一節。

具有授與權限的 Kubernetes 使用者

驗證工作負載 1 可以寫入檔案系統。

輸入以下命令以驗證工作負載 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 2023 - PoC APP 1 Thu Sep 3 15:25:12 UTC 2023 - PoC APP 1 Thu Sep 3 15:25:17 UTC 2023 - PoC APP 1 ...
具有授與權限的 Kubernetes 使用者

驗證工作負載 2 可以寫入檔案系統。

輸入以下命令以驗證工作負載 2 是否正在寫入/data/out2.txt

kubectl -n $APP_NAMESPACE exec -ti poc-app2 -- tail -f /data/out2.txt

結果類似於以下內容:

... Thu Sep 3 15:26:48 UTC 2023 - PoC APP 2 Thu Sep 3 15:26:53 UTC 2023 - PoC APP 2 Thu Sep 3 15:26:58 UTC 2023 - PoC APP 2 ...
具有授與權限的 Kubernetes 使用者

驗證工作負載 1 可以讀取工作負載 2 所寫入的檔案。

輸入以下命令,以驗證工作負載 1 是否可讀取工作負載 2 所寫入的/data/out2.txt檔案。

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

結果類似於以下內容:

... Thu Sep 3 15:26:48 UTC 2023 - PoC APP 2 Thu Sep 3 15:26:53 UTC 2023 - PoC APP 2 Thu Sep 3 15:26:58 UTC 2023 - PoC APP 2 ...
具有授與權限的 Kubernetes 使用者

驗證工作負載 2 可以讀取工作負載 1 所寫入的檔案。

輸入以下命令以驗證工作負載 2 是否可讀取工作負載 1 所寫入的/data/out1.txt檔案。

kubectl -n $APP_NAMESPACE exec -ti poc-app2 -- tail -n 3 /data/out1.txt

結果類似於以下內容:

... Thu Sep 3 15:29:22 UTC 2023 - PoC APP 1 Thu Sep 3 15:29:27 UTC 2023 - PoC APP 1 Thu Sep 3 15:29:32 UTC 2023 - PoC APP 1 ...
具有授與權限的 Kubernetes 使用者

驗證在移除應用程式元件後保留檔案。

接下來,您可以使用指令碼移除應用程式元件 (持續性磁碟區、持續性磁碟區宣告和網繭),並驗證檔案/data/out1.txt和檔案/data/out2.txt是否保留在檔案系統中。使用以下命令來執行 validate-efs-content.sh 指令碼。

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

其中$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
具有授與權限的 Kubernetes 使用者,系統管理員
任務描述所需技能

監控應用程式記錄。

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

AWS 系統管理員,具有授與許可的 Kubernetes 使用者

使用容器洞察來監控 Amazon EKS 和 Kubernetes 容器。

作為第二天操作的一部分,請使用 Amazon 容器洞察來監控 Amazon EKS 和 Kubernetes 系統。 CloudWatch 此工具會從不同層級和維度的容器化應用程式收集、彙總和摘要指標。如需詳細資訊,請參閱相關資源一節。

AWS 系統管理員,具有授與許可的 Kubernetes 使用者

使用監控 Amazon EFS CloudWatch。

作為第二天操作的一部分,使用 Amazon 監控檔案系統 CloudWatch,該 Amazon 會從 Amazon EFS 收集原始資料並將其處理為可讀的近即時指標。如需詳細資訊,請參閱相關資源一節。

AWS 系統管理員
任務描述所需技能

清理模式的所有創建的資源。

完成此模式後,請清理所有資源,以避免產生 AWS 費用。使用 PoC 應用程式後,執行clean-up-resources.sh指令碼以移除所有資源。完成下列其中一個選項。

使用 KMS 金鑰的靜態加密功能:

./scripts/epic06/clean-up-resources.sh \ -c "$CLUSTER_NAME" \ -t "$EFS_CREATION_TOKEN" \ -k "$KMS_KEY_ALIAS"

其中$CLUSTER_NAME是 Amazon EKS 叢集的名稱,$EFS_CREATION_TOKEN是檔案系統的建立權杖,$KMS_KEY_ALIAS是 KMS 金鑰的別名。

沒有靜態加密:

./scripts/epic06/clean-up-resources.sh \ -c "$CLUSTER_NAME" \ -t "$EFS_CREATION_TOKEN"

其中$CLUSTER_NAME是 Amazon EKS 叢集的名稱,$EFS_CREATION_TOKEN是檔案系統的建立權杖。

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

相關資源

參考

GitHub 教學課程和範例

所需工具

其他資訊

以下是kubectl get pv命令的範例輸出。

NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE poc-app-pv 1Mi RWX Retain Bound poc-efs-eks-fargate/poc-app-pvc efs-sc 3m56s

以下是kubectl -n poc-efs-eks-fargate get pvc命令的範例輸出。

NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE poc-app-pvc Bound poc-app-pv 1Mi RWX efs-sc 4m34s