ps做网页怎么在网站上打开,关键词歌曲免费听,韩国的小游戏网站,网站首页flash模板目录 一、为什么要存储卷#xff1f;二、emptyDir存储卷三、hostPath存储卷四、 nfs共享存储卷五、PVC 和 PV5.1 PV和PVC之间的相互作用遵循的生命周期5.2 PV 的状态5.3 一个PV从创建到销毁的具体流程 六、静态创建pv和pvc资源由pod运用过程6.1 在NFS主机上创建共享目录#… 目录 一、为什么要存储卷二、emptyDir存储卷三、hostPath存储卷四、 nfs共享存储卷五、PVC 和 PV5.1 PV和PVC之间的相互作用遵循的生命周期5.2 PV 的状态5.3 一个PV从创建到销毁的具体流程 六、静态创建pv和pvc资源由pod运用过程6.1 在NFS主机上创建共享目录并且进行exportfs发布6.2 在master主机编写pv资源创建yaml6.3 创建pvc资源并且设置匹配绑定相应的pv6.4 挂载共享卷并且进行共享目录写入测试6.5 K8S支持的存储卷的访问模式 七、StorageClass nfs-client-provisioner搭建动态创建pv7.1 在NFS服务器配置nfs服务7.2 创建 Service Account用来管理 NFS Provisioner 在 k8s 集群中运行的权限和动态规则7.3 创建 StorageClass负责建立 PVC 并调用 NFS provisioner 进行预定的工作并让 PV 与 PVC 建立关联7.4 挂载共享卷并且进行共享目录写入测试 八、 总结 一、为什么要存储卷
容器磁盘上的文件的生命周期是短暂的这就使得在容器中运行重要应用时会出现一些问题。首先当容器崩溃时kubelet 会重启它但是容器中的文件将丢失——容器以干净的状态镜像最初的状态重新启动。其次在Pod中同时运行多个容器时这些容器之间通常需要共享文件。Kubernetes 中的Volume抽象就很好的解决了这些问题。Pod中的容器通过Pause容器共享Volume。
二、emptyDir存储卷
当Pod被分配给节点时首先创建emptyDir卷并且只要该Pod在该节点上运行该卷就会存在。正如卷的名字所述它最初是空的。Pod 中的容器可以读取和写入emptyDir卷中的相同文件尽管该卷可以挂载到每个容器中的相同或不同路径上。当出于任何原因从节点中删除 Pod 时emptyDir中的数据将被永久删除。
emptyDir可实现Pod中的容器之间共享目录数据但是emptyDir卷不能持久化数据会随着Pod生命周期结束而一起删除。
//创建一个模板文件
mkdir /opt/volumes
cd /opt/volumeskubectl run myapp-demo --imagesoscscs/myapp:v1 --port80 --dry-runclient -o yaml myapp-demo.yamlvim myapp-demo.yamlapiVersion: v1
kind: Pod
metadata:labels:run: myapp-demoname: myapp-demo
spec:containers:- image: soscscs/myapp:v1name: myapp-demoports:- containerPort: 80cp myapp-demo.yaml demo1-emptydir.yaml
vim demo1-emptydir.yamlapiVersion: v1
kind: Pod
metadata:labels:run: myapp-demoname: myapp-empty
spec:volumes:- name: test-volemptyDir: {}containers:- image: soscscs/myapp:v1name: myapp-demoports:- containerPort: 80volumeMounts:- name: test-volmountPath: /var/www/- image: busybox:1.28name: busybox-demoports:- containerPort: 80command: [/bin/sh,-c,sleep 3600]volumeMounts:- name: test-volmountPath: /data/kubectl describe pod myapp-empty kubectl exec -it myapp-empty -c myapp-demo sh
//再另外开一个进程
kubectl exec -it myapp-empty -c busybox-demo sh三、hostPath存储卷
hostPath卷将 node 节点的文件系统中的文件或目录挂载到集群中。 hostPath可以实现持久存储但是在node节点故障时也会导致数据的丢失。
把Node节点上的目录/文件挂载到容器中可实现持久化数据存储。但是存储空间会受到Node节点的单机限制Node节点故障数据就会丢失且Pod不能实现跨节点共享数据
https://kubernetes.io/docs/concepts/storage/volumes#hostpath
cp myapp-demo.yaml demo2-hostpath.yaml
vim demo2-hostpath.yaml apiVersion: v1
kind: Pod
metadata:labels:run: myapp-demoname: myapp-demo
spec:volumes:- name: hostpath-volhostPath:path: /var/www/html/type: DirectoryOrCreatenodeSelector:test: bcontainers:- image: soscscs/myapp:v1name: myapp-demoports:- containerPort: 80volumeMounts:- name: hostpath-volmountPath: /usr/share/nginx/html/readOnly: falsekubectl apply -f demo2-hostpath.yaml
kubectl get pods -o wide//进入容器
kubectl exec -it myapp-demo sh在创建Pod时node02节点的目录会自动挂载到容器的目录上
四、 nfs共享存储卷
另开一台节点上安装nfs并配置nfs服务 //在master节点部署
cp myapp-demo.yaml demo3.nfs.yaml
vim demo3.nfs.yaml apiVersion: v1
kind: Pod
metadata:labels:run: myapp-demo3name: myapp-demo3
spec:volumes:- name: test-nfsnfs:path: /opt/shareserver: 192.168.154.13containers:- image: soscscs/myapp:v1name: myapp-demoports:- containerPort: 80volumeMounts:- name: test-nfsmountPath: /usr/share/nginx/htmlkubectl apply -f demo3.nfs.yamlkubectl get pods -owidevim demo3.nfs.yaml apiVersion: v1
kind: Pod
metadata:labels:run: myapp-demo3name: myapp-demo4
spec:nodeName: node02volumes:- name: test-nfsnfs:path: /opt/shareserver: 192.168.154.13containers:- image: soscscs/myapp:v1name: myapp-demoports:- containerPort: 80volumeMounts:- name: test-nfsmountPath: /usr/share/nginx/html kubectl apply -f demo3.nfs.yamlkubectl get pods -owidekubectl exec -it myapp-demo3 shcd /usr/share/nginx/html/kubectl exec -it myapp-demo4 shcd /usr/share/nginx/html/ 五、PVC 和 PV
PV 全称叫做 Persistent Volume持久化存储卷。它是用来描述或者说用来定义一个存储卷的这个通常都是由运维工程师来定义。
PVC 的全称是 Persistent Volume Claim是持久化存储的请求。它是用来描述希望使用什么样的或者说是满足什么条件的 PV 存储。
PVC 的使用逻辑在 Pod 中定义一个存储卷该存储卷类型为 PVC定义的时候直接指定大小PVC 必须与对应的 PV 建立关系PVC 会根据配置的定义去 PV 申请而 PV 是由存储空间创建出来的。PV 和 PVC 是 Kubernetes 抽象出来的一种存储资源。 一个PV可以个一个或多个POD使用PV是k8s集群里专用的存储资源是逻辑划分存储设备空间的资源对象。存储资源要提供存储空间给存储资源使用不能凭空出现 真正提供存储空间的是存储设备如硬盘挂载的目录nfs共享的目录ceph分布式存储等 我们作为K8S集群管理员可以在K8S集群中创建PV再从存储设备划分存储空间给PV 然后我的POD想引用哪个PV得先定义一个PVC用来描述希望使用什么样的或者说是满足什么条件的 PV 存储比如多大存储空间是专用是一对一还是一对多 POD会根据PVC去找符合条件的PV进行绑定最后给POD挂载使用
上面介绍的PV和PVC模式是需要运维人员先创建好PV然后开发人员定义好PVC进行一对一的Bond但是如果PVC请求成千上万那么就需要创建成千上万的PV对于运维人员来说维护成本很高Kubernetes提供一种自动创建PV的机制叫StorageClass它的作用就是创建PV的模板。
创建 StorageClass 需要定义 PV 的属性比如存储类型、大小等另外创建这种 PV 需要用到的存储插件比如 Ceph 等。 有了这两部分信息Kubernetes 就能够根据用户提交的 PVC找到对应的 StorageClass然后 Kubernetes 就会调用 StorageClass 声明的存储插件自动创建需要的 PV 并进行绑定。
动态创建PV 怎样动态创建PV 使用StorageClass 引用某一存储设备的存储卷插件通过调用存储卷插件去到存储设备中动态创建符合PVC需求的存储资源然后PV和PVC进行绑定这样Pod就可以使用PV的存储空间
PV是集群中的资源。 PVC是对这些资源的请求也是对资源的索引检查。
5.1 PV和PVC之间的相互作用遵循的生命周期
PV和PVC之间的相互作用遵循这个生命周期 Provisioning配置— Binding绑定— Using使用— Releasing释放 — Recycling回收
●Provisioning即 PV 的创建可以直接创建 PV静态方式也可以使用 StorageClass 动态创建 ●Binding将 PV 分配给 PVC ●UsingPod 通过 PVC 使用该 Volume并可以通过准入控制StorageProtection1.9及以前版本为PVCProtection 阻止删除正在使用的 PVC ●ReleasingPod 释放 Volume 并删除 PVC ●Reclaiming回收 PV可以保留 PV 以便下次使用也可以直接从云存储中删除
5.2 PV 的状态
根据这 5 个阶段PV 的状态有以下 4 种 ●Available可用表示可用状态还未被任何 PVC 绑定 ●Bound已绑定表示 PV 已经绑定到 PVC ●Released已释放表示 PVC 被删掉但是资源尚未被集群回收 ●Failed失败表示该 PV 的自动回收失败
5.3 一个PV从创建到销毁的具体流程
1、一个PV创建完后状态会变成Available等待被PVC绑定。
2、一旦被PVC邦定PV的状态会变成Bound就可以被定义了相应PVC的Pod使用。
3、Pod使用完后会释放PVPV的状态变成Released。
4、变成Released的PV会根据定义的回收策略做相应的回收工作。有三种回收策略Retain、Delete和Recycle。Retain就是保留现场K8S集群什么也不做等待用户手动去处理PV里的数据处理完后再手动删除PV。Delete策略K8S会自动删除该PV及里面的数据。Recycle方式K8S会将PV里的数据删除然后把PV的状态变成Available又可以被新的PVC绑定使用。
六、静态创建pv和pvc资源由pod运用过程
如图所示我们将选择一台k8s集群之外的服务器作为NFS共享存储服务器并且按照图中的规格
创建pv再由k8s集群创建pv资源和pvc资源最后将其挂载在pod上进行使用
6.1 在NFS主机上创建共享目录并且进行exportfs发布
mkdir -p /opt/k8s/v{1..5}
ls -R k8s/vim /etc/exports
systemctl status nfs
exportfs -arv//其他两个node节点能不能看到
showmount -e 192.168.154.136.2 在master主机编写pv资源创建yaml
访问模式有
ReadWriteOnce 卷可以被一个节点以读写方式挂载。 ReadWriteOnce 访问模式也允许运行在同一节点上的多个 Pod 访问卷。ReadOnlyMany 卷可以被多个节点以只读方式挂载。ReadWriteMany 卷可以被多个节点以读写方式挂载。
//在master主机编写pv资源创建yaml
mkdir pv
cd pv/
vim pv1.yamlapiVersion: v1
kind: PersistentVolume
metadata:name: pv001
spec:accessModes:- ReadWriteOnce- ReadWriteManycapacity:storage: 1Ginfs:path: /opt/k8s/v1server: 192.168.154.13
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv002
spec:accessModes:- ReadWriteOncecapacity:storage: 2Ginfs:path: /opt/k8s/v2server: 192.168.154.13
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv003
spec:accessModes:- ReadWriteOnce- ReadWriteManycapacity:storage: 2Ginfs:path: /opt/k8s/v3server: 192.168.154.13
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv004
spec:accessModes:- ReadWriteOnce- ReadWriteManycapacity:storage: 4Ginfs:path: /opt/k8s/v4server: 192.168.154.13
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv005
spec:accessModes:- ReadWriteOnce- ReadWriteManycapacity:storage: 5Ginfs:path: /opt/k8s/v1server: 192.168.154.13
kubectl apply -f pv1.yaml
kubectl get pv 6.3 创建pvc资源并且设置匹配绑定相应的pv
https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims
vim pvc1.yamlapiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mypvc01
spec:accessModes:- ReadWriteManyresources:requests:storage: 2Gi6.4 挂载共享卷并且进行共享目录写入测试 kubectl run myapp-demo --imagesoscscs/myapp:v1 --port80 --dry-runclient -oyaml myapp-demo.yaml
cp myapp-demo.yaml demo1.yaml
vim demo1.yamlapiVersion: v1
kind: Pod
metadata:labels:run: myapp-demo1name: myapp-demo1
spec:volumes:- name: test-volpersistentVolumeClaim:claimName: mypvc01containers:- image: soscscs/myapp:v1name: myapp-demo1ports:- containerPort: 80volumeMounts:- name: test-volmountPath: /data/kubectl apply -f demo1.yaml
kubectl exec -it myapp-demo1 sh
cd /data/
echo Hello World index.html6.5 K8S支持的存储卷的访问模式 其中 × 表示支持- 表示不支持
七、StorageClass nfs-client-provisioner搭建动态创建pv
StorageClass nfs-client-provisioner的理解 上面介绍的PV和PVC模式是需要运维人员先创建好PV然后开发人员定义好PVC进行一对一的Bond但是如果PVC请求成千上万那么就需要创建成千上万的PV对于运维人员来说维护成本很高Kubernetes提供一种自动创建PV的机制叫StorageClass它的作用就是创建PV的模板。
创建 StorageClass 需要定义 PV 的属性比如存储类型、大小等另外创建这种 PV 需要用到的存储插件比如 Ceph 等。 有了这两部分信息Kubernetes 就能够根据用户提交的 PVC找到对应的 StorageClass然后 Kubernetes 就会调用 StorageClass 声明的存储插件自动创建需要的 PV 并进行绑定。
Kubernetes 本身支持的动态 PV 创建不包括 NFS所以需要使用外部存储卷插件分配PV。详见https://kubernetes.io/zh/docs/concepts/storage/storage-classes/
卷插件称为 Provisioner存储分配器NFS 使用的是 nfs-client这个外部卷插件会使用已经配置好的 NFS 服务器自动创建 PV。 Provisioner用于指定 Volume 插件的类型包括内置插件如 kubernetes.io/aws-ebs和外部插件如 external-storage 提供的 ceph.com/cepfs。
7.1 在NFS服务器配置nfs服务
//nfs服务器
mkdir /opt/k8s
vim /etc/exports
/opt/k8s 192.168.154.0/24(rw,sync,no_root_squash)7.2 创建 Service Account用来管理 NFS Provisioner 在 k8s 集群中运行的权限和动态规则
//master节点
cd pv/
mkdir sc
cd sc/
unzip nfs-client.zip 创建网络插件 7.3 创建 StorageClass负责建立 PVC 并调用 NFS provisioner 进行预定的工作并让 PV 与 PVC 建立关联
cd /etc/kubernetes/manifests/
vim kube-apiserver.yaml - --feature-gatesRemoveSelfLinkfalse vim pvc.yamlapiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mypvc01-nfs
spec:accessModes:- ReadWriteManyresources:requests:storage: 2GistorageClassName: nfs-client-storageclass7.4 挂载共享卷并且进行共享目录写入测试
vim pod-demo.yamlapiVersion: v1
kind: Pod
metadata:labels:run: myapp-demo1name: myapp-demo1
spec:volumes:- name: test-volpersistentVolumeClaim:claimName: mypvc01-nfscontainers:- image: soscscs/myapp:v1name: myapp-demo1ports:- containerPort: 80volumeMounts:- name: test-volmountPath: /data/cp pvc.yaml pvc1.yaml
vim pvc1.yamlapiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mypvc02-nfs
spec:accessModes:- ReadOnlyManyresources:requests:storage: 2GistorageClassName: nfs-client-storageclass八、 总结
k8s 存储卷 volumes
emptyDir 可实现Pod中的容器之间共享目录数据但emptyDir存储卷没有持久化数据的能力存储卷会随着Pod生命周期结束而一起删除hostPath 将Node节点上的目录/文件挂载到容器的指定目录中有持久化数据的能力但只能在单个Node节点上持久化数据不能实现跨节点的Pod共享数据nfs 使用NFS服务将存储设备的共享目录挂载到容器的指定目录中有持久化数据的能力且也能实现跨节点的Pod共享数据
PV PVC PV K8S在指定的存储设备空间中逻辑划分创建的可持久化的存储资源对象 PVC 是对PV资源对象的请求和绑定也是一致Pod可挂载的存储卷类型
PV的状态 4 种
Available可用表示可用状态还未被任何 PVC 绑定Bound已绑定表示 PV 已经绑定到 PVCReleased已释放表示 PVC 被删掉但是资源尚未被回收Failed失败表示该 PV 的自动回收失败
创建和使用 静态PV 1准备好存储设备和共享目录 2手动创建PV资源配置 存储卷类型 访问模式RWO RWX ROX 存储能力大小 3创建PVC资源配置请求PV资源的问模式必要条件必须是PV能支持的访问模式和存储大小就近选择大于等于指定大小的PV来绑定PV一个PV只能绑定一个PVC 4创建Pod资源挂载PVC存储卷配置存储卷类型为 persistentVolumeClaim 在容器配置中定义存储卷的挂载点
创建和使用 动态PV 1准备好存储设备和共享目录 2如果是外置存储卷插件需要先创建service account账户Pod应用使用的账户和RBAC授权创建角色授予相应资源对象的操作权限角色与账户绑定使得 sa 账户具有对PV PVC SC等资源的操作权限 3创建外置存储卷插件Provisioner的Pod配置中使用sa账户作为Pod账户并设置相关环境变量参数 4创建SC资源(StorageClass)配置中引用之前定义的Provisioner的名称 -------------- 以上过程是一劳永逸的以后只需要创建PVC时引用StorageClass就可以动态生成相关PV资源 --------------- 5创建PVC资源配置中引用StorageClass资源名称。创建PVC资源后会自动创建相关的PV资源。 6创建Pod资源挂载PVC存储卷配置存储卷类型为 persistentVolumeClaim 在容器配置中定义存储卷的挂载点