本地存储介绍

在8.1.1章节中的PV YAML示例,就是本地存储。本地存储类型的PV是Kubernetes中一种比较特殊的持久化存储,它允许将节点上的本地磁盘或目录用作PV。与其他PV类型(例如NFS、Ceph或云存储)不同,本地存储类型的PV直接使用节点上的存储资源,因此具有更低的延迟和更高的性能。

使用本地存储类型的PV时,需注意以下几个关键点:

1、节点特性:本地存储类型的PV与特定的节点绑定,因为它直接使用节点上的存储资源。这意味着当创建PV时,需要指定与之关联的节点。可以在PV的spec部分设置nodeAffinity来实现的。

  nodeAffinity:  ##定义节点亲和性
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - node-name

2、数据持久性:由于本地存储类型的PV与特定节点关联,当该节点发生故障时,存储在PV中的数据可能无法访问。因此,在使用本地存储类型的PV时,请确保采取适当的数据备份策略,以防止节点故障导致的数据丢失。

3、调度限制:Pod使用本地存储类型的Persistent Volume Claim(PVC)时,Kubernetes会尝试将Pod调度到关联PV的节点上。如果节点上的资源不足以运行Pod,Pod将无法启动。因此,在使用本地存储类型的PV时,请确保关联的节点有足够的资源来运行Pod。

4、回收策略:当PVC被删除时,PV的回收策略将决定如何处理关联的本地存储。对于本地存储类型的PV,建议使用Retain或Delete回收策略。Retain策略表示保留存储和数据,以便手动清理和管理;Delete策略表示删除存储和数据。需要注意的是,Recycle策略并不适用于本地存储类型的PV。

  persistentVolumeReclaimPolicy: Retain

本地存储示例

1、在k8s-master02节点上创建一个本地目录/mnt/local-storage

$ mkdir -p /mnt/local-storage

2、创建一个PV资源配置文件,例如local-pv.yaml

$ vi local-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv
  labels:
    type: local
spec:
  storageClassName: local-storage
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  local:
    path: /mnt/local-storage
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname  #这是内置的节点标签,表示节点的主机名
          operator: In
          values:
          - k8s-master02  #只有k8s-master02这个主机节点才满足要求

3、应用PV资源配置文件

$ k apply -f local-pv.yaml

4、再创建一个PVC资源配置文件,例如local-pvc.yaml

$ vi local-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-pvc
spec:
  storageClassName: local-storage
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

5、应用PVC资源配置文件,Kubernetes会自动将PVC与PV绑定。创建好的PVC可以在Pod中使用,将本地存储挂载到容器中。

$ k apply -f local-pvc.yaml

6、创建一个Pod资源配置文件,例如local-pod.yaml

$ vi local-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: local-pod
spec:
  containers:
  - name: local-container
    image: nginx:1.21.6
    volumeMounts:
    - name: local-storage
      mountPath: /data
  volumes:
  - name: local-storage
    persistentVolumeClaim:
      claimName: local-pvc

7、应用Pod资源配置文件

$ k apply -f local-pod.yaml

查看pod部署节点,观察到部署在k8s-master02节点上

$ k get po local-pod -owide

NAME        READY   STATUS    RESTARTS   AGE   IP             NODE           NOMINATED NODE   READINESS GATES
local-pod   1/1     Running   0          20s   172.25.92.80   k8s-master02   <none>           <none>

8、测试

在k8s-master02节点上的/mnt/local-storage目录下创建文件111.txt

$ cd /mnt/local-storage/
$ touch 111.txt
$ echo "xasdasdads" > 111.txt

在k8s-master01节点上查看111.txt文件内容

$ k exec -it local-pod
$ cat  data/111.txt
xasdasdads

9、恢复

$ k delete -f local-pod.yaml,local-pvc.yaml,local-pv.yaml