Amazon EKS 中 EFS 持久性存儲


作者:SRE運維博客
博客地址://www.cnsre.cn/
文章地址://www.cnsre.cn/posts/220110850573/
相關話題://www.cnsre.cn/tags/eks/


學習目標

  • 在 EKS 中部署 Amazon EFS CSI 驅動程序到
  • 驗證 EFS 並驗證它是否正常工作
  • 創建基於 EFS 的靜態、動態存儲

前提條件

創建 IAM 策略

創建 IAM 策略並將其分配給 IAM 角色。該策略將允許 Amazon EFS 驅動程序與文件系統交互。

1.從 查看下方 IAM 策略文檔或者查看策略文檔

{{< notice warning “注意” >}}
推薦使用 查看 策略文檔。獲取策略文檔。
{{< /notice >}}

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "elasticfilesystem:DescribeAccessPoints",
        "elasticfilesystem:DescribeFileSystems"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "elasticfilesystem:CreateAccessPoint"
      ],
      "Resource": "*",
      "Condition": {
        "StringLike": {
          "aws:RequestTag/efs.csi.aws.com/cluster": "true"
        }
      }
    },
    {
      "Effect": "Allow",
      "Action": "elasticfilesystem:DeleteAccessPoint",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:ResourceTag/efs.csi.aws.com/cluster": "true"
        }
      }
    }
  ]
}

2.在IAM-策略 中創建策略

Identity and Access Management (IAM)中點擊 策略 然後在下一步中點擊 創建策略

sre運維|Linux運維|關鍵詞

sre運維|Linux運維|關鍵詞
點擊 json 然後將 IAM 策略 填入, 然後點擊 下一步:標籤
sre運維|Linux運維|關鍵詞
在下一步的標籤中,可以根據自己的情況自行填寫,然後點擊 下一步:審核
sre運維|Linux運維|關鍵詞
名稱中填寫 AmazonEKS_EFS_CSI_Driver_Policy
{{< notice warning “注意” >}}
你可以將 AmazonEKS_EFS_CSI_Driver_Policy 更改為其他名稱,但如果更改,請確保在後續步驟中也做出相應更改。
{{< /notice >}}
sre運維|Linux運維|關鍵詞

將 efs 策略 附件到 eks node 角色中

將我們剛才創建的 efs 策略 AmazonEKS_EFS_CSI_Driver_Policy 附加在 eks_node 的角色中,確保eks node擁有efs的權限。

{{< notice warning “注意” >}}
如果你之前創建了 eks 那麼在你的角色中會有一個名為 eksctl-<eks-name>-nodegrou-NodeInstanceRole-xxxxxxxxx 的角色。
{{< /notice >}}

角色中搜索 node 然後點擊 eksctl-<eks-name>-nodegrou-NodeInstanceRole-xxxxxxxxx
sre運維|Linux運維|關鍵詞
在角色中點擊 附加策略
sre運維|Linux運維|關鍵詞
搜索之前創建的 EFS 策略 也就是 AmazonEKS_EFS_CSI_Driver_Policy 然後選中,點擊最下方的附加策略。
sre運維|Linux運維|關鍵詞

安裝 Amazon EFS 驅動程序

使用 Helm 或 yaml 清單安裝 Amazon EFS CSI 驅動程序。
這邊不詳細說 helm 部署方式主要介紹 yaml 清單部署
{{< notice warning “注意” >}}
一定要修改鏡像地址為你所在的地區 Amazon EKS 附加組件容器鏡像地址
{{< /notice >}}

yaml 清單部署

{{< notice info “提示” >}}
因為github網絡的問題。如果再執行的時候部署沒有反應,請終止運行,多運行幾次嘗試部署
{{< /notice >}}

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

輸出如下:

