EKS Kubernetes通过EKS存储服务实现持久存储

[*]

/ *自定义CSS * /
.tdi_3_a80.td-a-rec {
文本对齐:居中;
} .tdi_3_a80 .td-element-style {
z索引:-1;
} .tdi_3_a80.td-a-rec-img {
文字对齐:左;
} .tdi_3_a80.td-a-rec-img img {
保证金:0自动0 0;
} @media(最大宽度:767像素){
.tdi_3_a80.td-a-rec-img {
文本对齐:居中;
}
}

这是续集。
您可以通过以下链接以PDF格式下载本文来支持我们。

以PDF格式下载指南


这是续集。

这是续集。
这是续集。

本教程介绍了如何使用EKS Amazon服务配置EKS持久存储以用于Kubernetes集群。这里使用的存储后端服务是EFS。这将是有状态应用程序使用的批量声明的默认持久性存储。 StorageClass为管理员提供了一种描述他们提供的存储“类”的方法,以实现持久性卷的动态配置。

在Kubernetes中,PersistentVolume(PV)是集群中存储的一部分,而PersistentVolumeClaim(PVC)是用户(通常是pod)的存储请求。在使用本指南为容器化工作负载设置持久性存储之前,需要一个有效的EKS群集。

设置先决条件

[*]

/ *自定义CSS * /
.tdi_2_fcc.td-a-rec {
文本对齐:居中;
} .tdi_2_fcc .td-element-style {
z索引:-1;
} .tdi_2_fcc.td-a-rec-img {
文字对齐:左;
} .tdi_2_fcc.td-a-rec-img img {
保证金:0自动0 0;
} @media(最大宽度:767像素){
.tdi_2_fcc.td-a-rec-img {
文本对齐:居中;
}
}

  • EKS集群:使用eksctl设置EKS集群
  • AWS CLI

这是本教程中使用的EKS集群的名称。

$ eksctl get cluster
NAME			REGION
prod-eks-cluster	eu-west-1

将群集名称另存为变量,以在其余步骤中使用。

EKS_CLUSTER="prod-eks-cluster"

通过使用EFS CSI驱动程序创建持久卷

亚马逊弹性文件系统 容器存储接口(CSI)驱动程序 CSI 一种容器协调程序规范,用于管理Amazon EFS文件系统的生命周期。

步骤1:创建Amazon EFS文件系统

Amazon EFS CSI驱动程序是 Amazon EFS接入点它是Amazon EFS文件系统中特定于应用程序的入口点,可促进在多个Pod之间共享文件系统。

您可以从Amazon控制台或终端执行这些操作。所有操作均使用AWS CLI界面。

查找您的Amazon EKS集群的VPC ID。

EKS_CLUSTER="prod-eks-cluster"
EKS_VPC_ID=$(aws eks describe-cluster --name $EKS_CLUSTER --query "cluster.resourcesVpcConfig.vpcId" --output text)

如果有效,请检查VPC ID。

$ echo $EKS_VPC_ID
vpc-019a6458a973ace2b

查找群集的VPC的CIDR范围。

EKS_VPC_CIDR=$(aws ec2 describe-vpcs --vpc-ids $EKS_VPC_ID --query "Vpcs[].CidrBlock" --output text)

检查VPC CIDR。

$ echo $EKS_VPC_CIDR
192.168.0.0/16

创建一个安全组,该安全组允许您的Amazon EFS挂载点的入站NFS流量。

aws ec2 create-security-group --group-name efs-nfs-sg --description "Allow NFS traffic for EFS" --vpc-id $EKS_VPC_ID

记下安全组ID。我的是:

{
    "GroupId": "sg-0fac73a0d7d943862"
}
# You can check with
$ aws ec2 describe-security-groups --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}"

将规则添加到安全组。

SG_ID="sg-0fac73a0d7d943862"
aws ec2 authorize-security-group-ingress --group-id $SG_ID --protocol tcp --port 2049 --cidr $EKS_VPC_CIDR

要查看对安全组的更改,请运行describe-security-groups命令。

$ aws ec2 describe-security-groups --group-ids $SG_ID
{
    "SecurityGroups": [
        {
            "Description": "Allow NFS traffic for EFS",
            "GroupName": "efs-nfs-sg",
            "IpPermissions": [
                {
                    "FromPort": 2049,
                    "IpProtocol": "tcp",
                    "IpRanges": [
                        {
                            "CidrIp": "192.168.0.0/16"
                        }
                    ],
                    "Ipv6Ranges": [],
                    "PrefixListIds": [],
                    "ToPort": 2049,
                    "UserIdGroupPairs": []
                }
            ],
            "OwnerId": "253859766502",
            "GroupId": "sg-0fac73a0d7d943862",
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "Ipv6Ranges": [],
                    "PrefixListIds": [],
                    "UserIdGroupPairs": []
                }
            ],
            "VpcId": "vpc-019a6458a973ace2b"
        }
    ]
}

为您的Amazon EKS集群创建Amazon EFS文件系统。

# Not encrypted
$ aws efs create-file-system --region eu-west-1

# Encrypted EFS file system
$ aws efs create-file-system --encrypted --region eu-west-1

记下文件系统ID。

{
    "OwnerId": "253759766542",
    "CreationToken": "c16c4603-c7ac-408f-ac4a-75a683ed2a29",
    "FileSystemId": "fs-22ac06e8",
    "FileSystemArn": "arn:aws:elasticfilesystem:eu-west-1:253759766542:file-system/fs-22ac06e8",
    "CreationTime": "2020-08-16T15:17:18+03:00",
    "LifeCycleState": "creating",
    "NumberOfMountTargets": 0,
    "SizeInBytes": {
        "Value": 0,
        "ValueInIA": 0,
        "ValueInStandard": 0
    },
    "PerformanceMode": "generalPurpose",
    "Encrypted": true,
    "KmsKeyId": "arn:aws:kms:eu-west-1:253759766542:key/6c9b725f-b86d-41c2-b804-1685ef43f620",
    "ThroughputMode": "bursting",
    "Tags": []
}

