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 中的某一个容器在运行时异常退出,被 ...
随机推荐
- Oracle For Linux 恢复日记 霆智X8III
公司最近的客户需要在LINUX系统中做数据迁移,备份出来的内容数据库物理文件,回档日志和SpfileXXXX 客户用的是北京霆智的X8备份阵列,X8与数据库服务器都放在IDC机所,IDC机房与客户之间 ...
- LINUX 下.NET Core 微服务部署实战
前言 最近一直在开发部署.也没有总结一下.从5月份开始出差到现在基本没有发过博客,哎,惭愧. 一直在弄微服务,后续会慢慢更新下面这个系列.欢迎各位大佬交流指点. 分布式理论专题 1..net core ...
- 记录一次使用NPOI遇到的问题
在.net 下一般使用NPOI操作Excel相信大家都不陌生,但是本人在操作过程中遇到一个比较奇怪的问题,特写此博客记录与大家分享. 例子是使用Winform,点击按钮时弹出打开文件对话框,然后选择文 ...
- .Net Core 程序集管理说明(加载)
.NET CORE 的程序集加载管理和以前的 .NET 发生了很大的变化, 在 .NET CORE 里, 程序集的加载, 依赖了 xx.deps.json 文件, deps.json 文件里,定义了程 ...
- Xcode11 Developer Tool中没了Application Loader
升级Xcode11之后不少人发现在Open Developer Tool中没了Application Loader. 那么如果我们还想用该怎么办呢? 先这样 找个老版的Xcode–>Conten ...
- 常用模块 - logging模块
一.简介 logging模块定义的函数和类为应用程序和库的开发实现了一个灵活的事件日志系统.logging模块是Python的一个标准库模块,由标准库模块提供日志记录API的关键好处是所有Python ...
- CSS怎么隐藏滚动条(三种方法)
xhtml中隐藏滚动条在用ie6浏览有框架的xhtml页面的时候,默认会水平和垂直滚动条会一起出现,这是ie6的一个bug,在firefox上是正常的,出现的原因是其对XHTML 1.0 transi ...
- Windows - CMD窗口UTF8编码乱码问题的解决!
问题描述 用MS-DOC打开 UTF-8 的文件时, 显示乱码问题根源 CMD默认是Windows系统默认编码(GBK), 用GBK格式来解码UTF-8的文件当然会出现乱码.解决方案 ...
- NN入门
参考资料:https://blog.csdn.net/kwame211/article/details/77337166, 仅作为个人学习笔记.人工智能的底层模型是"神经网络"(n ...
- Win10下免安装版MySQL8.0.16的安装和配置
1.MySQL8.0.16解压 其中dada文件夹和my.ini配置文件是解压后手动加入的,如下图所示 2.新建配置文件my.ini放在D:\Free\mysql-8.0.16-winx64目录下 [ ...