k8s之挂载本地磁盘到POD中
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
写在前面
本文一起看下如何挂载本地的磁盘到POD中。
1都需要哪些API对象
现实世界中的存储设备有非常非常多的种类如本文要分析的计算机磁盘还包括NFS(一种网络磁盘存储协议)
Ceph一种分布式的文件存储系统
不管是哪种方式最终都是通过将数据存储到硬盘来实现持久化但是不同种类写入数据的方式是不相同的k8s针对这些不同的存储目标进行抽象定义了PersistentValume API对象如下
dongyunqi@mongodaddy:~/k8s$ kubectl api-resources|egrep -w 'PersistentVolume|KIND'
NAME SHORTNAMES APIVERSION NAMESPACED KIND
persistentvolumes pv v1 false PersistentVolume
现在不同存储系统的抽象已经有了那么具体该怎么使用办呢能不能让pv拥有这种能力呢自然是可以的但是这又不符合单一职责
的原则了所以对于这些存储系统的具体使用k8s又定义了一个新的API对象Persistent Volume Claim,如下
dongyunqi@mongodaddy:~/k8s$ kubectl api-resources|egrep -w 'PersistentVolumeClaim|KIND'
NAME SHORTNAMES APIVERSION NAMESPACED KIND
persistentvolumeclaims pvc v1 true PersistentVolumeClaim
最后这么多的存储系统当多了之后混杂在一起势必造成混乱为此k8s又定义了StorageClass来进行分类维护如下
dongyunqi@mongodaddy:~/k8s$ kubectl api-resources|egrep -w 'StorageClass|KIND'
NAME SHORTNAMES APIVERSION NAMESPACED KIND
storageclasses sc storage.k8s.io/v1 false StorageClass
这样需要用到的3个API对象我们就介绍完毕了三者的关系我们可以参考下图
下面我们看一个实际的例子。
2挂载磁盘到POD中
毫无疑问我们需要先定义磁盘的抽象PVyaml如下
apiVersion: v1
kind: PersistentVolume
metadata:
name: host-10m-pv
spec:
storageClassName: host-test
accessModes:
- ReadWriteOnce
capacity:
storage: 10Mi
hostPath:
path: /tmp/host-10m-pv/
主要属性介绍如下
name: host-10m-pv
名字见名知意基于host的10m的pv
storageClassName: host-test
存储class进行分类根据具体业务即可
- ReadWriteOnce
读写策略完整如下
ReadWriteOnce存储卷可读可写但只能被一个节点上的Pod挂载。
ReadOnlyMany存储卷只读不可写可以被任意节点上的Pod多次挂载。
ReadWriteMany存储卷可读可写也可以被任意节点上的Pod多次挂载。
这里是本地磁盘自然是只能被一个节点上的POD挂载
storage: 10Mi
大小10MB但这里使用的是国际标准不同于我们用的KB1024 byte,MB(1024*1024 byte)一定不要写错
path: /tmp/host-10m-pv/
要挂载的本地磁盘目录没有的话需要手动创建该目录
接着我们应用PV,如下
kubectl apply -f host-path-pv.yml
接着我们就要来使用已经定义的PV了方式自然是定义persistent volume claim如下
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: host-5m-pvc
spec:
storageClassName: host-test
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Mi
storage: 5Mi
代表要求的大小是5MB然后我们应用
kubectl apply -f host-path-pv.yml
操作完成后k8s就会寻找存储class类型为host-test
大小满足5M的PV最终找到了pv host-10m-pv
就将其给pvc host-5m-pvc使用这个使用和被使用确定的过程我们叫做绑定 bound
如下就显示二者就处于Bound状态了
需要的是5m但有10m此时怎么办呢剩余5m就免费赠送了因为没有更合适的了。
dongyunqi@mongodaddy:~/k8s$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
host-10m-pv 10Mi RWO Retain Bound default/host-5m-pvc host-test 3h27m
dongyunqi@mongodaddy:~/k8s$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
host-5m-pvc Bound host-10m-pv 10Mi RWO host-test 3h33m
此时PVC已经绑定了PV接下来我们就该将PVC挂载到POD中了定义POD如下
apiVersion: v1
kind: Pod
metadata:
name: host-pvc-pod
spec:
volumes:
- name: host-pvc-vol
persistentVolumeClaim:
claimName: host-5m-pvc
containers:
- name: ngx-pvc-pod
image: nginx:alpine
ports:
- containerPort: 80
volumeMounts:
- name: host-pvc-vol
mountPath: /tmp
通过claimName: host-5m-pvc
声明pvc host-5m-pvc为卷volume然后在volumeMounts
挂载卷到mountPath: /tmp
目录中如果一切顺利的话我们在POD中的/tmp目录更新文件的内容都会同步写到宿主机Node的/tmp/host-10m-pv/
目录应用后我们进入POD中验证如下
dongyunqi@mongodaddy:~/k8s$ kubectl exec -it host-pvc-pod -- sh
/ # ls /tmp
/ # cd /tmp/
/tmp # ls
/tmp # touch a.txt
/tmp # echo "content writed by pod" > a.txt
/tmp # cat a.txt
content writed by pod
/tmp #
查看POD所在Node(注意这里一定要是POD所在的Node,不确定POD在哪里可通过-o wide确定)
dongyunqi@mongomummy:~/k8s/images$ cd /tmp/host-10m-pv/
dongyunqi@mongomummy:/tmp/host-10m-pv$ ls
a.txt
dongyunqi@mongomummy:/tmp/host-10m-pv$ cat a.txt
content writed by pod
这样就算POD销毁重建新建的文件也依然在也就实现了持久化如下测试
dongyunqi@mongodaddy:~/k8s$ kubectl delete pod host-pvc-pod
pod "host-pvc-pod" deleted
dongyunqi@mongodaddy:~/k8s$ kubectl apply -f host-path-pod.yml
pod/host-pvc-pod created
dongyunqi@mongodaddy:~/k8s$ kubectl get pod
NAME READY STATUS RESTARTS AGE
host-pvc-pod 1/1 Running 0 11s
dongyunqi@mongodaddy:~/k8s$ kubectl exec -it host-pvc-pod -- sh
/ # cat /tmp/a.txt
content writed by pod
/ # exit
dongyunqi@mongodaddy:~/k8s$
写在后面
小结
本文分析了实现磁盘挂载到POD中需要用到的PV persistent volumePVC persistent volume claimStorage Class这三个API对象并一起看了一个实际的例子实现了POD中数据的持久化。希望本文能够帮助到你。
参考文章列表
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |