跳至內容

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

4 分的閱讀內容
0

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

簡短描述

若要在 Amazon EKS 中使用持續性儲存空間,請完成下列其中一個選項的步驟:

**注意:**出於安全性和效率的考慮,最佳實務是透過 Amazon EKS 附加元件安裝 CSI 驅動程式。安裝最新版本的驅動程式也是一項最佳實務。如需安裝步驟和最新驅動程式版本,請參閱 GitHub 網站上的 aws-ebs-csi-driveraws-efs-csi-driver

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

先決條件:

  • [設定一個與您的 Kubernetes 版本相符的 kubectl 版本](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)。如需版本不一致要求的資訊,請參閱 Kubernetes 網站上的 kubectl

  • 安裝或更新 eksctl。如需說明,請參閱 eksctl 網站上的安裝

  • 設定 AWS Identity and Access Management (IAM) 建立權限。然後,將政策附加到 CSI 驅動程式角色或 Amazon EKS 工作節點角色。

  • 建立您的 Amazon EKS 叢集,然後將工作節點加入叢集。若要確認您是否已將工作節點附加到叢集,請執行以下命令:

    kubectl get nodes
  • 若要確認您的叢集是否存在 IAM OpenID Connect (OIDC) 提供者,請執行下列 describe-cluster AWS CLI 命令:

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

    **注意:**將 your_cluster_name 替換為您的叢集名稱。

  • 若要確認您是否已設定 IAM OIDC 提供者,請執行以下 list-open-id-connect-providers 命令:

    aws iam list-open-id-connect-providers | grep OIDC-ID

    **注意:**將 OIDC-ID 替換為您的 OIDC 提供者 ID。如果您收到 錯誤訊息,請建立 IAM OIDC 提供者"No OpenIDConnect provider found in your account"。

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/OIDC-ID"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/OIDC-ID:aud": "sts.amazonaws.com",
              "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/OIDC-ID:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa"
            }
          }
        }
      ]
    }
    EOF

    **注意:**將 YOUR_AWS_ACCOUNT_ID 替換為您的 AWS 帳戶 ID,將 YOUR_AWS_REGION 替換為您的 AWS 區域,並將 OIDC-ID 替換為您的 OIDC 提供者 ID。

  2. 若要建立名為 AmazonEKS_EBS_CSI_DriverRole 的 IAM 角色,請執行下列 create-role 命令:

    aws iam create-role
     --role-name AmazonEKS_EBS_CSI_DriverRole
     --assume-role-policy-document file://"trust-policy.json"
  3. 若要將 CSI 驅動程式的 AWS 受管 IAM 政策附加到 IAM 角色,請執行下列 attach-role-policy 命令:

    aws iam attach-role-policy
    --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy
    --role-name AmazonEKS_EBS_CSI_DriverRole
  4. 若要部署 Amazon EBS CSI 驅動程式,請使用 Kustomize、Helm 或 Amazon EKS 受管附加元件。如需部署說明,請參閱 GitHub 網站上的安裝

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

Amazon EFS CSI 驅動程式

為 CSI 驅動程式建立 IAM 角色

對於具有工作節點的叢集,完成以下步驟:

  1. 若要使用 AmazonEFSCSIDriverPolicy,請參閱如果在服務帳戶使用 IAM 角色。然後繼續進行步驟 7。
    或者,執行以下命令從 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 政策,請執行以下 create-policy 命令:

    aws iam create-policy
        --policy-name AmazonEKS_EFS_CSI_Driver_Policy
        --policy-document file://iam-policy-example.json
  3. 若要確定叢集的 OIDC 提供者 ID,請執行以下 describe-cluster 命令:

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

    **注意:**將 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/OIDC-ID"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/OIDC-ID:sub": "system:serviceaccount:kube-system:efs-csi-controller-sa"
            }
          }
        }
      ]
    }
    EOF

    **注意:**將 YOUR_AWS_ACCOUNT_ID 替換為您的帳戶 ID,將 YOUR_AWS_REGION 替換為您的區域,並將 OIDC-ID 替換為您叢集的 OIDC 提供者 ID。

  5. 若要建立 IAM 角色,請執行以下 create-role 命令:

    aws iam create-role
      --role-name AmazonEKS_EFS_CSI_DriverRole
      --assume-role-policy-document file://"trust-policy.json"
  6. 若要將新的 IAM 政策附加到角色,請執行以下 attach-role-policy 命令:

    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

    **注意:**將 YOUR_AWS_ACCOUNT_ID 替換為您的帳戶 ID。

  7. 如果您使用受管附加元件,請繼續部署 Amazon EFS CSI 驅動程式。若要安裝自我管理驅動程式,請完成步驟 7-10。將以下內容儲存到名為 efs-service-account.yaml 的 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

    **注意:**將 YOUR_AWS_ACCOUNT_ID 替換為您的帳戶 ID。

  8. 若要在叢集上建立 Kubernetes 服務帳戶,請執行下列命令:

    kubectl apply -f efs-service-account.yaml

    **注意:**efs-csi-controller-sa Kubernetes 服務帳戶具有您所建立 IAM 角色的註解。

  9. 若要從公有 Amazon Elastic Container Registry (Amazon ECR) 註冊表下載清單,請執行下列命令:

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

    **注意:**將 VERSION 替換為您的發行版本號碼。最佳實務是使用最新發行的版本。如需作用中分支的清單,請參閱 GitHub 網站上的分支。您可以使用 Helm 取代 Kustomize 來安裝驅動程式。如需步驟,請參閱 GitHub 網站上的部署驅動程式

  10. 編輯已下載的檔案,移除以下幾行:

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

