如何在 Amazon EKS 中使用持續性儲存空間?

6 分的閱讀內容
0

我想要在 Amazon Elastic Kubernetes Service (Amazon EKS) 中使用持續性儲存空間。

簡短描述

若要在 Amazon EKS 中設定持續性儲存空間,請使用下列任一選項:

若要使用其中一個選項,請完成下列任一節中的步驟:

  • 選項 A: 部署和測試 Amazon EBS CSI 驅動程式
  • 選項 B: 部署和測試 Amazon EFS CSI 驅動程式

本文中的命令要求使用 kubectl 1.14 版或更新版本。若要查看您的 kubectl 版本,請執行下列命令:

kubectl version --client --short

注意: 最佳實務是確保安裝最新版本的驅動程式。如需詳細資訊,請參閱 GitHub 儲存庫中的 Amazon EBS CSI 驅動程式Amazon EFS CSI 驅動程式

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請確定您使用的是最新版本的 AWS CLI

在完成任一節中的步驟之前,您必須:

  1. 安裝 AWS CLI

  2. 設定 AWS Identity and Access Management (IAM) 許可,以建立政策並將其連接到 Amazon EKS 工作節點角色 CSI 驅動程式角色
    **注意:**下列各節中的命令並不總是使用 --region 變數。如果您不使用 --region,則這些命令會使用 AWS 區域的預設值。若要檢查預設值,請執行 AWS CLI configure 命令

  3. 建立 Amazon EKS 叢集,並將工作節點加入叢集。
    **注意:**執行 kubectl get nodes 命令,以確認工作節點已連接至叢集。

  4. 若要確認您的叢集中存在 AWS IAM OpenID Connect (OIDC) 供應商,請執行下列命令:

    aws eks describe-cluster --name your_cluster_name --query "cluster.identity.oidc.issuer" --output text

    **注意:**將 your_cluster_name 取代為您的叢集名稱。

  5. 確認已設定您的 IAM OIDC 供應商:

    aws iam list-open-id-connect-providers | grep OIDC_PROVIDER_ID

    注意:OIDC 供應商的 ID 取代為您的 OIDC ID。如果收到在您的帳戶中找不到 OpenIDConnect 供應商錯誤,您必須建立 IAM OIDC 供應商。

  6. 安裝或更新 eksctl

  7. 建立 IAM OIDC 供應商:

    eksctl utils associate-iam-oidc-provider --cluster my-cluster --approve

    **注意:**將 my-cluster 取代為您的叢集名稱。

選項 A: 部署和測試 Amazon EBS CSI 驅動程式

部署 Amazon EBS CSI 驅動程式:

  1. 建立類似下列範例的 IAM 信任政策檔案:

    cat <<EOF > trust-policy.json
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::YOUR_AWS_ACCOUNT_ID:oidc-provider/oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/YOUR_OIDC ID"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/<XXXXXXXXXX45D83924220DC4815XXXXX>:aud": "sts.amazonaws.com",
              "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/<XXXXXXXXXX45D83924220DC4815XXXXX>:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa"
            }
          }
        }
      ]
    }
    EOF

    **注意:**將 YOUR_AWS_ACCOUNT_ID 取代為您的帳戶 ID。將 YOUR_AWS_REGION 取代為您的區域。將 your OIDC ID 取代為建立 IAM OIDC 供應商的輸出結果。

  2. 建立名為 Amazon_EBS_CSI_Driver 的 IAM 角色:

    aws iam create-role \
     --role-name AmazonEKS_EBS_CSI_Driver \
     --assume-role-policy-document file://"trust-policy.json"
  3. 將 EBS CSI 驅動程式的 AWS 受管 IAM 政策連接至您建立的 IAM 角色:

    aws iam attach-role-policy \
    --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \
    --role-name AmazonEKS_EBS_CSI_Driver
  4. 部署 Amazon EBS CSI 驅動程式。

    aws eks create-addon \
     --cluster-name my-cluster \
     --addon-name aws-ebs-csi-driver \
     --service-account-role-arn arn:aws:iam::
    YOUR_AWS_ACCOUNT_ID:role/AmazonEKS_EBS_CSI_DriverRole

    **注意:**將 my-cluster 取代為您的叢集名稱,並將 YOUR_AWS_ACCOUNT_ID 取代為您的帳戶 ID。

    您可以使用 Kustomize、Helm 或 Amazon EKS 受管附加元件部署 EBS CSI 驅動程式。此範例會使用 Amazon EKS 附加元件功能來部署驅動程式。如需詳細資訊,請參閱 GitHub 上的 aws-ebs-csi-driver 安裝指南

  5. 檢查 EBS CSI 驅動程式是否已成功安裝:

    eksctl get addon --cluster my-cluster | grep ebs

    成功的安裝會傳回下列輸出:

    aws-ebs-csi-driver    v1.20.0-eksbuild.1    ACTIVE    0    arn:aws:iam::YOUR_AWS_ACCOUNT_ID:role/AmazonEKS_EBS_CSI_Driver

測試 Amazon EBS CSI 驅動程式:

