如何在Kubernetes里使用本地存储

536 字
3 分钟
如何在Kubernetes里使用本地存储

1 准备工作#

1.1 创建虚拟化磁盘#

别批量复制执行,这里要一步一步操作

Terminal window
dd if=/dev/zero of=local_data.img bs=1M count=4096
du -h local_data.img
mkfs.ext4 local_data.img
mkdir /data/local_data
mount -o loop -t ext4 local_data.img /data/local_data/
df -h

2 静态供应器#

2.1 查看刚才创建的虚拟磁盘#

Terminal window
lsblk |grep local_data
loop4 7:4 0 4G 0 loop /data/local_data

2.2 配置静态供应器的发现目录#

Terminal window
mkdir /mnt/disks
ln -s /dev/loop4 /mnt/disks

2.3 部署静态供应器#

cat csi.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: local-provisioner-config
namespace: local-csi
data:
storageClassMap: |
# storageclass的名称
fast-disks:
# 配置发现目录
hostDir: /mnt/disks
mountDir: /mnt/disks
blockCleanerCommand:
- "/scripts/shred.sh"
- "2"
volumeMode: Block # 创建的pv将是这个类型的卷
fsType: ext4
namePattern: "*"
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: local-volume-provisioner
namespace: local-csi
labels:
app: local-volume-provisioner
spec:
selector:
matchLabels:
app: local-volume-provisioner
template:
metadata:
labels:
app: local-volume-provisioner
spec:
serviceAccountName: local-storage-admin
containers:
- image: "dyrnq/local-volume-provisioner:v2.4.0"
imagePullPolicy: "IfNotPresent"
name: provisioner
securityContext:
privileged: true
env:
- name: MY_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
volumeMounts:
- mountPath: /etc/provisioner/config
name: provisioner-config
readOnly: true
- mountPath: /mnt/disks # 静态供应器发现目录
name: disks
mountPropagation: "HostToContainer"
volumes:
- name: provisioner-config
configMap:
name: local-provisioner-config
- name: disks
hostPath:
path: /mnt/disks # 静态供应器发现目录
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: local-storage-admin
namespace: local-csi
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: local-storage-provisioner-pv-binding
namespace: local-csi
subjects:
- kind: ServiceAccount
name: local-storage-admin
namespace: local-csi
roleRef:
kind: ClusterRole
name: system:persistent-volume-provisioner
apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: local-storage-provisioner-node-clusterrole
namespace: local-csi
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: local-storage-provisioner-node-binding
namespace: local-csi
subjects:
- kind: ServiceAccount
name: local-storage-admin
namespace: local-csi
roleRef:
kind: ClusterRole
name: local-storage-provisioner-node-clusterrole
apiGroup: rbac.authorization.k8s.io
Terminal window
kubectl apply -f csi.yaml -n local-csi

3 创建 storageclass#

cat sc.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-sc
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: Immediate
kubectl apply -f sc.yaml -n local-csi

4 验证#

4.1 查看#

静态供应器会将发现目录中的设备文件自动创建为 pv

Terminal window
kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS AGE
local-pv-xxx0b1 4Gi RWO Delete Bound local-sc 21h
local-pv-xxx79f 4Gi RWO Delete Bound local-sc 21h

4.2 创建 pvc#

cat pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: local-pvc
spec:
accessModes:
- ReadWriteOnce
volumeMode: Block
storageClassName: local-sc
resources:
requests:
storage: 1Gi
kubectl apply -f pvc.yaml -n local-csi

查看

Terminal window
kubectl get pvc -n local-csi
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
local-pvc Bound local-pv-xxx0b1 4Gi RWO local-sc 19h

4.3 创建 statefuset#

cat statefuset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: local-test
spec:
serviceName: "local-service"
replicas: 1
selector:
matchLabels:
app: local-test
template:
metadata:
labels:
app: local-test
spec:
containers:
- name: test-container
image: nginx
volumeDevices:
- name: local-vol
devicePath: /mnt/loop4
volumeClaimTemplates:
- metadata:
name: local-vol
spec:
accessModes:
- ReadWriteOnce
volumeMode: Block
storageClassName: "local-sc"
resources:
requests:
storage: 4Gi
kubectl apply -f statefuset.yaml -n local-csi

查看

Terminal window
kubectl get pod -n local-csi
NAME READY STATUS RESTARTS AGE
local-test-0 1/1 Running 0 19h

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

如何在Kubernetes里使用本地存储
https://ccops.cc/posts/17a5fb7b/
作者
蹦蹦站长
发布于
2022-03-29
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
蹦蹦站长
一个养兔子的运维
公告
感谢你的来访!希望在这里能找到对你有用的内容!
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
81
分类
6
标签
45
总字数
88,456
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.12.1
文章许可
CC BY-NC-SA 4.0

文章目录