赞
踩
目录
EKS支持两种持久性存储:
Amazon Elastic Block Store(Amazon EBS):硬盘
Amazon Elastic File System (Amazon EFS):提供简单、无服务器、 set-and-forget 弹性文件系统用于AWS Cloud服务和本地资源,支持网络文件系统版本 4(NFSv4.1 和 NFSv4.0)协议。
使用场景,部署服务多副本,多个pod需共享访问文件,因此通过nfs存储挂载pvc,实现文件共享访问。
这里分为两个步骤(授权访问EFS)
3.1.1 下载 IAM policy json文件
curl -o iam-policy-example.json https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/docs/iam-policy-example.json
3.1.2 创建iam policy
- # 策略名可自定义,替换AmazonEKS_EFS_CSI_Driver_Policy 即可
- aws iam create-policy \
- --policy-name AmazonEKS_EFS_CSI_Driver_Policy \
- --policy-document file://iam-policy-example.json
3.1.3 创建eks serviceaccount
- # 运行下面的命令,以创建 IAM 角色和 Kubernetes 服务账户。它还将策略附加到角色,用 IAM 角色 ARN 对 Kubernetes 服务账户添加注释,并将 Kubernetes 服务账户名称添加到 IAM 角色的信任策略中。请将 my-cluster 替换为您的集群名称,并将 111122223333 替换为您的账户 ID。将 region-code 替换为集群所在的 AWS 区域。如果您的集群位于 AWS GovCloud(美国东部)或 AWS GovCloud(美国西部)AWS 区域,则将 arn:aws: 替换为 arn:aws-us-gov:。
- eksctl create iamserviceaccount \
- --cluster my-cluster \
- --namespace kube-system \
- --name efs-csi-controller-sa \
- --attach-policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_EFS_CSI_Driver_Policy \
- --approve \
- --region region-code
helm安装efs csi驱动
- helm repo add aws-efs-csi-driver https://kubernetes-sigs.github.io/aws-efs-csi-driver/
- helm repo update
- # 使用 Helm Chart 安装驱动程序的版本。请将存储库地址替换为集群的容器镜像地址,即集群所在可用区
- # 镜像地址参考:https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/add-ons-images.html
- helm upgrade -i aws-efs-csi-driver aws-efs-csi-driver/aws-efs-csi-driver \
- --namespace kube-system \
- --set image.repository=602401143452.dkr.ecr.region-code.amazonaws.com/eks/aws-efs-csi-driver \
- --set controller.serviceAccount.create=false \
- --set controller.serviceAccount.name=efs-csi-controller-sa
检索EKS集群所在的 VPC ID,并将其存储在变量中,以便在后续步骤中使用。将 my-cluster 替换为您的集群名称
- vpc_id=$(aws eks describe-cluster \
- --name my-cluster \
- --query "cluster.resourcesVpcConfig.vpcId" \
- --output text)
检索您的集群的 VPC 的 CIDR 范围,并将其存储在变量中,以便在后续步骤中使用
- cidr_range=$(aws ec2 describe-vpcs \
- --vpc-ids $vpc_id \
- --query "Vpcs[].CidrBlock" \
- --output text)
创建一个安全组,将 example values 替换为您自己的值
- security_group_id=$(aws ec2 create-security-group \
- --group-name MyEfsSecurityGroup \
- --description "My EFS security group" \
- --vpc-id $vpc_id \
- --output text)
创建一条入站规则,该入站规则允许来自您的集群 VPC 的 CIDR 的入站 NFS 流量
- aws ec2 authorize-security-group-ingress \
- --group-id $security_group_id \
- --protocol tcp \
- --port 2049 \
- --cidr $cidr_range
创建文件系统。将 region-code 替换为集群所在的 AWS 区域
- file_system_id=$(aws efs create-file-system \
- --region region-code \
- --performance-mode generalPurpose \
- --query 'FileSystemId' \
- --output text)
确定 VPC 中子网的 ID 以及子网所在的可用区
- aws ec2 describe-subnets \
- --filters "Name=vpc-id,Values=$vpc_id" \
- --query 'Subnets[*].{SubnetId: SubnetId,AvailabilityZone: AvailabilityZone,CidrBlock: CidrBlock}' \
- --output table
输出示例如下
- | DescribeSubnets |
- +------------------+--------------------+----------------------------+
- | AvailabilityZone | CidrBlock | SubnetId |
- +------------------+--------------------+----------------------------+
- | region-codec | 192.168.128.0/19 | subnet-EXAMPLE6e421a0e97 |
- | region-codeb | 192.168.96.0/19 | subnet-EXAMPLEd0503db0ec |
- | region-codec | 192.168.32.0/19 | subnet-EXAMPLEe2ba886490 |
- | region-codeb | 192.168.0.0/19 | subnet-EXAMPLE123c7c5182 |
- | region-codea | 192.168.160.0/19 | subnet-EXAMPLE0416ce588p |
- +------------------+--------------------+----------------------------+
根据eks节点所在子网添加挂载目标,节点是多可用区,则每个可用区的子网都将运行一次命令,将 subnet-EXAMPLEe2ba886490 替换为相应的子网 ID
- aws efs create-mount-target \
- --file-system-id $file_system_id \
- --subnet-id subnet-EXAMPLEe2ba886490 \
- --security-groups $security_group_id
这里使用存储类动态生成pvc的方式
- aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text
- # 输出示例如下
- fs-582a03f3
- # 下载storageclass.yaml
- curl -o storageclass.yaml https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/storageclass.yaml
- #编辑文件,将 fileSystemId 的值替换为cfs ID
- fileSystemId: fs-582a03f3
- # 创建存储类
- kubectl apply -f storageclass.yaml
-
- kubectl get sc
- NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
- efs-sc efs.csi.aws.com Delete Immediate false 152m
- # pvc.yaml
- apiVersion: v1
- kind: PersistentVolumeClaim
- metadata:
- name: efs-claim
- spec:
- accessModes:
- - ReadWriteMany
- storageClassName: efs-sc
- resources:
- requests:
- storage: 5Gi
-
- kubectl apply -f pvc.yaml
- #pod.yaml
- apiVersion: v1
- kind: Pod
- metadata:
- name: efs-app
- spec:
- containers:
- - name: app
- image: centos
- command: ["/bin/sh"]
- args: ["-c", "while true; do echo $(date -u) >> /data/out; sleep 5; done"]
- volumeMounts:
- - name: persistent-storage
- mountPath: /data
- volumes:
- - name: persistent-storage
- persistentVolumeClaim:
- claimName: efs-claim
-
- kubectl apply -f pod.yaml

efs csi驱动和efs创建、安全组配置须根据步骤一一进行,否则pod挂载pvc使用时,有可能出现问题,如:Stale file handlers for EFS ,Stale file handlers for EFS mounts · Issue #614 · kubernetes-sigs/aws-efs-csi-driver (github.com)
觉得好用就收藏吧~ a~w~s~t~u~i
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。