使用localPV为statefulset保持节点数据一致方案

业务需求

在管理开源组件kafka、redis容器化哨兵服务使用物理磁盘做固定主机时,当前策略配置文件是持久化到磁盘上的,在此条件下,当同时宕机大于2个pod时,存在概率会发生pod漂移问题,导致pod绑定的主机ip与实际主机ip不同,影响使用.不同Pod偏移会造成业务数据错乱。

需求分析

为防止Pod漂移导致业务数据错乱,可使用localPV的特性,将Pod业务数据与Pod绑定。

这样Pod就会与localpv数据绑定,不会漂移。宿主机宕机时,业务数据不可访问,与该业务数据绑定的Pod会Pending。

LocalPV介绍

其实Local PV实现的功能非常类似于hostPath加上节点亲和性nodeAffinity,同时Local PV和普通的PV有一个很大的不同在于Local PV可以保证pod始终能够被正确的调度到它所请求的Local PV所在的节点上面。但值得注意的是:

对于普通的PV来说,Kubernetes都是先调度pod到某个节点上,然后再持久化节点上的Volume目录,进而完成Volume目录与容器的绑定挂载。

对于Local

PV来说,节点上可供使用的磁盘必事先准备好,因为它们在不同节点上的挂载情况可能不同,有的节点可能没这种磁盘,所以,这时候,调度器就必须能够知道所有节点与

Local PV 对应的磁盘的关联关系,然后根据这个信息来调度Pod,实际上就是在调度podde 的时候先考虑 Volume的分布情况。

实现方案及实现细节

创建storageclass

bash 复制代码
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

创建3个localpv

bash 复制代码
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv-1
spec:
  capacity:
    storage: 10Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /local1
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - 192.xxx.xxx.248
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv-2
spec:
  capacity:
    storage: 10Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /local1
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - 192.xxx.xxx.248
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv-2
spec:
  capacity:
    storage: 10Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /local1
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - 192.xxx.xxx.243

创建业务statefulset及pvc模版

bash 复制代码
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: example-sts1
  labels:
    app: example
spec:
  serviceName: "example-service"
  replicas: 3
  selector:
    matchLabels:
      app: example
  template:
    metadata:
      labels:
        app: example
    spec:
      containers:
      - name: example-container
        image: nginx:1.17.4
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: local-storage-1
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: local-storage-1
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: "local-storage"
      resources:
        requests:
          storage: 10Gi

测试验证

同时删除3个Pod,观察Pod是否会发生漂移

再删除

多次删除后,发现Pod不会发生漂移。

总结

LocalPV能解决多Pod发生漂移,数据错乱的情况;localPV业务数据和Pod进行了绑定,一旦宿主机宕机,Pod也会Pending。
哪里不懂可以在评论中评论~
文档持续更新中~

相关推荐
Linux运维老纪12 分钟前
分布式存储的技术选型之HDFS、Ceph、MinIO对比
大数据·分布式·ceph·hdfs·云原生·云计算·运维开发
问道飞鱼22 分钟前
【Springboot知识】Springboot结合redis实现分布式锁
spring boot·redis·分布式
xiao-xiang30 分钟前
jenkins-k8s pod方式动态生成slave节点
java·kubernetes·jenkins
小金的学习笔记39 分钟前
RedisTemplate和Redisson的使用和区别
数据库·redis·缓存
取址执行42 分钟前
Redis发布订阅
java·redis·bootstrap
monkey221 小时前
AWS S3的费用优化
云计算·aws
呼啦啦啦啦啦啦啦啦1 小时前
【Redis】事务
数据库·redis·缓存
HaoHao_0101 小时前
AWS Serverless Application Repository
服务器·数据库·云计算·aws·云服务器
monkey221 小时前
将AWS S3设置为类SFTP服务用于数据上传
云计算·aws
赵相机-2 小时前
Spring集成Redis|通用Redis工具类
spring boot·redis·spring