作者:SRE 运维博客
博客地址:https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/220110850573/
相干话题:https://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 https://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 https://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 https://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 运维博客
博客地址:https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/220110850573/
相干话题:https://www.cnsre.cn/tags/eks/