用户界面视图:

步骤2:创建EFS挂载目标

在运行EC2实例的VPC中获取子网。在我的情况下,所有EKS实例都在私有子网中运行。

EKS_VPC_ID=$(aws eks describe-cluster --name $EKS_CLUSTER --query "cluster.resourcesVpcConfig.vpcId" --output text)
aws ec2 describe-subnets --filter Name=vpc-id,Values=$EKS_VPC_ID --query 'Subnets[?MapPublicIpOnLaunch==`false`].SubnetId'

我的输出:

[
    "subnet-0977bbaf236bd952f",
    "subnet-0df8523ca39f63938",
    "subnet-0a4a22d25f36c4124"
]

创建一个安装目标。

# File system ID
EFS_ID="fs-22ac06e8"

# Create mount targets for the subnets - Three subnets in my case
for subnet in subnet-0977bbaf236bd952f subnet-0df8523ca39f63938 subnet-0a4a22d25f36c4124; do
  aws efs create-mount-target 
    --file-system-id $EFS_ID 
    --security-group  $SG_ID 
    --subnet-id $subnet 
    --region eu-west-1
done

步骤2:使用EFS CSI驱动程序

创建EFS文件系统和挂载目标后,您可以通过创建静态持久性卷并在测试容器中请求它来测试EFS CSI驱动程序。

部署EFS CSI Provisioner。

$ kubectl apply -k "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/dev/?ref=master"

daemonset.apps/efs-csi-node created
csidriver.storage.k8s.io/efs.csi.aws.com created

可用的CSI驱动程序列表:

$ kubectl get csidrivers.storage.k8s.io
NAME              CREATED AT
efs.csi.aws.com   2020-08-16T19:10:35Z

首先获取EFS文件系统ID。

$ aws efs describe-file-systems --query "FileSystems[*].FileSystemId"
[
    "fs-22ac06e8"
]

创建一个存储类。

kubectl apply -f - <

可用存储类别列表:

$ kubectl get sc
NAME            PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
efs-sc          efs.csi.aws.com         Delete          Immediate              false                  28s
gp2 (default)   kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   false                  4d21h

创建并修改以下清单文件以设置正确的文件系统ID。

$ vim efs-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: efs-pv
spec:
  capacity:
    storage: 1Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: efs-sc
  csi:
    driver: efs.csi.aws.com
    volumeHandle: fs-22ac06e8 # Your EFS file system ID

应用文件以创建资源。

$ kubectl apply -f efs-pv.yml
persistentvolume/efs-pv created

$ kubectl get pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
efs-pv   1Gi        RWO            Retain           Available           efs-sc                  19s

创建索赔资源。

kubectl apply -f - <

列出确保已创建声明并绑定状态的声明。

$ kubectl get pvc
NAME        STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
efs-claim   Bound    efs-pv   1Gi        RWO            efs-sc         7s

创建一个使用批量声明的测试容器。

kubectl apply -f - <centos
    command: ["/bin/sh"]
    args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 5; done"]
    volumeMounts:
    - name: persistent-storage
      mountPath: /data
  volumes:
  - name: persistent-storage
    persistentVolumeClaim:
      claimName: efs-claim
EOF

检查pod是否正在运行。

$ kubectl get pod
NAME      READY   STATUS    RESTARTS   AGE
efs-app   1/1     Running   0          34s

检查容器中的安装点。

$ kubectl exec -ti efs-app -- bash
[[email protected] /]# df -hT
Filesystem     Type     Size  Used Avail Use% Mounted on
overlay        overlay   80G  3.4G   77G   5% /
tmpfs          tmpfs     64M     0   64M   0% /dev
tmpfs          tmpfs    1.9G     0  1.9G   0% /sys/fs/cgroup
127.0.0.1:/    nfs4     8.0E     0  8.0E   0% /data
/dev/nvme0n1p1 xfs       80G  3.4G   77G   5% /etc/hosts
shm            tmpfs     64M     0   64M   0% /dev/shm
tmpfs          tmpfs    1.9G   12K  1.9G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs          tmpfs    1.9G     0  1.9G   0% /proc/acpi
tmpfs          tmpfs    1.9G     0  1.9G   0% /sys/firmware

将测试文件写入 /数据 EFS文件系统的安装位置。

[[email protected] /]# touch /data/testfile1
[[email protected] /]# touch /data/testfile2
[[email protected] /]#
[[email protected] /]# ls /data/
out.txt  testfile1  testfile2
[[email protected] /]# exit
exit

清理测试数据。

kubectl delete pod efs-app
kubectl delete pvc efs-claim
kubectl delete pv efs-pv

相关文章:

使用Cephfs的Kubernetes的Ceph永久存储

使用Ceph RBD的Kubernetes持久存储

使用Heketi和GlusterFS配置Kubernetes动态卷配置

这是续集。
您可以通过以下链接以PDF格式下载本文来支持我们。

以PDF格式下载指南


这是续集。

这是续集。
这是续集。

[*]
/ *自定义CSS * /
.tdi_4_daf.td-a-rec {
文本对齐:居中;
} .tdi_4_daf .td-element-style {
z索引:-1;
} .tdi_4_daf.td-a-rec-img {
文字对齐:左;
} .tdi_4_daf.td-a-rec-img img {
保证金:0自动0 0;
} @media(最大宽度:767像素){
.tdi_4_daf.td-a-rec-img {
文本对齐:居中;
}
}

Sidebar