您可以使用對 Pod 使用動態佈建的範例應用程式來測試 Amazon EBS CSI 驅動程式。隨需佈建 Amazon EBS 磁碟區。

  1. 複製 AWS GitHub 中的 aws-ebs-csi-driver 儲存庫:

    git clone https://github.com/kubernetes-sigs/aws-ebs-csi-driver.git
  2. 將您的工作目錄變更為包含 Amazon EBS 驅動程式測試檔案的資料夾:

    cd aws-ebs-csi-driver/examples/kubernetes/dynamic-provisioning/
  3. 建立測試所需的 Kubernetes 資源:

    kubectl apply -f manifests/

    **注意:**kubectl 命令會建立 StorageClass、PersistentVolumeClaim (PVC) 和 Pod。Pod 會參考 PVC。只有在建立 Pod 時,才會佈建 Amazon EBS 磁碟區。如需詳細資訊,請參閱 Kubernetes 網站上的儲存類別PersistentVolumeClaims

  4. 描述 ebs-sc 儲存類別:

    kubectl describe storageclass ebs-sc
  5. 監視預設命名空間中的 Pod,並等待 app Pod 的狀態變更為正在執行。例如:

    kubectl get pods --watch
  6. 檢視因參考 PVC 的 Pod 而建立的持續性磁碟區:

    kubectl get pv
  7. 檢視持續性磁碟區的相關資訊:

    kubectl describe pv your_pv_name

    **注意:**將 your_pv_name 取代為上一節中步驟 6 傳回之持續性磁碟區的名稱。輸出中的 Source.VolumeHandle 屬性的值是在您帳戶中建立的實體 Amazon EBS 磁碟區的 ID。

  8. 確認 Pod 正在將資料寫入磁碟區中:

    kubectl exec -it app -- cat /data/out.txt

    **注意:**命令輸出會顯示 /data/out.txt 檔案中儲存的目前日期和時間。該檔案包括日、月、日期和時間。

選項 B: 部署和測試 Amazon EFS CSI 驅動程式

在部署 CSI 驅動程式之前,先建立 IAM 角色,讓 CSI 驅動程式的服務帳戶代表您呼叫 AWS API。

  1. 從 GitHub 中下載 IAM 政策文件:

    curl -o iam-policy-example.json https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/docs/iam-policy-example.json
  2. 建立 IAM 政策:

    aws iam create-policy \
        --policy-name AmazonEKS_EFS_CSI_Driver_Policy \
        --policy-document file://iam-policy-example.json
  3. 執行下列命令,以確定叢集的 OIDC 供應商 URL:

    aws eks describe-cluster --name your_cluster_name --query "cluster.identity.oidc.issuer" --output text

    **注意:**在步驟 3 中,將 your_cluster_name 取代為您的叢集名稱。

  4. 建立下列 IAM 信任政策,然後將 AssumeRoleWithWebIdentity 動作授予 Kubernetes 服務帳戶:

    cat <<EOF > trust-policy.json
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::YOUR_AWS_ACCOUNT_ID:oidc-provider/oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/<XXXXXXXXXX45D83924220DC4815XXXXX>"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/<XXXXXXXXXX45D83924220DC4815XXXXX>:sub": "system:serviceaccount:kube-system:efs-csi-controller-sa"
            }
          }
        }
      ]
    }
    EOF

    **注意:**在步驟 4 中,將 YOUR_AWS_ACCOUNT_ID 取代為您的帳戶 ID。將 YOUR_AWS_REGION 取代為您的區域。將 XXXXXXXXXX45D83924220DC4815XXXXX 取代為步驟 3 中傳回的值。

  5. 建立 IAM 角色:

    aws iam create-role \
      --role-name AmazonEKS_EFS_CSI_DriverRole \
      --assume-role-policy-document file://"trust-policy.json"
  6. 將您的新 IAM 政策連接至該角色:

    aws iam attach-role-policy \
      --policy-arn arn:aws:iam::<AWS_ACCOUNT_ID>:policy/AmazonEKS_EFS_CSI_Driver_Policy \
      --role-name AmazonEKS_EFS_CSI_DriverRole
  7. 將下列內容儲存至名為 efs-service-account.yaml 的檔案。

    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      labels:
        app.kubernetes.io/name: aws-efs-csi-driver
      name: efs-csi-controller-sa
      namespace: kube-system
      annotations:
        eks.amazonaws.com/role-arn: arn:aws:iam::<AWS_ACCOUNT_ID>:role/AmazonEKS_EFS_CSI_DriverRole
  8. 在叢集上建立 Kubernetes 服務帳戶。使用您建立的 IAM 角色為名為 efs-csi-controller-sa 的 Kubernetes 服務帳戶加上註解。

    kubectl apply -f efs-service-account.yaml
  9. 透過下載清單檔案,使用儲存在公有 Amazon ECR 登錄檔中的映像安裝驅動程式:

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

    **注意:**您可以將 Helm 和 Kustomize 與 AWS 私有或公有登錄檔搭配使用來安裝 EFS CSI 驅動程式。如需詳細資訊,請參閱 Amazon EFS CSI 驅動程式文件

    然後,編輯 public-ecr-driver.yaml 檔案以移除 efs-csi-controller-sa 清單檔案:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      labels:
        app.kubernetes.io/name: aws-efs-csi-driver
      name: efs-csi-controller-sa
      namespace: kube-system

