在 Kubernetes 環境中,資料持久化至關重要,尤其在狀態型應用程式中。Amazon EFS 提供了彈性、可擴充套件的網路檔案系統,非常適合在 EKS 叢集中使用。本文將逐步引導讀者完成 EFS 與 EKS 的整合,從 IAM 許可權設定到應用程式佈署,確保資料在容器生命週期之外得以儲存。此方法不僅簡化了儲存管理,也提升了應用程式的可靠性和可擴充套件性,適用於需要分享儲存的各種應用場景。

在 Amazon EKS 中實作資料持久化:EFS 整合實戰

在前面的章節中,我們探討了在 Amazon EKS(Elastic Kubernetes Service)叢集中使用 EBS(Elastic Block Store)進行資料持久化的方法。本章節將重點介紹如何使用 Amazon EFS(Elastic File System)為 EKS 叢集提供分享檔案儲存解決方案。

建立 IAM Service Account

要使用 Amazon EFS CSI(Container Storage Interface)驅動程式,首先需要建立一個 IAM Service Account。這個過程可以透過 eksctl 命令列工具完成,如下所示:

eksctl create iamserviceaccount \
    --name efs-csi-controller-sa \
    --namespace kube-system \
    --cluster myeks01 \
    --attach-policy-arn arn:aws:iam::aws:policy/AmazonEFSReadOnlyAccess \
    --approve \
    --override-existing-serviceaccounts

內容解密:

此命令建立了一個名為 efs-csi-controller-sa 的 Service Account,並將其與指定的 IAM 角色繫結。--attach-policy-arn 引數指定了要附加的 IAM 策略 ARN,而 --override-existing-serviceaccounts 引數允許覆寫現有的 Service Account。

驗證 Service Account 建立結果

建立完成後,可以透過以下命令驗證 Service Account 是否成功建立:

kubectl get serviceaccounts --namespace kube-system --field-selector metadata.name=efs-csi-controller-sa

輸出結果如下:

NAME                    SECRETS   AGE
efs-csi-controller-sa   1         16h18m

內容解密:

此命令列出了在 kube-system 名稱空間中名為 efs-csi-controller-sa 的 Service Account。輸出的 AGE 欄位顯示了該 Service Account 的存活時間。

檢查註解(Annotation)

可以透過以下命令檢查 Service Account 的註解,確認 IAM 角色是否正確繫結:

kubectl describe serviceaccount efs-csi-controller-sa --namespace kube-system

輸出結果中應該包含類別似於以下的註解:

Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::000381057009:role/eksctl-myeks01-addon-iamserviceaccount-kube-Role1-15QIY5YYT6E9K

內容解密:

此註解封裝含了與 Service Account 繫結的 IAM 角色 ARN,確保了 EKS 與 IAM 之間的正確整合。

安裝 Amazon EFS CSI 驅動程式

接下來,需要安裝 Amazon EFS CSI 驅動程式。有多種安裝方法,包括使用 Helm Chart 或直接套用官方提供的 Manifest 檔案。這裡示範使用公開的 ECR(Elastic Container Registry)中的驅動程式:

  1. 首先,下載官方提供的 Manifest 檔案:

    kubectl kustomize "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/?ref=release-1.6" > public-ecr-driver.yaml
    

    內容解密:

    此命令使用 kubectl kustomize 下載並生成 EFS CSI 驅動程式的佈署檔案 public-ecr-driver.yaml

  2. 然後,套用下載的 Manifest 檔案以安裝驅動程式:

    kubectl apply -f public-ecr-driver.yaml
    

    內容解密:

    此命令將 public-ecr-driver.yaml 中的資源套用到 Kubernetes 叢集中,完成 EFS CSI 驅動程式的安裝。

建立 EFS 檔案系統

在安裝完 EFS CSI 驅動程式後,需要建立 EFS 檔案系統並組態相關的安全組規則,以允許 EKS 叢集中的節點存取 EFS。

  1. 首先,取得 EKS 叢集所在的 VPC ID:

    aws eks describe-cluster --name myeks01 --query "cluster.resourcesVpcConfig.vpcId" --output text
    

    輸出結果應該是 VPC ID,例如:vpc-0170477d07283a976

    內容解密:

    此命令查詢並輸出 EKS 叢集 myeks01 所在的 VPC ID。

  2. 然後,取得該 VPC 的 CIDR 區塊:

    aws ec2 describe-vpcs --vpc-ids vpc-0170477d07283a976 --query "Vpcs[].CidrBlock" --output text
    

    輸出結果應該是 CIDR 區塊,例如:172.31.0.0/16

    內容解密:

    此命令查詢並輸出指定 VPC 的 CIDR 區塊,用於後續組態安全組規則。

  3. 建立一個新的安全組,允許來自 VPC CIDR 區塊的 NFS 流量:

    aws ec2 create-security-group --group-name efs-sg --description "Security group for EFS" --vpc-id vpc-0170477d07283a976
    

    然後,新增規則允許 NFS 流量:

    aws ec2 authorize-security-group-ingress --group-id <security-group-id> --protocol tcp --port 2049 --cidr 172.31.0.0/16
    

    內容解密:

    此步驟建立了一個新的安全組並新增了允許 NFS 流量的入站規則,確保 EKS 叢集中的節點可以存取 EFS。