serviceaccount/efs-csi-controller-sa created
serviceaccount/efs-csi-node-sa created
clusterrole.rbac.authorization.k8s.io/efs-csi-external-provisioner-role created
clusterrolebinding.rbac.authorization.k8s.io/efs-csi-provisioner-binding created
deployment.apps/efs-csi-controller created
daemonset.apps/efs-csi-node created
csidriver.storage.k8s.io/efs.csi.aws.com created

檢查驅動運行是否正常

kubectl  get  pods -A|grep  efs
kube-system                    efs-csi-controller-56f6dc4c76-2lvqf               3/3     Running     0          3m32s
kube-system                    efs-csi-controller-56f6dc4c76-dxkwl               3/3     Running     0          3m32s
kube-system                    efs-csi-node-9ttxp                                3/3     Running     0          3m32s
kube-system                    efs-csi-node-hsn94                                3/3     Running     0          3m32s

{{< notice warning “注意” >}}
雖然這邊顯示運行正常,但是還是要修改鏡像地址。不然在創建pv,pvc以後在pod中掛載會出現錯誤。(後面會單獨記錄這個錯誤)
{{< /notice >}}

修改 efs-csi-node 驅動

kubectl edit     daemonsets.apps  -n kube-system efs-csi-node

找到 aws-efs-csi-driver 驅動所在的位置
sre運維|Linux運維|關鍵詞

然後將鏡像修改為 918309763551.dkr.ecr.cn-north-1.amazonaws.com.cn/eks/aws-efs-csi-driver:v1.3.3

具體如下
sre運維|Linux運維|關鍵詞

創建 Amazon EFS 文件系統

為 Amazon EKS 集群創建 Amazon EFS 文件系統

在控制台中搜索 efs 點擊確認然後進入 EFS 控制台
sre運維|Linux運維|關鍵詞
在控制台中點擊 創建文件系統
sre運維|Linux運維|關鍵詞
名稱: 根據自己的情況填寫
vpc: 一定要創建在跟 eks 同一 VPC
可用性和持久性: 根據提示說明創建自己所需要的
如果有更多需求可以點擊 自定義來設置更多 如:吞吐量、加密、備份等策略
最後點擊 創建
sre運維|Linux運維|關鍵詞

創建入站規則

允許來自 EKS 集群 VPC 的 CIDR 的入站 NFS 流量
在剛剛創建的 EFS 中選擇 網絡 –> 安全組 然後複製安全組的ID sg-152XXX
sre運維|Linux運維|關鍵詞
EC2 中找到 網絡與安全 選擇 安全組 然後在搜索框中搜索 sg-152XXX 選中安全組。並選擇 入站規則
sre運維|Linux運維|關鍵詞
在入站規則中允許來 EKS 集群來訪問 NFS(2049)端口流量。

部署示例應用程序

{{< tabs 部署靜態供給 內容部署動態供給 >}}
{{< tab >}}

部署靜態供給

部署使用你創建的持久性卷的示例應用程序

