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

相关推荐
云川之下16 分钟前
【k8s】Docker inspect 命令
docker·容器·kubernetes
DLYSB_29 分钟前
Kafka 消费倾斜死锁与 Partition 掉队:我用 Rust 写了个“数据管道物理哨兵”,比 Grafana 报警快了 18 秒
rust·kafka·grafana·报警灯
云烟成雨TD42 分钟前
Micrometer 系列【63】统一观测:基于 Spring Boot 的生产级演示案例 | 基于 OTLP 集成 Prometheus + Jaeger
spring boot·云原生·prometheus
breeze jiang1 小时前
Next.js App Router 父子组件 RSC 拆分实战:从 Redis Hash 到客户端交互的最小化边界
javascript·redis·哈希算法
猫吃了源码1 小时前
CentOS7使用Kubeadm安装部署K8s(Kubernetes)最新稳定版本1.26.x
云原生·容器·kubernetes
creator_Li1 小时前
Kafka消费者offset提交
kafka
张忠琳2 小时前
【k3s】AutoK3s v0.9.3 —— Part 7 辅助模块超深度逐行分析
云原生·容器·kubernetes·k3s·autok3s
TDengine (老段)2 小时前
TDengine 第三方工具 — Telegraf、Kafka Connect、Flink、Spark
大数据·数据库·物联网·flink·kafka·时序数据库·tdengine
晚染烟11 小时前
每日八股day17
redis
张忠琳12 小时前
【k3s】AutoK3s v0.9.3 Part 1 入口与 CLI 命令模块 — 超深度逐行分析之三
云原生·容器·kubernetes·k3s·autok3s