k8s使用local pv配置本地盘作为数据存储

当前项目中遇到一个问题,就是sts资源类型在使用本地hostpath存储时,在某些极端情况下会导致sts资源调度到其它节点,导致本地hostpath存储的资源不存在sts资源新调度的节点,这样就会出现没有数据,数据丢失的情况。

那么这种场景下我们需要将sts的资源和pv进行绑定,然后找到了local pv这种方案,使用local pv以后生产的pvc会绑定sts资源,这样在任何情况下sts资源都会和pv绑定到同一个节点,同时再配合nodeAffinity将pv固定到指定的节点,这样就实现了sts资源固定到某一节点的需求。

接下来就是我测试的方案,实际场景是一个3副本的sts类型的mongodb组件

首先我们创建三个pv,其中需要注意storageClassName以及path目录,还有在这些pv中我们也定义了一个local字段,并在其中添加了节点亲和性nodeAffinity来指定绑定到固定的节点上。

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: orion-mongo-pv-01
spec:
  capacity:
    storage: 200Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: orion-local-storage
  local:
    path: /root/mongodb # 本地存储位置
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - k8s-master #mongodb存储节点名,和其它两个节点名不要重复
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: orion-mongo-pv-03
spec:
  capacity:
    storage: 200Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: orion-local-storage
  local:
    path: /root/mongodb # 本地存储位置
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - k8s-node2 #mongodb存储节点名,和其它两个节点名不要重复
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: orion-mongo-pv-02
spec:
  capacity:
    storage: 200Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: orion-local-storage
  local:
    path: /root/mongodb # 本地存储位置
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - k8s-node1 #mongodb存储节点名,和其它两个节点名不要重复

根据上面撰写的三个pv,分别去k8s-master,k8s-node,k8s-node2三个节点创建存储目录和赋权

ssh k8s-master
mkdir -p /root/mongodb
chmod -R 777

ssh k8s-node1
mkdir -p /root/mongodb
chmod -R 777

ssh k8s-node2
mkdir -p /root/mongodb
chmod -R 777

接下来需要在我们sts资源组件中配置volumeClaimTemplates来自动创建pvc绑定上述创建的pv,局部需要添加如下配置

  volumeClaimTemplates:
   - metadata:
       name: orion-mongodb-data
     spec:
       accessModes:
         - ReadWriteOnce
       resources:
         requests:
           storage: 200Gi
       storageClassName: orion-local-storage     #更改成为pv中的SC名称

然后apply我们的sts资源组件,查看pvc状态

image.png

image.png

通过describe这个pvc可以看到已经绑定到mongodb-0这个pod上了,这样就是实现了sts的POD不会调度到其它节点,它始终会调度到和pv绑定的节点。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/902.html