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

相关推荐
米高梅狮子4 小时前
03.网络类服务实践
linux·运维·服务器·网络·kubernetes·centos·openstack
ElevenS_it1884 小时前
Zabbix+Prometheus+云监控告警统一接入实战:用Webhook+事件总线搭建多源告警归一化平台
kubernetes·zabbix·prometheus
秋95 小时前
windows中安装redis
数据库·redis·缓存
oddsand18 小时前
Redis网络模型
java·数据库·redis
皮卡祺q8 小时前
【redies0-导论】分布式系统的演进-引进redis原因
java·数据库·redis
UrSpecial8 小时前
Redis与多线程
数据库·redis·缓存
STDD8 小时前
cert-manager:Kubernetes 自动 TLS 证书管理
云原生·容器·kubernetes
会编程的土豆9 小时前
Redis Sorted Set(有序集合)详解
数据库·redis·bootstrap
阿里云云原生9 小时前
【5.29北京】智驭运维,Agentic Ops可观测工作坊限时报名!
云原生·agent
万邦科技Lafite10 小时前
实战演练:利用京东API一键抓取商品详情
数据库·redis·python·缓存·开放api·淘宝开放平台