此過程利用來自 Amazon EFS Container Storage Interface (CSI) 驅動程序 GitHub 存儲庫的多個 Pod 讀寫許多示例來使用靜態預置的 Amazon EFS 持久性卷,並使用 ReadWriteMany 訪問模式從多個 Pod 訪問它。

  1. Amazon EFS Container Storage Interface (CSI) 驅動程序 GitHub 存儲庫克隆到你的本地系統。

    git clone //github.com/kubernetes-sigs/aws-efs-csi-driver.git
    
  2. 導航到 multiple_pods 示例目錄。

    cd aws-efs-csi-driver/examples/kubernetes/multiple_pods/
    
  3. 檢索你的 Amazon EFS 文件系統 ID。你可以在 Amazon EFS 控制台中查找此信息,或者使用以下 AWS CLI 命令。

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

    輸出:

    fs-<582a03f3>
    
  4. 編輯 specs/pv.yaml 文件並將 volumeHandle 值替換為你的 Amazon 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-<582a03f3>
    

    注意

    由於 Amazon EFS 是彈性文件系統,因此它不會強制實施任何文件系統容量限制。在創建系統時,不使用持久性卷和持久性卷聲明中的實際存儲容量值。但是,由於存儲容量是 Kubernetes 中的必需字段,你必須指定有效值,例如,在此示例中為 5Gi。此值不會限制 Amazon EFS 文件系統的大小。

  5. specs 目錄部署 efs-sc 存儲類、efs-claim 持久性卷聲明以及 efs-pv 持久性卷。

    kubectl apply -f specs/pv.yaml
    kubectl apply -f specs/claim.yaml
    kubectl apply -f specs/storageclass.yaml
    
  6. 列出默認命名空間中的持久性卷。查找具有 default/efs-claim 聲明的持久性卷。

    kubectl get pv -w
    

    輸出:

    NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   REASON   AGE
    efs-pv   5Gi        RWX            Retain           Bound    default/efs-claim   efs-sc                  2m50s
    

    STATUS 變為 Bound 之前,請勿繼續執行下一步。

  7. specs 目錄部署 app1app2 示例應用程序。

    kubectl apply -f specs/pod1.yaml
    kubectl apply -f specs/pod2.yaml
    
  8. 查看默認命名空間中的 Pod 並等待 app1app2 Pod 的 STATUS 變為 Running 狀態。

    kubectl get pods --watch
    

    注意

    可能需要幾分鐘 Pod 才能達到 Running 狀態。

  9. 描述持久性卷。

    kubectl describe pv efs-pv
    

    輸出:

    Name:            efs-pv
    Labels:          none
    Annotations:     kubectl.kubernetes.io/last-applied-configuration:
                       {"apiVersion":"v1","kind":"PersistentVolume","metadata":{"annotations":{},"name":"efs-pv"},"spec":{"accessModes":["ReadWriteMany"],"capaci...
                     pv.kubernetes.io/bound-by-controller: yes
    Finalizers:      [kubernetes.io/pv-protection]
    StorageClass:    efs-sc
    Status:          Bound
    Claim:           default/efs-claim
    Reclaim Policy:  Retain
    Access Modes:    RWX
    VolumeMode:      Filesystem
    Capacity:        5Gi
    Node Affinity:   none
    Message:
    Source:
        Type:              CSI (a Container Storage Interface (CSI) volume source)
        Driver:            efs.csi.aws.com
        VolumeHandle:      fs-582a03f3
        ReadOnly:          false
        VolumeAttributes:  none
    Events:                none
    

    Amazon EFS 文件系統 ID 將作為 VolumeHandle 列出。

  10. 驗證 app1 Pod 是否成功將數據寫入卷。

    kubectl exec -ti app1 -- tail /data/out1.txt
    

    輸出:

    ...
    Mon Mar 22 18:18:22 UTC 2021
    Mon Mar 22 18:18:27 UTC 2021
    Mon Mar 22 18:18:32 UTC 2021
    Mon Mar 22 18:18:37 UTC 2021
    ...
    
  11. 驗證 app2 Pod 在卷中顯示的數據與 app1 寫入卷的數據相同。

    kubectl exec -ti app2 -- tail /data/out1.txt
    

    輸出:

    ...
    Mon Mar 22 18:18:22 UTC 2021
    Mon Mar 22 18:18:27 UTC 2021
    Mon Mar 22 18:18:32 UTC 2021
    Mon Mar 22 18:18:37 UTC 2021
    ...
    
  12. 完成試驗時,請刪除此示例應用程序的資源以進行清理。

    kubectl delete -f specs/
    

    你還可以手動刪除你創建的文件系統和安全組。
    {{< /tab >}}
    {{< tab >}}

部署動態供給

Prerequisite

您必須使用 1.2x 版或更高版本的 Amazon EFS CSI 驅動程序,該驅動程序需要 1.17 或更高版本的集群。要更新集群,請參閱 更新集群

部署使用控制器所創建的持久性卷的示例應用程序

此過程利用來自 Amazon EFS Container Storage Interface (CSI) 驅動程序 GitHub 存儲庫的動態預置示例。它通過 Amazon EFS 接入點和 Pod 使用的持久性卷申領 (PVC) 動態創建一個持久性卷。

  1. 為 EFS 創建存儲類。有關所有參數和配置選項,請參閱 GitHub 上的 Amazon EFS CSI 驅動程序

    1. 下載 Amazon EFS 的 StorageClass 清單。

      curl -o storageclass.yaml //raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/storageclass.yaml
      
    2. 編輯相應文件,將 fileSystemId 的值替換為您的文件系統 ID。

    3. 部署存儲類。

      kubectl apply -f storageclass.yaml
      
  2. 通過部署利用 PersistentVolumeClaim 的 Pod 來測試自動預置:

    1. 下載一個清單,該清單將部署一個 Pod 和一個 PersistentVolumeClaim。

      curl -o pod.yaml //raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/pod.yaml
      
    2. 使用示例應用程序和 Pod 使用的 PersistentVolumeClaim 來部署 Pod。

      kubectl apply -f pod.yaml
      
  3. 確定運行控制器的 Pod 的名稱。

    kubectl get pods -n kube-system | grep efs-csi-controller
    

    輸出

    efs-csi-controller-74ccf9f566-q5989   3/3     Running   0          40m
    efs-csi-controller-74ccf9f566-wswg9   3/3     Running   0          40m
    
  4. 幾秒鐘後,您可以觀察到控制器開始接受更改(已編輯,旨在提高可讀性)。將 74ccf9f566-q5989 替換成來自上一個命令輸出中的一個 Pod 的值。

    kubectl logs efs-csi-controller-74ccf9f566-q5989 \
        -n kube-system \
        -c csi-provisioner \
        --tail 10
    

    輸出

    ...
    1 controller.go:737] successfully created PV pvc-5983ffec-96cf-40c1-9cd6-e5686ca84eca for PVC efs-claim and csi volume name fs-95bcec92::fsap-02a88145b865d3a87
    

    如果未看到上一個輸出,請使用其他控制器 Pod 之一運行上一個命令。

  5. 確認已創建狀態為 BoundPersistentVolumeClaim 的持久性卷:

    kubectl get pv
    

    輸出

    NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   REASON   AGE
    pvc-5983ffec-96cf-40c1-9cd6-e5686ca84eca   20Gi       RWX            Delete           Bound    default/efs-claim   efs-sc                  7m57s
    
  6. 查看有關所創建的 PersistentVolumeClaim 的詳細信息。

    kubectl get pvc
    

    輸出

    NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    efs-claim   Bound    pvc-5983ffec-96cf-40c1-9cd6-e5686ca84eca   20Gi       RWX            efs-sc         9m7s
    
  7. 查看示例應用程序 Pod 的狀態。

    kubectl get pods -o wide
    

    輸出

    NAME          READY   STATUS    RESTARTS   AGE   IP               NODE                                           NOMINATED NODE   READINESS GATES
    efs-example   1/1     Running   0          10m   192.168.78.156   ip-192-168-73-191.us-west-2.compute.internal   <none>           <none>
    

    確認數據已寫入到卷。

    kubectl exec efs-app -- bash -c "cat data/out"
    

    輸出

    ...
    Tue Mar 23 14:29:16 UTC 2021
    Tue Mar 23 14:29:21 UTC 2021
    Tue Mar 23 14:29:26 UTC 2021
    Tue Mar 23 14:29:31 UTC 2021
    ...
    
  8. (可選)終止運行 Pod 的 Amazon EKS 節點並等待重新安排運行 Pod。或者,您也可以刪除 Pod 並重新部署它。再次完成步驟 7,確認輸出包含先前的輸出。
    {{< /tab >}}
    {{< /tabs >}}


作者:SRE運維博客
博客地址://www.cnsre.cn/
文章地址://www.cnsre.cn/posts/220110850573/
相關話題://www.cnsre.cn/tags/eks/