**注意:**您不需要包含前述幾行,因為您已經在步驟 7 中建立了服務帳戶。

部署 Amazon EFS CSI 驅動程式

若要套用資訊清單,請執行以下命令:

kubectl apply -f public-ecr-driver.yaml

如果您的叢集不包含節點,且僅包含 AWS Fargate Pod,請執行下列命令將驅動程式部署到所有區域:

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

建立 EFS 檔案系統

請完成下列步驟:

  1. 若要取得 Amazon EKS 叢集的虛擬私有雲端 (VPC) ID,請執行下列 describe-cluster 命令:
    aws eks describe-cluster
     --name your_cluster_name
     --query "cluster.resourcesVpcConfig.vpcId"
     --output text
    **注意:**將 your_cluster_name 替換為您的叢集名稱。
  2. 若要取得 VPC 叢集的 CIDR 範圍,請執行以下 describe-vpcs 命令:
    aws ec2 describe-vpcs
     --vpc-ids YOUR_VPC_ID
     --query "Vpcs[].CidrBlock"
     --output text
    **注意:**將 YOUR_VPC_ID 替換為您的 VPC ID。
  3. 若要建立允許傳入網路檔案系統 (NFS) 流量進入 Amazon EFS 掛載點的安全群組,請執行下列 create-security-group 命令:
    aws ec2 create-security-group
     --description efs-test-sg
     --group-name efs-sg
     --vpc-id YOUR_VPC_ID
    **注意:**將 YOUR_VPC_ID 替換為您的 VPC ID。在輸出中,記下 GroupId 值。
  4. 若要允許 VPC 中的資源與 EFS 檔案系統通訊,請執行以下 authorize-security-group-ingress 命令來新增 NFS 傳入規則:
    aws ec2 authorize-security-group-ingress --group-id sg-abc --protocol tcp --port 2049 --cidr YOUR_VPC_CIDR
    **注意:**將 YOUR_VPC_CIDR 替換為您的 VPC CIDR,並將 sg-abc 替換為您的安全群組 ID。
  5. 若要為您的 Amazon EKS 叢集建立 EFS 檔案系統,請執行以下 create-file-system 命令:
    aws efs create-file-system --creation-token eks-efs
    **注意:**記下 FileSystemId
  6. 若要為 Amazon EFS 建立掛載目標,請執行以下 create-mount-target 命令:
    aws efs create-mount-target --file-system-id FileSystemId --subnet-id SubnetID --security-group sg-abc
    **注意:**將 FileSystemId 替換為您的 EFS 檔案系統 ID,將 sg-abc 替換為您的安全群組 ID,並將 SubnetID 替換為您的工作節點子網路 ID。最佳實務是對工作節點執行的每個可用區域執行上述命令。可用區域中的所有 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體都可以使用該檔案系統。若要在多個子網路中建立掛載目標,請對每個子網路 ID 執行該命令。

測試 Amazon EFS CSI 驅動程式

若要部署兩個寫入相同檔案的 Pod,請參閱 GitHub 網站上的多個 Pod 讀寫共用

相關資訊

對與配額相關的檔案作業錯誤進行疑難排解

GitHub 網站上的 Amazon EFS CSI 驅動程式

如何對 Amazon EKS 中 EBS 磁碟區掛載問題進行疑難排解?

如何對 Amazon EKS 中 Amazon EFS 磁碟區掛載問題進行疑難排解?