本文分享自华为云社区《使用Local Persistent Volume 部署有状态工作负载》,作者: 张俭。
使用 Local Persistent Volume 部署有状态工作负载
本教程以部署 Demo StatefulSet 为例,指导您利用 LocalPersistentVolume (即本地持久卷)技术使用标准 PVC 对象访问本地磁盘。
安装 kubernetes 集群
略,可参考官方文档
创建 WaitForFirstConsumer 绑定模式的 StorageClass
此模式指示 Kubernetes 延迟 PVC 的绑定,直到有 Pod 使用为止。
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
复制代码
在对应的主机上准备卷
kubernetes003 主机
mkdir -p /data/volumes/pv0
chmod 777 /data/volumes/pv0
复制代码
kubernetes002 主机
mkdir -p /data/volumes/pv1
chmod 777 /data/volumes/pv1
复制代码
创建两个 LocalPersistentVolume
注意,pv 和 host 节点进行亲和处理,这是为了让 k8s 把对应的 pod 调度到对应的卷
apiVersion: v1
kind: PersistentVolume
metadata:
name: test-local-pv-0
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
path: /data/volumes/pv0
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- kubernetes003
复制代码
apiVersion: v1
kind: PersistentVolume
metadata:
name: test-local-pv-1
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
path: /data/volumes/pv1
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- kubernetes002
复制代码
创建两个 pvc
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-pvc-busybox-0
spec:
accessModes:
- ReadWriteOnce
storageClassName: local-storage
volumeName: test-local-pv-0
resources:
requests:
storage: 10Gi
复制代码
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-pvc-busybox-1
spec:
accessModes:
- ReadWriteOnce
storageClassName: local-storage
volumeName: test-local-pv-1
resources:
requests:
storage: 10Gi
复制代码
创建 ZooKeeper StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: busybox
labels:
app: busybox
spec:
replicas: 2
selector:
matchLabels:
app: busybox
serviceName: "busybox"
template:
metadata:
labels:
app: busybox
spec:
containers:
- name: busybox
image: busybox
command: ['sh', '-c', 'echo "The local volume is mounted!" > /mnt/test.txt && sleep 3600']
imagePullPolicy: Always
volumeMounts:
- name: test-pvc
mountPath: /mnt
volumeClaimTemplates:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc
spec:
storageClassName: local-storage
复制代码
总结
本地持久卷相对于远程持久存储的主要优势在于性能:与远程存储系统相比,本地磁盘通常提供更高的 IOPS 和吞吐量以及更低的延迟。 Kubernetes 本地卷具有以下特性:
PersistentVolumeClaim 将在绑定本地持久卷之前等待 POD 出现
一旦本地持久卷绑定到声明,即使请求的 POD 已死亡或已被删除,它也会保持绑定状态
新的 POD 可以通过引用相同的 PersistentVolumeClaim 附加到本地卷中的现有数据
与 NFS 共享类似,Kubernetes 持久化本地卷允许多个 POD 具有读/写访问权限
良好工作负载的示例包括软件定义的存储系统和复制数据库。 其他类型的应用程序应继续使用高可用性、可远程访问的持久存储。
参考
https://lapee79.github.io/en/article/use-a-local-disk-by-local-volume-static-provisioner-in-kubernetes/
点击关注,第一时间了解华为云新鲜技术~
评论