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