Docker(二十一)--Docker k8s--Kubernetes存储--Volumes配置管理--持久卷--动态静态分配
目录1. 简介2. NFS PV示例(静态分配)2.1.保证环境的干净2.2 创建所需资源2.3 书写pv,pvc,pod文件并进行测试2.3.1 创建pv2.3.2 创建pvc和pod2.3.3 测试2.3.4 补充命令3. 动态分配3.1 简介3.2 示例4. 默认的 StorageClass4.1 没有StorageClass的情况4.2 设置默认的StorageClass1. 简介官网Pe
目录
1. 简介
官网 PersistentVolume(持久卷,简称PV)是集群内,由管理员提供的网络存储的一部分。就像集群中的节点一样,PV也是集群中的一种资源。它也像Volume一样,是一种volume插件,但是它的生命周期却是和使用它的Pod相互独立的。PV这个API对象,捕获了诸如NFS、ISCSI、或其他云存储系统的实现细节。 PersistentVolumeClaim(持久卷声明,简称PVC)是用户的一种存储请求。它和Pod类似,Pod消耗Node资源,而PVC消耗PV资源。Pod能够请求特定的资源(如CPU和内存)。PVC能够请求指定的大小和访问的模式(可以被映射为一次读写或者多次只读)。 有两种PV提供的方式:静态和动态。 静态PV:集群管理员创建多个PV,它们携带着真实存储的详细信息,这些存储对于集群用户是可用的。它们存在于Kubernetes API中,并可用于存储使用。 动态PV:当管理员创建的静态PV都不匹配用户的PVC时,集群可能会尝试专门地供给volume给PVC。这种供给基于StorageClass。 PVC与PV的绑定是一对一的映射。没找到匹配的PV,那么PVC会无限期得处于unbound未绑定状态。 使用 Pod使用PVC就像使用volume一样。集群检查PVC,查找绑定的PV,并映射PV给Pod。对于支持多种访问模式的PV,用户可以指定想用的模式。一旦用户拥有了一个PVC,并且PVC被绑定,那么只要用户还需要,PV就一直属于这个用户。用户调度Pod,通过在Pod的volume块中包含PVC来访问PV。 释放 当用户使用PV完毕后,他们可以通过API来删除PVC对象。当PVC被删除后,对应的PV就被认为是已经是“released”了,但还不能再给另外一个PVC使用。前一个PVC的属于还存在于该PV中,必须根据策略来处理掉。 回收 PV的回收策略告诉集群,在PV被释放之后集群应该如何处理该PV。当前,PV可以被Retained(保留)、 Recycled(再利用)或者Deleted(删除)。保留允许手动地再次声明资源。对于支持删除操作的PV卷,删除操作会从Kubernetes中移除PV对象,还有对应的外部存储(如AWS EBS,GCE PD,Azure Disk,或者Cinder volume)。动态供给的卷总是会被删除。 访问模式 ReadWriteOnce – 该volume只能被单个节点以读写的方式映射 ReadOnlyMany – 该volume可以被多个节点以只读方式映射 ReadWriteMany – 该volume可以被多个节点以读写的方式映射 在命令行中,访问模式可以简写为: RWO - ReadWriteOnce ROX - ReadOnlyMany RWX - ReadWriteMany 回收策略 Retain:保留,需要手动回收 Recycle:回收,自动删除卷中数据 Delete:删除,相关联的存储资产,如AWS EBS,GCE PD,Azure Disk,or OpenStack Cinder卷都会被删除 当前,只有NFS和HostPath支持回收利用,AWS EBS,GCE PD,Azure Disk,or OpenStack Cinder卷支持删除操作。 状态: Available:空闲的资源,未绑定给PVC Bound:绑定给了某个PVC Released:PVC已经删除了,但是PV还没有被集群回收 Failed:PV在自动回收中失败了 命令行可以显示PV绑定的PVC名称。
2. NFS PV示例(静态分配)
2.1.保证环境的干净
[root@server2 volumes]# kubectl get pod NAME READY STATUS RESTARTS AGE nfs-pd 1/1 Running 0 12m [root@server2 volumes]# kubectl delete -f nfs.yaml ##先清理环境 [root@server2 volumes]# kubectl get pv No resources found [root@server2 volumes]# kubectl get pvc No resources found in default namespace. [root@server2 volumes]# kubectl get pod No resources found in default namespace.
2.2 创建所需资源
## 1. 安装配置NFS服务:(前面已经做过了) # yum install -y nfs-utils # mkdir -m 777 /nfsdata # vim /etc/exports # /nfsdata *(rw,sync,no_root_squash) # systemctl enable --now rpcbind # systemctl enbale --now nfs ## 2. server1和每个节点的环境 [root@server1 nfsdata]# mkdir pv1 pv2 pv3 ##创建相应的目录 [root@server1 nfsdata]# ll total 0 drwxr-xr-x 2 root root 6 Feb 25 11:21 pv1 drwxr-xr-x 2 root root 6 Feb 25 11:21 pv2 drwxr-xr-x 2 root root 6 Feb 25 11:21 pv3 [root@server1 pv1]# echo www.westos.org > index.html ##分别书写测试文件 [root@server1 pv2]# echo www.redhat.org > index.html [root@server1 pv3]# echo www.baidu.com > index.html [root@server3 ~]# yum install nfs-utils -y ##都需要安装nfs服务 [root@server4 ~]# yum install nfs-utils -y
2.3 书写pv,pvc,pod文件并进行测试
2.3.1 创建pv
[root@server2 volumes]# vim pv1.yaml [root@server2 volumes]# cat pv1.yaml ##pv文件 apiVersion: v1 kind: PersistentVolume ##pv模型 metadata: name: pv1 spec: capacity: storage: 5Gi ##大小限制,并不一定会都用完 volumeMode: Filesystem ##卷模式是文件系统 accessModes: - ReadWriteOnce ## 单点读写 persistentVolumeReclaimPolicy: Recycle ##回收 storageClassName: nfs nfs: path: /nfsdata/pv1 server: 172.25.13.1 --- apiVersion: v1 kind: PersistentVolume metadata: name: pv2 spec: capacity: storage: 10Gi volumeMode: Filesystem accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Recycle storageClassName: nfs nfs: path: /nfsdata/pv2 server: 172.25.13.1 --- apiVersion: v1 kind: PersistentVolume metadata: name: pv3 spec: capacity: storage: 20Gi volumeMode: Filesystem accessModes: - ReadOnlyMany persistentVolumeReclaimPolicy: Recycle storageClassName: nfs nfs: path: /nfsdata/pv3 server: 172.25.13.1 [root@server2 volumes]# kubectl apply -f pv1.yaml ##应用 persistentvolume/pv1 created persistentvolume/pv2 created persistentvolume/pv3 created [root@server2 volumes]# kubectl get pv ##查看pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv1 5Gi RWO Recycle Available nfs 6s pv2 10Gi RWX Recycle Available nfs 6s pv3 20Gi ROX Recycle Available nfs 6s
2.3.2 创建pvc和pod
[root@server2 volumes]# vim pvc.yaml [root@server2 volumes]# cat pvc.yaml ##创建pvc和pod apiVersion: v1 kind: PersistentVolumeClaim ##pvc模式 metadata: name: pvc1 spec:(下面的内容可以理解为匹配规则,如果匹配不到pvc就会一直等待合适的pv出现,处于pending状态) storageClassName: nfs ##类名nfs accessModes: - ReadWriteOnce ##匹配单点读写 resources: requests: storage: 5Gi ##匹配的pv大小必须在5G以内 --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc2 spec: storageClassName: nfs accessModes: - ReadWriteMany resources: requests: storage: 10Gi --- apiVersion: v1 kind: Pod metadata: name: test-pd spec: containers: - image: myapp:v1 name: nginx volumeMounts: - mountPath: /usr/share/nginx/html name: nfs-pv volumes: - name: nfs-pv persistentVolumeClaim: claimName: pvc1 --- apiVersion: v1 kind: Pod metadata: name: test-pd-2 spec: containers: - image: myapp:v1 name: nginx volumeMounts: - mountPath: /usr/share/nginx/html name: nfs-pv-2 volumes: - name: nfs-pv-2 persistentVolumeClaim: ##指定pvc claimName: pvc2 [root@server2 volumes]# kubectl apply -f pvc.yaml [root@server2 volumes]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc1 Bound pv1 5Gi RWO nfs 9s pvc2 Bound pv2 10Gi RWX nfs 9s [root@server2 volumes]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv1 5Gi RWO Recycle Bound default/pvc1 nfs 2m59s pv2 10Gi RWX Recycle Bound default/pvc2 nfs 2m59s pv3 20Gi ROX Recycle Available nfs 2m59s [root@server2 volumes]# kubectl get pod
2.3.3 测试
[root@server2 volumes]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES test-pd 1/1 Running 0 112s 10.244.141.208 server3 <none> <none> test-pd-2 1/1 Running 0 112s 10.244.22.8 server4 <none> <none> [root@server2 volumes]# curl 10.244.141.208 ##访问ip,观察是否是自己书写的对应文件 www.westos.org [root@server2 volumes]# curl 10.244.22.8 www.redhat.org
2.3.4 补充命令
##删除 [root@server2 volumes]# kubectl delete pod 加pod名 [root@server2 volumes]# kubectl delete pv 加pv名 [root@server2 volumes]# kubectl delete pvc 加pvc名
3. 动态分配
3.1 简介
StorageClass提供了一种描述存储类(class)的方法,不同的class可能会映射到不同的服务质量等级和备份策略或其他策略等。
每个 StorageClass 都包含 provisioner、parameters 和 reclaimPolicy 字段, 这些字段会在StorageClass需要动态分配 PersistentVolume 时会使用到。
StorageClass的属性
Provisioner(存储分配器):用来决定使用哪个卷插件分配 PV,该字段必须指定。可以指定内部分配器,也可以指定外部分配器。外部分配器的代码地址为: kubernetes-incubator/external-storage,其中包括NFS和Ceph等。
Reclaim Policy(回收策略):通过reclaimPolicy字段指定创建的Persistent Volume的回收策略,回收策略包括:Delete 或者 Retain,没有指定默认为Delete。
更多属性查看:https://kubernetes.io/zh/docs/concepts/storage/storage-classes/NFS Client Provisioner是一个automatic provisioner,使用NFS作为存储,自动创建PV和对应的PVC,本身不提供NFS存储,需要外部先有一套NFS存储服务。
PV以 ${namespace}-${pvcName}-${pvName}的命名格式提供(在NFS服务器上)
PV回收的时候以 archieved-${namespace}-${pvcName}-${pvName} 的命名格式(在NFS服务器上)
nfs-client-provisioner源码地址:https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-clientnfs-client-provisioner源码地址
nfs-client-provisioner源码地址(新的)
下面实验用的新版的3.2 示例
## 1.清理环境 [root@server2 volumes]# kubectl delete -f pvc.yaml ##清理环境 [root@server2 volumes]# kubectl delete -f pv1.yaml [root@server1 ~]# cd /nfsdata/ ##删除nfs端的数据 [root@server1 nfsdata]# ls pv1 pv2 pv3 [root@server1 nfsdata]# rm -fr * ## 2.下载镜像,并上传 [root@server1 nfsdata]# docker search k8s-staging-sig-storage NAME DESCRIPTION STARS OFFICIAL AUTOMATED yuufnn/nfs-external-provisioner gcr.io/k8s-staging-sig-storage/nfs-subdir-ex… 0 heegor/nfs-subdir-external-provisioner Image backup for gcr.io/k8s-staging-sig-stor… 0 zelaxyz/nfs-subdir-external-provisioner #Dockerfile FROM gcr.io/k8s-staging-sig-stor… 0 yuufnn/nfs-subdir-external-provisioner gcr.io/k8s-staging-sig-storage/nfs-subdir-ex… 0 [root@server1 nfsdata]# docker pull heegor/nfs-subdir-external-provisioner:v4.0.0 [root@server1 nfsdata]# docker tag heegor/nfs-subdir-external-provisioner:v4.0.0 reg.westos.org/library/nfs-subdir-external-provisioner:v4.0.0 [root@server1 nfsdata]# docker push reg.westos.org/library/nfs-subdir-external-provisioner:v4.0.0 ## 3.配置 [root@server2 volumes]# mkdir nfs-client [root@server2 volumes]# cd nfs-client/ [root@server2 nfs-client]# pwd /root/volumes/nfs-client [root@server2 nfs-client]# vim nfs-client-provisioner.yaml [root@server2 nfs-client]# cat nfs-client-provisioner.yaml ##动态分配源码 apiVersion: v1 kind: ServiceAccount metadata: name: nfs-client-provisioner # replace with namespace where provisioner is deployed namespace: nfs-client-provisioner ##新建一个namespace --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: nfs-client-provisioner-runner rules: - apiGroups: [""] resources: ["persistentvolumes"] verbs: ["get", "list", "watch", "create", "delete"] - apiGroups: [""] resources: ["persistentvolumeclaims"] verbs: ["get", "list", "watch", "update"] - apiGroups: ["storage.k8s.io"] resources: ["storageclasses"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["events"] verbs: ["create", "update", "patch"] --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: run-nfs-client-provisioner subjects: - kind: ServiceAccount name: nfs-client-provisioner # replace with namespace where provisioner is deployed namespace: nfs-client-provisioner roleRef: kind: ClusterRole name: nfs-client-provisioner-runner apiGroup: rbac.authorization.k8s.io --- kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: leader-locking-nfs-client-provisioner # replace with namespace where provisioner is deployed namespace: nfs-client-provisioner rules: - apiGroups: [""] resources: ["endpoints"] verbs: ["get", "list", "watch", "create", "update", "patch"] --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: leader-locking-nfs-client-provisioner # replace with namespace where provisioner is deployed namespace: nfs-client-provisioner subjects: - kind: ServiceAccount name: nfs-client-provisioner # replace with namespace where provisioner is deployed namespace: nfs-client-provisioner roleRef: kind: Role name: leader-locking-nfs-client-provisioner apiGroup: rbac.authorization.k8s.io --- apiVersion: apps/v1 kind: Deployment metadata: name: nfs-client-provisioner labels: app: nfs-client-provisioner # replace with namespace where provisioner is deployed namespace: nfs-client-provisioner spec: replicas: 1 strategy: type: Recreate selector: matchLabels: app: nfs-client-provisioner template: metadata: labels: app: nfs-client-provisioner spec: serviceAccountName: nfs-client-provisioner containers: - name: nfs-client-provisioner image: nfs-subdir-external-provisioner:v4.0.0 volumeMounts: - name: nfs-client-root mountPath: /persistentvolumes env: - name: PROVISIONER_NAME value: k8s-sigs.io/nfs-subdir-external-provisioner - name: NFS_SERVER value: 172.25.13.1 - name: NFS_PATH value: /nfsdata volumes: - name: nfs-client-root nfs: server: 172.25.13.1 path: /nfsdata --- apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: managed-nfs-storage provisioner: k8s-sigs.io/nfs-subdir-external-provisioner parameters: archiveOnDelete: "true" ##是否在回收之后自动备份,生成备份文件夹 [root@server2 nfs-client]# vim pvc.yaml ##测试文件,pvc和pod [root@server2 nfs-client]# cat pvc.yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: test-claim spec: storageClassName: managed-nfs-storage accessModes: - ReadWriteMany resources: requests: storage: 2Gi --- kind: Pod apiVersion: v1 metadata: name: test-pod spec: containers: - name: test-pod image: myapp:v1 volumeMounts: - name: nfs-pvc mountPath: "/usr/share/nginx/html" volumes: - name: nfs-pvc persistentVolumeClaim: claimName: test-claim [root@server2 nfs-client]# kubectl create namespace nfs-client-provisioner ##创建相应的namespace,方便管理 [root@server2 nfs-client]# kubectl apply -f nfs-client-provisioner.yaml ##应用动态分配u [root@server2 nfs-client]# kubectl get pod -n nfs-client-provisioner ##查看生成的分配器pod [root@server2 nfs-client]# kubectl get sc ##StorageClass [root@server2 nfs-client]# kubectl apply -f pvc.yaml ##应用测试文件 [root@server2 nfs-client]# kubectl get pv ## [root@server2 nfs-client]# kubectl get pvc ## ## 4. 测试 [root@server1 nfsdata]# ls ##按照命名规则生成数据卷 default-test-claim-pvc-bc952d4e-47a5-4ac4-9d95-5cd2e6132ebf [root@server1 nfsdata]# cd default-test-claim-pvc-bc952d4e-47a5-4ac4-9d95-5cd2e6132ebf/ [root@server1 default-test-claim-pvc-bc952d4e-47a5-4ac4-9d95-5cd2e6132ebf]# echo www.westos.org > index.html [root@server1 default-test-claim-pvc-bc952d4e-47a5-4ac4-9d95-5cd2e6132ebf]# [root@server2 nfs-client]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES test-pod 1/1 Running 0 5m5s 10.244.22.10 server4 <none> <none> [root@server2 nfs-client]# curl 10.244.22.10 www.westos.org
4. 默认的 StorageClass
默认的 StorageClass 将被用于动态的为没有特定 storage class 需求的 PersistentVolumeClaims 配置存储:(只能有一个默认StorageClass)
如果没有默认StorageClass,PVC 也没有指定storageClassName 的值,那么意味着它只能够跟 storageClassName 也是“”的 PV 进行绑定。4.1 没有StorageClass的情况
[root@server2 nfs-client]# vim demo.yaml [root@server2 nfs-client]# cat demo.yaml ##测试没有StorageClass kind: PersistentVolumeClaim apiVersion: v1 metadata: name: test-claim-2 spec: # storageClassName: managed-nfs-storage accessModes: - ReadOnlyMany resources: requests: storage: 5Gi [root@server2 nfs-client]# kubectl apply -f demo.yaml [root@server2 nfs-client]# kubectl get pvc ##没有指定一直处于pending状态
4.2 设置默认的StorageClass
kubectl patch storageclass <your-class-name> -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' ##模板 [root@server2 nfs-client]# kubectl patch storageclass managed-nfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' ##指定sc [root@server2 nfs-client]# kubectl get sc ##查看是否设置成功 NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE managed-nfs-storage (default) k8s-sigs.io/nfs-subdir-external-provisioner Delete Immediate false 58m ##查看效果 [root@server2 nfs-client]# kubectl delete -f demo.yaml [root@server2 nfs-client]# kubectl apply -f demo.yaml [root@server2 nfs-client]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE test-claim Bound pvc-bc952d4e-47a5-4ac4-9d95-5cd2e6132ebf 2Gi RWX managed-nfs-storage 55m test-claim-2 Bound pvc-2262d8b4-c660-4301-aad5-2ec59516f14e 5Gi ROX managed-nfs-storage 2s
更多推荐
所有评论(0)