使用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。
哪里不懂可以在评论中评论~
文档持续更新中~

相关推荐
不是株7 分钟前
Redis(入门篇)
数据库·redis·缓存
const_qiu2 小时前
微服务测试项目架构设计与实践
微服务·云原生·架构
知识分享小能手3 小时前
Redis入门学习教程,从入门到精通, Redis Stack 完整语法知识点及使用指南(7)
数据库·redis·学习
不是书本的小明3 小时前
K8s探针实战:存活、就绪与启动三重保障
云原生·k8s
一个有温度的技术博主3 小时前
Redis系列八:Jedis连接池在java中的使用
java·redis·bootstrap
恋红尘3 小时前
K8S 配置与调度-叩丁狼
云原生·容器·kubernetes
掘根4 小时前
【微服务即时通讯】用户管理子服务1
微服务·云原生·架构
恋红尘4 小时前
K8S Pod 基础解析-分篇-叩丁狼
云原生·容器·kubernetes·pod
阿里云云原生4 小时前
极速导入,便捷无忧!LoongCollector 一次性文件采集能力上线
云原生
anzhxu4 小时前
Ubuntu上安装、使用Redis的详细教程
redis·ubuntu·bootstrap