在Amazon EKS上實作資料持久化:EFS的佈署與測試

在現代的雲端原生應用中,資料持久化是一個至關重要的議題。Amazon Elastic Kubernetes Service(EKS)作為一種受管理的Kubernetes服務,為使用者提供了強大的容器協調能力。然而,當應用程式需要跨多個容器或節點分享資料時,持久化儲存的需求就變得尤為關鍵。本文將探討如何在EKS叢集中利用Amazon Elastic File System(EFS)來實作資料持久化。

為什麼選擇EFS?

Amazon EFS是一種完全受管的檔案系統,能夠與多個EC2例項或Kubernetes節點同時掛載,提供了一種簡單、可擴充套件的檔案儲存解決方案。相比於其他儲存選項,EFS具有以下優勢:

  1. 分享存取:多個Pod或節點可以同時讀寫同一個檔案系統。
  2. 彈性擴充套件:EFS能夠自動擴充套件以滿足儲存需求,無需預先組態儲存容量。
  3. 整合AWS生態系統:作為AWS原生服務,EFS與其他AWS服務(如EKS、EC2等)具有天然的整合優勢。

建立EFS檔案系統

首先,我們需要在AWS上建立一個EFS檔案系統。這涉及多個步驟,包括建立安全組、組態網路存取、以及最終建立EFS檔案系統。

1. 建立安全組

為了使EFS能夠被EKS叢集中的節點存取,我們需要建立一個安全組並組態適當的入站規則。

aws ec2 create-security-group --description efs-test-sg --group-name efs-sg --vpc-id vpc-0170477d07283a976

內容解密:

此命令用於建立一個新的安全組,名為efs-sg,並將其與指定的VPC相關聯。輸出的GroupId將用於後續步驟。

2. 組態安全組入站規則

接下來,我們需要在剛剛建立的安全組中新增一條入站規則,以允許來自EKS叢集節點的NFS流量。

aws ec2 authorize-security-group-ingress --group-id sg-0799e325100e750b8 --protocol tcp --port 2049 --cidr 172.31.0.0/16

內容解密:

此命令組態了安全組的入站規則,允許來自172.31.0.0/16網段的TCP流量透過2049埠(NFS埠)。這確保了EKS叢集中的節點可以存取EFS。

3. 建立EFS檔案系統

現在,我們可以建立EFS檔案系統了。

aws efs create-file-system --creation-token eks-efs

內容解密:

此命令建立了一個新的EFS檔案系統,並傳回了檔案系統的ID(FileSystemId)。這個ID將在後續步驟中用於掛載檔案系統。

將EFS掛載到EKS叢集

為了使EKS叢集中的Pod能夠使用EFS,我們需要進行一系列的組態,包括建立PersistentVolume(PV)、PersistentVolumeClaim(PVC)以及適當的StorageClass。

1. 克隆AWS EFS CSI Driver倉函式庫

首先,我們需要克隆AWS EFS CSI Driver的GitHub倉函式庫,以取得示例組態。

git clone https://github.com/kubernetes-sigs/aws-efs-csi-driver.git

內容解密:

此命令下載了AWS EFS CSI Driver的倉函式庫,其中包含了將EFS與Kubernetes整合所需的資源組態示例。

2. 編輯PV組態

接下來,我們需要編輯aws-efs-csi-driver/examples/kubernetes/multiple_pods/specs/pv.yaml檔案,將volumeHandle欄位更新為我們剛剛建立的EFS檔案系統的ID。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: efs-pv
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: efs-sc
  csi:
    driver: efs.csi.aws.com
    volumeHandle: fs-013a347478dfa307c

內容解密:

此YAML檔案定義了一個PersistentVolume(PV),它使用了EFS CSI Driver來提供儲存。volumeHandle欄位被設定為我們建立的EFS檔案系統的ID。

測試EFS掛載

完成上述組態後,我們可以透過佈署一個示例應用來測試EFS掛載是否成功。具體步驟包括建立PVC、Deployment等,這些都可以參考aws-efs-csi-driver/examples/kubernetes/multiple_pods目錄下的示例組態。

