如何在 Amazon EKS 中使用持續性儲存空間?
我想要在 Amazon Elastic Kubernetes Service (Amazon EKS) 中使用持續性儲存空間。
簡短描述
若要在 Amazon EKS 中設定持續性儲存空間,請使用下列任一選項:
- Amazon Elastic Block Store (Amazon EBS) 容器儲存介面 (CSI) 驅動程式
- Amazon Elastic File System (Amazon EFS) 容器儲存介面 (CSI) 驅動程式
若要使用其中一個選項,請完成下列任一節中的步驟:
- 選項 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。
在完成任一節中的步驟之前,您必須:
-
設定 AWS Identity and Access Management (IAM) 許可,以建立政策並將其連接到 Amazon EKS 工作節點角色 CSI 驅動程式角色。
**注意:**下列各節中的命令並不總是使用 --region 變數。如果您不使用 --region,則這些命令會使用 AWS 區域的預設值。若要檢查預設值,請執行 AWS CLI configure 命令。 -
建立 Amazon EKS 叢集,並將工作節點加入叢集。
**注意:**執行 kubectl get nodes 命令,以確認工作節點已連接至叢集。 -
若要確認您的叢集中存在 AWS IAM OpenID Connect (OIDC) 供應商,請執行下列命令:
aws eks describe-cluster --name your_cluster_name --query "cluster.identity.oidc.issuer" --output text
**注意:**將 your_cluster_name 取代為您的叢集名稱。
-
確認已設定您的 IAM OIDC 供應商:
aws iam list-open-id-connect-providers | grep OIDC_PROVIDER_ID
注意:將 OIDC 供應商的 ID 取代為您的 OIDC ID。如果收到在您的帳戶中找不到 OpenIDConnect 供應商錯誤,您必須建立 IAM OIDC 供應商。
-
建立 IAM OIDC 供應商:
eksctl utils associate-iam-oidc-provider --cluster my-cluster --approve
**注意:**將 my-cluster 取代為您的叢集名稱。
選項 A: 部署和測試 Amazon EBS CSI 驅動程式
部署 Amazon EBS CSI 驅動程式:
-
建立類似下列範例的 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 供應商的輸出結果。
-
建立名為 Amazon_EBS_CSI_Driver 的 IAM 角色:
aws iam create-role \ --role-name AmazonEKS_EBS_CSI_Driver \ --assume-role-policy-document file://"trust-policy.json"
-
將 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
-
部署 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 安裝指南。
-
檢查 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 磁碟區。
-
複製 AWS GitHub 中的 aws-ebs-csi-driver 儲存庫:
git clone https://github.com/kubernetes-sigs/aws-ebs-csi-driver.git
-
將您的工作目錄變更為包含 Amazon EBS 驅動程式測試檔案的資料夾:
cd aws-ebs-csi-driver/examples/kubernetes/dynamic-provisioning/
-
建立測試所需的 Kubernetes 資源:
kubectl apply -f manifests/
**注意:**kubectl 命令會建立 StorageClass、PersistentVolumeClaim (PVC) 和 Pod。Pod 會參考 PVC。只有在建立 Pod 時,才會佈建 Amazon EBS 磁碟區。如需詳細資訊,請參閱 Kubernetes 網站上的儲存類別和 PersistentVolumeClaims。
-
描述 ebs-sc 儲存類別:
kubectl describe storageclass ebs-sc
-
監視預設命名空間中的 Pod,並等待 app Pod 的狀態變更為正在執行。例如:
kubectl get pods --watch
-
檢視因參考 PVC 的 Pod 而建立的持續性磁碟區:
kubectl get pv
-
檢視持續性磁碟區的相關資訊:
kubectl describe pv your_pv_name
**注意:**將 your_pv_name 取代為上一節中步驟 6 傳回之持續性磁碟區的名稱。輸出中的 Source.VolumeHandle 屬性的值是在您帳戶中建立的實體 Amazon EBS 磁碟區的 ID。
-
確認 Pod 正在將資料寫入磁碟區中:
kubectl exec -it app -- cat /data/out.txt
**注意:**命令輸出會顯示 /data/out.txt 檔案中儲存的目前日期和時間。該檔案包括日、月、日期和時間。
選項 B: 部署和測試 Amazon EFS CSI 驅動程式
在部署 CSI 驅動程式之前,先建立 IAM 角色,讓 CSI 驅動程式的服務帳戶代表您呼叫 AWS API。
-
從 GitHub 中下載 IAM 政策文件:
curl -o iam-policy-example.json https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/docs/iam-policy-example.json
-
建立 IAM 政策:
aws iam create-policy \ --policy-name AmazonEKS_EFS_CSI_Driver_Policy \ --policy-document file://iam-policy-example.json
-
執行下列命令,以確定叢集的 OIDC 供應商 URL:
aws eks describe-cluster --name your_cluster_name --query "cluster.identity.oidc.issuer" --output text
**注意:**在步驟 3 中,將 your_cluster_name 取代為您的叢集名稱。
-
建立下列 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 中傳回的值。
-
建立 IAM 角色:
aws iam create-role \ --role-name AmazonEKS_EFS_CSI_DriverRole \ --assume-role-policy-document file://"trust-policy.json"
-
將您的新 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
-
將下列內容儲存至名為 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
-
在叢集上建立 Kubernetes 服務帳戶。使用您建立的 IAM 角色為名為 efs-csi-controller-sa 的 Kubernetes 服務帳戶加上註解。
kubectl apply -f efs-service-account.yaml
-
透過下載清單檔案,使用儲存在公有 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 模式同時寫入磁碟區。
-
若要部署 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
建立 Amazon EFS 檔案系統
-
取得您的 Amazon EKS 叢集的 VPC ID:
aws eks describe-cluster --name your_cluster_name --query "cluster.resourcesVpcConfig.vpcId" --output text
**注意:**在步驟 3 中,將 your_cluster_name 取代為您的叢集名稱。
-
取得 VPC 叢集的 CIDR 範圍:
aws ec2 describe-vpcs --vpc-ids YOUR_VPC_ID --query "Vpcs[].CidrBlock" --output text
**注意:**在步驟 4 中,將 YOUR_VPC_ID 取代為上一節中步驟 3 的 VPC ID。
-
建立安全群組,以允許 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 以供稍後使用。
-
新增 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。
-
為您的 Amazon EKS 叢集建立 Amazon EFS 檔案系統:
aws efs create-file-system --creation-token eks-efs
**注意:**儲存 FileSystemId 以供稍後使用。
-
若要為 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 驅動程式。
-
複製 AWS GitHub 中的 aws-efs-csi-driver 儲存庫:
git clone https://github.com/kubernetes-sigs/aws-efs-csi-driver.git
-
將您的工作目錄變更為包含 Amazon EFS CSI 驅動程式測試檔案的資料夾:
cd aws-efs-csi-driver/examples/kubernetes/multiple_pods/
-
擷取先前建立的 Amazon EFS 檔案系統 ID:
aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text
**注意:**如果步驟 3 的命令傳回多個結果,您可以使用先前儲存的 Amazon EFS 檔案系統 ID。
-
在 specs/pv.yaml 檔案中,將 spec.csi.volumeHandle 值取代為前面步驟中的 Amazon EFS FileSystemId。
-
建立測試所需的 Kubernetes 資源:
kubectl apply -f specs/
**注意:**上述步驟 5 中的 kubectl 命令建立了 Amazon EFS 儲存類別、PVC、持續性磁碟區和兩個 Pod (app1 和 app2)。
-
列出預設命名空間中的持續性磁碟區,並尋找具有 default/efs-claim 宣告的持續性磁碟區:
kubectl get pv efs-pv
-
描述持續性磁碟區:
kubectl describe pv efs-pv
-
測試這兩個 Pod 是否正在將資料寫入檔案中:
kubectl exec -it app1 -- tail /data/out1.txt kubectl exec -it app2 -- tail /data/out1.txt
等待約一分鐘。輸出會顯示兩個 Pod 將資料寫入 /data/out1.txt 的目前日期。
相關資訊
相關內容
- 已提問 1 年前lg...
- 已提問 9 個月前lg...
- 已提問 1 年前lg...
- 已提問 6 個月前lg...
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 3 個月前