业务需求
在管理开源组件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。
哪里不懂可以在评论中评论~
文档持续更新中~