部署 Amazon EFS CSI 驅動程式

Amazon EFS CSI 驅動程式允許多個 Pod 使用 ReadWriteMany 模式同時寫入磁碟區。

  1. 若要部署 Amazon EFS CSI 驅動程式,請套用清單檔案:

    kubectl apply -f public-ecr-driver.yaml
  2. 如果您的叢集僅包含 AWS Fargate Pod (無節點),請使用下列命令部署驅動程式 (所有區域):

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/deploy/kubernetes/base/csidriver.yaml

建立 Amazon EFS 檔案系統

  1. 取得您的 Amazon EKS 叢集的 VPC ID:

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

    **注意:**在步驟 3 中,將 your_cluster_name 取代為您的叢集名稱。

  2. 取得 VPC 叢集的 CIDR 範圍:

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

    **注意:**在步驟 4 中,將 YOUR_VPC_ID 取代為上一節中步驟 3 的 VPC ID。

  3. 建立安全群組,以允許 Amazon EFS 掛載點的輸入網路檔案系統 (NFS) 流量:

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

    **注意:**將 YOUR_VPC_ID 取代為上一節中步驟 3 的輸出結果。儲存 GroupId 以供稍後使用。

  4. 新增 NFS 輸入規則,讓 VPC 中的資源可以與 Amazon EFS 檔案系統進行通訊:

    aws ec2 authorize-security-group-ingress --group-id sg-xxx --protocol tcp --port 2049 --cidr YOUR_VPC_CIDR

    **注意:**將 YOUR_VPC_CIDR 取代為上一節中步驟 4 的輸出結果。將 sg-xxx 取代為上一節中步驟 5 的安全群組 ID。

  5. 為您的 Amazon EKS 叢集建立 Amazon EFS 檔案系統:

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

    **注意:**儲存 FileSystemId 以供稍後使用。

  6. 若要為 Amazon EFS 建立掛載目標,請執行下列命令:

    aws efs create-mount-target --file-system-id FileSystemId --subnet-id SubnetID --security-group sg-xxx

    **重要事項:**請務必在執行工作節點的可用區域中,為所有具有 SubnetID 的可用區域執行該命令。將 FileSystemId 取代為上一節中步驟 7 (您建立 Amazon EFS 檔案系統的位置) 的輸出結果。將 sg-xxx 取代為上述步驟 5 (您建立安全群組的位置) 的輸出結果。將 SubnetID 取代為工作節點所使用的子網路。若要在多個子網路中建立掛載目標,您必須為每個子網路 ID 個別執行步驟 8 中的命令。最佳實務是在執行工作節點的每個可用區域中建立掛載目標。

    **注意:**您可以為啟動工作節點的所有可用區域建立掛載目標。然後,可用區域中具有掛載目標的所有 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體即可使用該檔案系統。

Amazon EFS 檔案系統及其掛載目標現在正在執行,並已備妥可供叢集中的 Pod 使用。

測試 Amazon EFS CSI 驅動程式

您可以透過部署寫入相同檔案的兩個 Pod 來測試 Amazon EFS CSI 驅動程式。

  1. 複製 AWS GitHub 中的 aws-efs-csi-driver 儲存庫:

    git clone https://github.com/kubernetes-sigs/aws-efs-csi-driver.git
  2. 將您的工作目錄變更為包含 Amazon EFS CSI 驅動程式測試檔案的資料夾:

    cd aws-efs-csi-driver/examples/kubernetes/multiple_pods/
  3. 擷取先前建立的 Amazon EFS 檔案系統 ID:

    aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text

    **注意:**如果步驟 3 的命令傳回多個結果,您可以使用先前儲存的 Amazon EFS 檔案系統 ID。

  4. specs/pv.yaml 檔案中,將 spec.csi.volumeHandle 值取代為前面步驟中的 Amazon EFS FileSystemId

  5. 建立測試所需的 Kubernetes 資源:

    kubectl apply -f specs/

    **注意:**上述步驟 5 中的 kubectl 命令建立了 Amazon EFS 儲存類別、PVC、持續性磁碟區和兩個 Pod (app1app2)。

  6. 列出預設命名空間中的持續性磁碟區,並尋找具有 default/efs-claim 宣告的持續性磁碟區:

    kubectl get pv efs-pv
  7. 描述持續性磁碟區:

    kubectl describe pv efs-pv
  8. 測試這兩個 Pod 是否正在將資料寫入檔案中:

    kubectl exec -it app1 -- tail /data/out1.txt  
    kubectl exec -it app2 -- tail /data/out1.txt

    等待約一分鐘。輸出會顯示兩個 Pod 將資料寫入 /data/out1.txt 的目前日期。

    相關資訊

    對 Amazon EFS 進行疑難排解

AWS 官方
AWS 官方已更新 1 年前