K8s的存储卷使用总结
K8s的存储卷:
它有四种存储卷:
1. emptyDir: 空目录,这种存储卷会随着Pod的删除而被清空,它一般作为缓存目录使用,或临时目录,
当做缓存目录时,通常会将一块内存空间映射到该目录上,让Pod做为缓存目录使用。
2. hostPath
SAN(存储区域网络): iSCSI,FB
NAS(网络附加存储): nfs,cifs
分布式存储: Glusterfs, ceph(rbd), cephfs
云存储: EBS(弹性块存储),Azure Disk
- #emptyDir存储卷的示例:
- vim pod-volume.yaml
- apiVersion:v1
- kind: Pod
- metadata:
- name: pod-demo
- namespace: default
- labels:
- app: myapp
- tier: frontend
- annotations:
- magedu.com/created-by: “cluster admin”
- spec:
- containers:
- - name: httpd
- image: busybox:latest
- imagePullPolicy: IfNotPresent #设定镜像策略为即便本地没有镜像也不去下载.
- command: ["/bin/httpd","-f","-h", " /data/web/html"]
- ports:
- - name: http
- containerPort:
- volumeMounts: #存储卷可被一个Pod中的多个容器挂载.谁需要就定义挂载即可.
- - name: html
- mountPath: /data/web/html/
- - name: busybox
- image: busybox: latest
- imagePullPolicy: IfNotPresent
- volumeMounts:
- - name: html
- mountPath: /data/
- command:
- - “/bin/sh”
- - “-c”
- - "while true; do echo $(date) >> /data/index.html; sleep 2; done”
- volumes:
- - name: html
- emptyDir: {}
#开始创建Pod
kubectl apply -f pod-volume.yaml
kubectl get pods
kubectl exec -it pod-demo -c busybox -- /bin/sh #联入pod-demo这个Pod中叫busybox的容器中.
#注意:
当一个Pod中有多个容器时,当Pod启动出现错误,可通过
kubectl describe pods pod-demo #查看其中每个容器的Status,来确认每个容器的运行状态。
gitRepo类型的存储卷:
gitRepo:这种类型的存储卷是在容器启动时,将远程git仓库中的数据(如: 网站代码)给克隆一份到本地,然后启动容器使用该克隆的数据来提供服务,这份克隆的数据在容器运行过程中不会将更新的数据同步到git仓库中,同时git仓库中的更新也不会同步到该容器中,若要实现当git仓库发生改变时,能同步到容器的存储卷中,还要借助于辅助容器,每隔一段时间就去克隆一份git仓库中的数据, 当本地数据改变时,再同步到git仓库中。
hostPath类型的存储卷:
它有一下几种类型:
1. DirectoryOrCreate: 它可以是宿主机上的一个已存在的目录,也可不存在,若不存在则自动创建.
2. Directory: 它必须是宿主机上一个已经存在的目录。
3. FileOrCreate: 它可以是宿主机上的一个文件,若此文件不存在则创建一个空文件来挂载。
4. File:宿主机上的一个已经存在的文件,若不存在则报错。
5. Socket:宿主机上一个已经存在的Unix Socket文件.
6. CharDevice: 宿主机上一个已存在的字符类型的设备文件.
7. BlockDevice: 宿主机上一个已存在的块类型的设备文件。
- #创建一个hostPath类型的存储卷示例:
- vim pod-hostpath-vol.yaml
- apiVersion: v1
- kind: Pod
- metadata:
- name: pod-hostpath-vol
- namespace: default
- spec:
- containers:
- - name: myapp
- image: ikubernetes/myapp:v1
- volumeMounts:
- - name: html
- mountPath: /usr/share/nginx/html/
- volumes:
- - name: html
- hostPath:
- #这是定义宿主机上那个目录作为容器myapp的存储卷的.
- path: /data/pod/volume1
- type: DirectoryOrCreate
创建Pod前的准备:
1. 因为不确定Pod会被调度到那个节点上,因此再两个节点上都创建/data/pod/volume1
并再该目录中都创建一个网页文件,并有意让两个节点上的目录中的网页文件内容不同
以便查看效果。
创建Pod
kubectl apply -f pod-hostpath-vol.yaml
kubectl get pods -o wide
curl http://Pod_IP
#删除看它若调度到第二个节点上,继续访问Pod_IP,会发现依然可访问.
#但这仅实现了节点级别数据持久,若节点挂了,数据依然不保!
kubectl delete -f pod-hostpath-vol.yaml
NFS类型的网络共享存储卷:
1. 配置前的准备工作
node10:
在集群外的一台主机上启动NFS服务,让它来提供网络共享存储.
yum install -y nfs nfs-utils
vim /etc/exports
/data/volumes 192.168.111.0/24(rw,no_root_squash)
mkdir -pv /data/volumes
systemctl start nfs
2. 在集群内运行Pod的两个宿主机上测试挂载nfs共享,若能挂载,则Pod一定是能使用NFS共享存储的。
yum install -y nfs-utils
mount -t nfs node10:/data/volumes /mnt #若能成功挂载,就可以卸载了.
- . 创建NFS 共享存储卷的配置清单:
- vim pod-nfs-vol.yaml
- apiVersion: v1
- kind: Pod
- metadata:
- name: pod-nfs-vol
- namespace: default
- spec:
- containers:
- - name: myapp
- image: ikubernetes/myapp:v1
- volumeMounts:
- - name: html
- mountPath: /usr/share/nginx/html/
- volumes:
- - name: html
- nfs:
- path: /data/volumes
- server: node10.test.com #先测试直接让Pod挂载NFS共享
#应用上面的清单文件,创建Pod来测试
kubectl apply -f pod-nfs-vol.yaml
kubectl get pods
node10: #在NFS共享目录中创建index.html
echo “<h1> NFS share stroage server </h1>” >> /data/volumes/index.html
回到pod所在节点:
curl http://Pod_IP #可以看到正常返回NFS Share ....的信息.
PVC 使用示例:
PV的访问模型:
accessModes:
ReadWriteOnce【简写:RWO】: 单路读写,即仅能有一个节点挂载读写
ReadOnlyMany【ROX】: 多路只读
ReadWriteMany【RWX】:多路读写
1. 准备后端存储环境:
node10:
mkdir /data/volumes/{v1,v2,v3,v4,v5}
vim /etc/exports
/data/volumes/v1 192.168.111.0/24(rw,no_root_squash)
/data/volumes/v2 192.168.111.0/24(rw,no_root_squash)
/data/volumes/v3 192.168.111.0/24(rw,no_root_squash)
exportfs -arv
showmount -e
- . 将这几个共享存储卷在K8s上定义为PV
- vim pv-demo.yaml
- apiVersion: v1
- kind: PersistentVolume
- metadata:
- name: pv01 #PV是集群级别的资源,因此它不能定义在名称空间中,它可以被任何名称空间使用.
- 名称空间也不能嵌套,因为它也是集群级别的资源.
- labels:
- name: pv01
- rate: high #添加一个速度标签,用于标明其存储效率更高,以便后期标签选择器选择.
- spec:
- nfs:
- path: /data/volumes/v1
- server: node10.test.com
- #对于访问模型,可定义为底层共享存储的子集,但不能是超集
- #即: NFS支持RWO,ROX,RWX,但我创建PV时,可只提供其中一个或多个.
- accessModes: ["ReadWriteMany", “ReadWriteOnce”]
- capacity:
- #对于存储能力,它的单位有:T,P,G,M,K或 Ti,Pi,Gi,Mi,Ki 区别:加i的是以1024为换算单位的。
- storage: 2Gi
- ---
- apiVersion: v1
- kind: PersistentVolume
- metadata:
- name: pv02
- labels:
- name: pv02
- rate: high
- spec:
- nfs:
- path: /data/volumes/v2
- server: node10.test.com
- accessModes: ["ReadWriteMany","ReadOnlyMany"]
- capacity:
- storage: 5Gi
- ---
- apiVersion: v1
- kind: PersistentVolume
- metadata:
- name: pv03
- labels:
- name: pv03
- rate: high
- spec:
- nfs:
- path: /data/volumes/v3
- server: node10.test.com
- accessModes: ["ReadWriteMany","ReadOnlyMany"]
- capacity:
- storage: 10Gi
创建PV
kubectl apply -f pv-demo.yaml
kubectl get pv
RECLAIM POLICY:回收策略
Retain: 保留,即若Pod绑定了一个PVC,PVC绑定了一个PV,后来Pod删除了,那么PV中的数据要怎么处理?
Retain是默认回收策略,即这些数据保留着,以便Pod再次创建时还能使用。
Released: 这种回收策略是, 不保留数据, 即Pod删除,则PV自动回收,清空里面的数据,并允许其他Pod绑定使用.
Delete: 删除,即PVC和PV解除绑定后,PV自动删除.数据也就被清空了。
- 创建PVC:
- vim pod-pvc-vol.yaml
- apiVersion: v1
- kind: PersistentVolumeClaim
- metadata:
- name: mypvc
- namespace: default
- spec:
- #它必须是PV的子集,即PV必须能符合它的要求.
- accessModes: ["ReadWriteMany"]
- resources:
- requests:
- storage: 6Gi
- ---
- apiVersion: v1
- kind: Pod
- metadata:
- name: pod-vol-pvc
- namespace: default
- spec:
- containers:
- - name: myapp
- image: ikubernetes/myapp:v1
- volumeMounts:
- - name: html
- mountPath: /usr/share/nginx/html/
- volumes:
- - name: html
- persistentVolumeClaim:
- claimName: mypvc
- # kubectl apply -f pod-pvc-vol.yaml
- #验证:
- # kubectl get pv
- NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
- pv01 1Gi RWO,RWX Retain Available 7m3s
- pv02 2Gi ROX,RWX Retain Available 7m3s
- pv03 5Gi ROX,RWX Retain Available 6m3s
- pv04 10Gi ROX,RWX Retain Bound default/mypvc 6m3s
- pv05 20Gi ROX,RWX Retain Available 6m3s
- # kubectl describe pod pod-vol-pvc
- Name: pod-vol-pvc
- Namespace: default
- .....
- Mounts:
- /var/lib/nginx/html from html (rw)
- /var/run/secrets/kubernetes.io/serviceaccount from default-token-6xlcj (ro)
- .......
- Volumes:
- html:
- Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
- ClaimName: mypvc
- ReadOnly: false
- # kubectl get pvc
- NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
- mypvc Bound pv04 10Gi ROX,RWX 100s
- # kubectl describe pvc mypvc
- Name: mypvc
- Namespace: default
- StorageClass:
- Status: Bound
- Volume: pv04
- .......
- Capacity: 10Gi
- Access Modes: ROX,RWX
- VolumeMode: Filesystem
- Events: <none>
- Mounted By: pod-vol-pvc #这里可查看此PVC当前挂载到那个容器里了,本例中是挂载到 pod-vol-pvc这个容器中了。
- 注意:
- PVC 它是K8s中的标准资源,它存储在API Server的etcd(集群状态存储)存储数据库中,即便Pod因为故障被删除了,依然不影响PVC的存在,下次Pod启动后,依然可以使用PVC.
K8s的存储卷使用总结的更多相关文章
- k8s之存储卷及pvc
1.存储卷概述 因为pod是有生命周期的,pod一重启,里面的数据就没了,所以我们需要数据持久化存储,在k8s中,存储卷不属于容器,而是属于pod,也就是说同一个pod中的容器可以共享一个存储卷,存储 ...
- k8s volume存储卷
k8s volume存储卷 介绍 volume存储卷是Pod中能够被多个容器访问的共享目录,kubernetes的volume概念,用途和目的与docker的volume比较类似,但两者不能等价, ...
- k8s volume存储卷(四)
介绍 volume存储卷是Pod中能够被多个容器访问的共享目录,kubernetes的volume概念,用途和目的与docker的volume比较类似,但两者不能等价,首先,kubernetes中的v ...
- k8s的存储卷
存储卷查看:kubectl explain pods.spec.volumes 一.简单的存储方式 1)2个容器之间共享存储..(删除则数据消失) apiVersion: v1 kind: Pod m ...
- k8s系列---存储卷pv/pvc。configMap/secert
因为pod是有生命周期的,pod一重启,里面的数据就没了.所以我们需要数据持久化存储. 在k8s中,存储卷不属于容器,而是属于pod.也就是说同一个pod中的容器可以共享一个存储卷. 存储卷可以是宿主 ...
- 12.k8s的存储卷创建过程
数据持久化需要数据卷.kubernetes生态提供海量的存储驱动和存储使用方式. [root@master song]# cat pod-demo.yml apiVersion: v1 kind: P ...
- Kubernetes学习之路(十六)之存储卷
目录 一.存储卷的概念和类型 二.emptyDir存储卷演示 三.hostPath存储卷演示 四.nfs共享存储卷演示 五.PVC和PV的概念 六.NFS使用PV和PVC 1.配置nfs存储 2.定义 ...
- k8s学习笔记之八:存储卷
第一章.前言 默认情况下容器的数据都是非持久化的, 在容器消亡以后数据也跟着丢失, 所以 Docker 提供了 Volume 机制以便将数据持久化存储. 类似的, Kubernetes 提供了更强大的 ...
- 从零开始入门 K8s | 应用存储和持久化数据卷:核心知识
作者 | 至天 阿里巴巴高级研发工程师 一.Volumes 介绍 Pod Volumes 首先来看一下 Pod Volumes 的使用场景: 场景一:如果 pod 中的某一个容器在运行时异常退出,被 ...
随机推荐
- Configuration property name 'xxx' is not valid
目录 问题 解决 问题 程序出错:Configuration property name ‘xxx’ is not valid, Canonical names should be kebab-cas ...
- 【开发笔记】-MySQL数据库5.7+版本,编码格式设置
原因 昨天不小心把数据库搞崩了,重装了5.7.27版本得mysql数据库,在安装过程中并没有设置数据库默认编码格式等操作.在把项目启动后,jpa自动创建表结构,会把数据库,表,字段的编码自动设置为IS ...
- 根父类:Object 类
一.Object类 Java中规定: 如果一个类没有显式声明它的父类(即没有写extends xx),那么默认这个类的父类就是java.lang.Object. 类 Object 是类层次结构的根类. ...
- docker下安装redis集群
docker-compose.yml master: image: redis:4 container_name: redis-cluster_master command: redis-server ...
- 为 Linux 应用程序编写 DLL
插件和 DLL 通常是用来无须编写整个新应用程序而添加功能的极好方法. 在 Linux 中,插件和 DLL 是以动态库形式实现的. 电子商务顾问兼设计师 Allen Wilson 介绍了动态库,并且向 ...
- 【恢复】Redo日志文件丢失的恢复
第一章 Redo文件丢失的恢复 1.1 online redolog file 丢失 联机Redo日志是Oracle数据库中比较核心的文件,当Redo日志文件异常之后,数据库就无法正常启动,而且有丢 ...
- css animation动画使用
<!-- animation 属性是一个简写属性,用于设置六个动画属性: animation-name animation-duration animation-timing-function ...
- Ansible入门笔记(3)之Playbook
目录 Ansible-playbook 1.1.什么是playbook? 1.2.playbook的核心组成 1.3.playbook的handlers.notify触发 1.4.playbook的变 ...
- Odoo权限控制详解
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826105.html 一:Odoo中的权限设置主要有以下5种 1)菜单.报表的访问权限 Odoo可以设置菜 ...
- js 压缩图片 上传
感谢,参考了以下作者的绝大部分内容 https://blog.csdn.net/tangxiujiang/article/details/78755292 https://blog.csdn.net/ ...