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

 

posted @ 2024-01-03 15:15  しみずよしだ  阅读(593)  评论(0)    收藏  举报