Amazon EKS 中 EFS 持久性存儲
- 2022 年 1 月 11 日
- 筆記
- AWS, Kubernetes
作者:SRE運維博客
博客地址://www.cnsre.cn/
文章地址://www.cnsre.cn/posts/220110850573/
相關話題://www.cnsre.cn/tags/eks/
學習目標
- 在 EKS 中部署 Amazon EFS CSI 驅動程序到
- 驗證 EFS 並驗證它是否正常工作
- 創建基於 EFS 的靜態、動態存儲
前提條件
- EKS 集群
- AWS CLI 如果你沒有安裝請查看安裝、更新和卸載 AWS CLI。在安裝 AWS CLI 後,還要對其進行配置。
- kubectl 如果沒有安裝 請查看安裝 kubectl。
創建 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)中點擊 策略
然後在下一步中點擊 創建策略
點擊 json
然後將 IAM 策略
填入, 然後點擊 下一步:標籤
在下一步的標籤中,可以根據自己的情況自行填寫,然後點擊 下一步:審核
名稱中填寫 AmazonEKS_EFS_CSI_Driver_Policy
{{< notice warning “注意” >}}
你可以將 AmazonEKS_EFS_CSI_Driver_Policy 更改為其他名稱,但如果更改,請確保在後續步驟中也做出相應更改。
{{< /notice >}}
將 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
在角色中點擊 附加策略
搜索之前創建的 EFS 策略 也就是 AmazonEKS_EFS_CSI_Driver_Policy
然後選中,點擊最下方的附加策略。
安裝 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
驅動所在的位置
然後將鏡像修改為 918309763551.dkr.ecr.cn-north-1.amazonaws.com.cn/eks/aws-efs-csi-driver:v1.3.3
具體如下
創建 Amazon EFS 文件系統
為 Amazon EKS 集群創建 Amazon EFS 文件系統
在控制台中搜索 efs
點擊確認然後進入 EFS
控制台
在控制台中點擊 創建文件系統
名稱: 根據自己的情況填寫
vpc: 一定要創建在跟 eks
同一 VPC
下
可用性和持久性: 根據提示說明創建自己所需要的
如果有更多需求可以點擊 自定義來設置更多
如:吞吐量、加密、備份等策略
最後點擊 創建
創建入站規則
允許來自 EKS 集群 VPC 的 CIDR 的入站 NFS 流量
在剛剛創建的 EFS
中選擇 網絡
–> 安全組
然後複製安全組的ID sg-152XXX
在 EC2
中找到 網絡與安全
選擇 安全組
然後在搜索框中搜索 sg-152XXX
選中安全組。並選擇 入站規則
在入站規則中允許來 EKS 集群來訪問 NFS(2049)端口流量。
部署示例應用程序
{{< tabs 部署靜態供給 內容部署動態供給 >}}
{{< tab >}}
部署靜態供給
部署使用你創建的持久性卷的示例應用程序
此過程利用來自 Amazon EFS Container Storage Interface (CSI) 驅動程序 GitHub 存儲庫的多個 Pod 讀寫許多示例來使用靜態預置的 Amazon EFS 持久性卷,並使用 ReadWriteMany
訪問模式從多個 Pod 訪問它。
-
將 Amazon EFS Container Storage Interface (CSI) 驅動程序 GitHub 存儲庫克隆到你的本地系統。
git clone //github.com/kubernetes-sigs/aws-efs-csi-driver.git
-
導航到
multiple_pods
示例目錄。cd aws-efs-csi-driver/examples/kubernetes/multiple_pods/
-
檢索你的 Amazon EFS 文件系統 ID。你可以在 Amazon EFS 控制台中查找此信息,或者使用以下 AWS CLI 命令。
aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text
輸出:
fs-<582a03f3>
-
編輯
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 文件系統的大小。 -
從
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
-
列出默認命名空間中的持久性卷。查找具有
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
之前,請勿繼續執行下一步。 -
從
specs
目錄部署app1
和app2
示例應用程序。kubectl apply -f specs/pod1.yaml kubectl apply -f specs/pod2.yaml
-
查看默認命名空間中的 Pod 並等待
app1
和app2
Pod 的STATUS
變為Running
狀態。kubectl get pods --watch
注意
可能需要幾分鐘 Pod 才能達到
Running
狀態。 -
描述持久性卷。
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
列出。 -
驗證
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 ...
-
驗證
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 ...
-
完成試驗時,請刪除此示例應用程序的資源以進行清理。
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) 動態創建一個持久性卷。
-
為 EFS 創建存儲類。有關所有參數和配置選項,請參閱 GitHub 上的 Amazon EFS CSI 驅動程序。
-
下載 Amazon EFS 的
StorageClass
清單。curl -o storageclass.yaml //raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/storageclass.yaml
-
編輯相應文件,將
fileSystemId
的值替換為您的文件系統 ID。 -
部署存儲類。
kubectl apply -f storageclass.yaml
-
-
通過部署利用
PersistentVolumeClaim
的 Pod 來測試自動預置:-
下載一個清單,該清單將部署一個 Pod 和一個 PersistentVolumeClaim。
curl -o pod.yaml //raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/pod.yaml
-
使用示例應用程序和 Pod 使用的 PersistentVolumeClaim 來部署 Pod。
kubectl apply -f pod.yaml
-
-
確定運行控制器的 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
-
幾秒鐘後,您可以觀察到控制器開始接受更改(已編輯,旨在提高可讀性)。將
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 之一運行上一個命令。
-
確認已創建狀態為
Bound
至PersistentVolumeClaim
的持久性卷: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
-
查看有關所創建的
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
-
查看示例應用程序 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 ...
-
(可選)終止運行 Pod 的 Amazon EKS 節點並等待重新安排運行 Pod。或者,您也可以刪除 Pod 並重新部署它。再次完成步驟 7,確認輸出包含先前的輸出。
{{< /tab >}}
{{< /tabs >}}
作者:SRE運維博客
博客地址://www.cnsre.cn/
文章地址://www.cnsre.cn/posts/220110850573/
相關話題://www.cnsre.cn/tags/eks/