EFS與EKS整合架構圖

  graph LR
    A[EKS 叢集] -->|包含|> B[Pod 1]
    A -->|包含|> C[Pod 2]
    B -->|使用|> D[EFS 檔案系統]
    C -->|使用|> D
    D -->|提供|> E[分享儲存]

圖表翻譯: 此圖示展示了EKS叢集中的Pod如何透過EFS CSI Driver掛載並使用EFS檔案系統,實作跨Pod的資料分享。

隨著企業對雲端原生應用的需求日益增長,資料持久化和分享的需求也將變得更加重要。未來,我們可以期待AWS在EFS和EKS上的進一步整合和創新,例如更強大的效能最佳化、更簡化的組態流程等。這將進一步促進雲端原生技術的發展和應用。

在 Amazon EKS 中使用 EFS 實作持久化儲存

簡介

本章節將探討如何在 Amazon Elastic Kubernetes Service(EKS)中使用 Amazon Elastic File System(EFS)來實作持久化儲存。我們將透過實際操作示範如何組態 EFS,並將其掛載到多個 Pod 中,以實作資料分享。

EFS 的優勢

Amazon EFS 提供了一個完全託管的彈性檔案系統,能夠與多個 EC2 例項或 Kubernetes Pod 分享資料。與其他儲存解決方案相比,EFS 具有以下優勢:

  1. 彈性擴充套件:EFS 能夠根據需要自動擴充套件儲存容量,無需預先組態。
  2. 高用性:EFS 設計為高用性,能夠跨多個可用區提供資料存取。
  3. 分享存取:多個 Pod 或例項可以同時存取同一個 EFS 檔案系統。

在 EKS 中組態 EFS

步驟 1:建立 EFS 檔案系統

首先,我們需要在 AWS 控制檯或使用 AWS CLI 建立一個 EFS 檔案系統。建立完成後,記下檔案系統的 ID,因為後續步驟會用到它。

步驟 2:安裝 EFS CSI 驅動

要使 Kubernetes 能夠與 EFS 互動,我們需要安裝 EFS CSI(Container Storage Interface)驅動。執行以下命令:

kubectl apply -k "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/?ref=release-1.4"

步驟 3:建立 PV 和 PVC

接下來,我們需要建立 PersistentVolume(PV)和 PersistentVolumeClaim(PVC)來與 EFS 檔案系統進行繫結。建立一個名為 pv.yaml 的檔案,內容如下:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: efs-pv
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: efs-sc
  csi:
    driver: efs.csi.aws.com
    volumeHandle: <你的EFS檔案系統ID>

然後,建立一個名為 pvc.yaml 的檔案,內容如下:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: efs-claim
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  storageClassName: efs-sc

執行以下命令來建立 PV 和 PVC:

kubectl apply -f pv.yaml
kubectl apply -f pvc.yaml

步驟 4:佈署應用程式

現在,我們可以佈署一個應用程式來使用 EFS 儲存。建立一個名為 deployment.yaml 的檔案,內容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mydeployment
spec:
  selector:
    matchLabels:
      app: label-nginx
  template:
    metadata:
      labels:
        app: label-nginx
    spec:
      containers:
      - name: name-nginx
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: persistent-storage
          mountPath: /usr/share/nginx/html
      volumes:
      - name: persistent-storage
        persistentVolumeClaim:
          claimName: efs-claim

執行以下命令來佈署應用程式:

kubectl apply -f deployment.yaml

驗證 EFS 掛載

要驗證 EFS 是否成功掛載到 Pod 中,我們可以執行以下命令來檢查 Pod 中的檔案系統:

kubectl exec -it <pod名稱> -- df -h

你應該能夠看到 EFS 檔案系統被掛載到 /usr/share/nginx/html 目錄下。

測試資料分享

為了測試資料分享功能,我們可以建立一個檔案在一個 Pod 中,並在另一個 Pod 中驗證該檔案的存在。

首先,在 Pod app1 中建立一個檔案:

kubectl exec -it app1 -- /bin/sh -c 'echo "Hello from app1!" > /data/hello.txt'

然後,在 Pod app2 中驗證檔案的存在:

kubectl exec -it app2 -- cat /data/hello.txt

如果一切正常,你應該能夠看到 app1 中建立的檔案內容。

內容解密:

上述步驟展示瞭如何在 Amazon EKS 中組態和使用 Amazon EFS 來實作持久化儲存。關鍵步驟包括安裝 EFS CSI 驅動、建立 PV 和 PVC、以及佈署應用程式來使用 EFS 儲存。驗證 EFS 掛載和測試資料分享功能是確保組態正確的重要步驟。

隨著雲原生技術的快速發展,Kubernetes 和雲端儲存解決方案(如 EFS)將繼續演進,提供更多功能和改進。未來,我們可以期待看到更多增強功能,例如更好的效能、更強的安全性和更簡化的管理介面。

參考資料