当前项目中遇到一个问题,就是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状态
通过describe这个pvc可以看到已经绑定到mongodb-0这个pod上了,这样就是实现了sts的POD不会调度到其它节点,它始终会调度到和pv绑定的节点。