Kubernetes 节点本地持久卷-StorageClass-local
local
#节点本地持久卷
local持久卷
local卷插件用于将本地存储设备(如磁盘、分区或目录)配置为卷
基于网络存储的PV通常性能损耗较大
直接使用节点本地的SSD磁盘可获取较好的IO性能,更适用于存储类的服务,例如MongoDB、Ceph等
hostpath卷在Pod被重建后可能被调试至其他节点而无法再次使用此前的数据,而基于local卷,调度器能自行完成调度绑定
hostpath卷允许Pod访问节点上的任意路径,也存在一定程度的安全风险
基于local的PV,需要管理员通过nodeAffinity声明定义在节点
用户可通过PVC关联至local类型的PV
在Pod上配置使用该PVC即可
调度器将基于nodeAffinity将执行Pod调度
local卷只能关联静态置备的PV,目前尚不支持动态置备
PVC延迟绑定
配置PVC绑定local PV时,通常要创建一个StorageClass
provisioner字段的值为:no-provisioner表示不适用动态置备PV 因为local插件不支持
volumeBindingMode字段的值:WaitForFirstConsumer 表示等待消费者申请使用PVC时-即第一次被调度时再进行PV绑定,即“延迟绑定”
延迟绑定机制,提供了基于消费者的需求来判定将PVC绑定至哪个PV的可用性
延迟绑定机制下,PVC创建后将处于 Pending状态 直到被Pod消费
1、storageclass
[root@k8s-master01 local-pv]# cat storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
[root@k8s-master01 local-pv]# kubectl apply -f storageclass.yaml
storageclass.storage.k8s.io/local created
[root@k8s-master01 local-pv]# kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
local kubernetes.io/no-provisioner Delete WaitForFirstConsumer false 7s
2、pv
#选择node1 创建 /disks/vol1
[root@k8s-node01 ~]# mkdir -pv /disks/vol1
mkdir: created directory ‘/disks’
mkdir: created directory ‘/disks/vol1’
#调度到node1上 kubernetes.io/hostname=192.168.40.111
[root@k8s-master01 local-pv]# kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
192.168.40.101 Ready,SchedulingDisabled master 49d v1.24.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=192.168.40.101,kubernetes.io/os=linux,kubernetes.io/role=master
192.168.40.102 Ready,SchedulingDisabled master 49d v1.24.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=192.168.40.102,kubernetes.io/os=linux,kubernetes.io/role=master
192.168.40.111 Ready node 49d v1.24.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=192.168.40.111,kubernetes.io/os=linux,kubernetes.io/role=node
192.168.40.112 Ready node 49d v1.24.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=192.168.40.112,kubernetes.io/os=linux,kubernetes.io/role=node
[root@k8s-master01 local-pv]# cat local-pv-demo.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-pv-demo
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local
local:
path: /disks/vol1
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- 192.168.40.111
[root@k8s-master01 local-pv]# kubectl apply -f local-pv-demo.yaml
persistentvolume/local-pv-demo created
[root@k8s-master01 local-pv]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
local-pv-demo 5Gi RWO Delete Available local 4s
3、创建PVC
#延迟绑定 会一直pending等待 pod调度
[root@k8s-master01 local-pv]# cat pvc-localpv-demo.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc-localpv-demo
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: local
[root@k8s-master01 local-pv]# kubectl apply -f pvc-localpv-demo.yaml
persistentvolumeclaim/pvc-localpv-demo created
[root@k8s-master01 local-pv]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-localpv-demo Pending local 6s
4、创建Pod
[root@k8s-master01 local-pv]# cat pod-with-localpv.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-with-localpv
spec:
containers:
- name: redis
image: redis:7-alpine
ports:
- containerPort: 6379
name: redis
volumeMounts:
- mountPath: "/data"
name: data
volumes:
- name: data
persistentVolumeClaim:
claimName: pvc-localpv-demo
[root@k8s-master01 local-pv]# kubectl apply -f pod-with-localpv.yaml
pod/pod-with-localpv created
[root@k8s-master01 local-pv]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-with-localpv 1/1 Running 0 3m40s 10.200.85.217 192.168.40.111 <none> <none>
#此时pvc绑定到pv上 因为时延迟绑定
[root@k8s-master01 local-pv]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-localpv-demo Bound local-pv-demo 5Gi RWO local 9m56s
#pv情况
[root@k8s-master01 local-pv]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
local-pv-demo 5Gi RWO Delete Bound default/pvc-localpv-demo local 5m5s