k8s中为什么使用存储:

k8s中的副本控制器保证了pod的始终存储,却保证不了pod中的数据。只有启动一个新pod的,之前pod中的数据会随着容器的删掉而丢失!

pv和pvc的概念:

PersistentVolume(一些简称PV):由管理员添加的的一个存储的描述,是一个全局资源,包含存储的类型,存储的大小和访问模式等。它的生命周期独立于Pod,例如当使用它的Pod销毁时对PV没有影响。

PersistentVolumeClaim(一些简称PVC):是Namespace里的资源,描述对PV的一个请求。请求信息包含存储大小,访问模式等。

创建pv 

后端存储用的是nfs,nfs共享存储配置可以看之前发布的博文

[root@k8s-master1 pv]# cat nginx-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: nginx-pv
labels:
type: nginx-pv
spec:
capacity: #存储能力
storage: 2Gi #大小2G
accessModes:
- ReadWriteMany #多节点读写
persistentVolumeReclaimPolicy: Recycle #可回收
nfs: #指定nfs存储
path: "/data/k8s" #nfs主机存储路径,这个路径需要主机真实存在
server: 192.168.198.144 #nfs 服务端地址,是主机地址
readOnly: false 创建pv
[root@k8s-master1 pv]# kubectl apply -f nginx-pv.yaml

创建pvc

[root@k8s-master1 pv]# cat nginx-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nginxpvc
spec:
accessModes:
- ReadWriteMany
resources: #需求资源
requests:
storage: 2Gi #需求资源大小2G [root@k8s-master1 pv]# kubectl apply -f nginx-pvc.yaml

pvc会自动绑定和他需求资源大小最接近的pv资源(有个前提:pv资源必须答应pvc需求资源大小)

查询pv,pvc

 pod使用pvc

[root@k8s-master1 pv]# cat nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment #deployment 控制器
metadata:
name: my-dep-pvc #deploymen 名称
spec: #deployment 元数据
replicas: 1 #副本数
selector: #选择器
matchLabels:
app: my-dep-pvc #label名称
template: #容器模板
metadata:
labels:
app: my-dep-pvc
spec: #容器元数据
containers:
- name: nginx #容器名称
image: centos-nginx:1.23.0 #容器镜像,本地build的一个镜像
imagePullPolicy: Never #容器镜像拉取方式,never表示只从本地拉取,不从远程仓库拉取
ports:
- containerPort: 80 #容器镜像
volumeMounts: #容器挂载的pvc卷
- name: nginx-data #自定义容器挂载卷的名称
mountPath: /apps/nginx/html #需要挂载出去的容器的路径,我的html文件放在了apps这个目录下
volumes: #挂载卷
- name: nginx-data #卷名称,需要和自定义容器挂载卷的名称一致
persistentVolumeClaim:
claimName: nginxpvc #本地创建的pvc名称
restartPolicy: Always
创建deployment
[root@k8s-master1 pv]# kubectl apply -f nginx-deployment.yaml

查询 pod卷信息

[root@k8s-master1 pv]# kubectl describe pod my-dep-pvc-6bc6fb7dd9-pnxs8
#截取一部分,mounts挂载情况,Volumes:信息
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/apps/nginx/html from nginx-data (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-clqrl (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
nginx-data:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: nginxpvc
ReadOnly: false
default-token-clqrl:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-clqrl

 主机上df  -h可以查询到对应挂载信息

[root@k8s-node2 pods]# df -h | grep nginx-pv
192.168.198.144:/data/k8s 17G 3.7G 14G 22% /var/lib/kubelet/pods/74972e11-8dc1-4c39-a2ba-58050d8224d3/volumes/kubernetes.io~nfs/nginx-pv

测试pod容器数据持久性

nginx-pv对应主机真实路径:/data/k8s

在/data/k8s上传对应html文件,测试pod容器数据持久性

[root@k8s-master1 pv]# cd /data/k8s/
#这两个html文件从Nginx中拷贝过来
[root@k8s-master1 k8s]# ll
total 8
-rw-r--r-- 1 root root 497 Aug 29 09:21 50x.html
-rw-r--r-- 1 root root 5 Aug 29 09:22 index.html
#修改index文件
[root@k8s-master1 k8s]# echo xmxm > index.html

发布服务service

[root@k8s-master1 pv]# cat svc.yaml
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
name: my-svc-pvc
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: my-dep-pvc
type: NodePort
status:
loadBalancer: {}
[root@k8s-master1 pv]# kubectl apply -f svc.yaml

查询svc,端口为32432

[root@k8s-master1 pv]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 16d
my-svc-pvc NodePort 10.102.155.197 <none> 80:32432/TCP 81m
readiness-svc NodePort 10.108.113.163 <none> 80:30663/TCP 5d19h

使用浏览器测试

删除pod后,重新测试

[root@k8s-master1 pv]# kubectl get pods
NAME READY STATUS RESTARTS AGE
httpget 1/1 Running 6 5d23h
my-dep-68dbd87f47-pmcdq 1/1 Running 7 10d
my-dep-pvc-6bc6fb7dd9-pnxs8 1/1 Running 0 82m
my-dep3-6f4f5bbc-48pml 1/1 Running 7 9d
my-dep3-6f4f5bbc-d8zmt 1/1 Running 7 9d
readiness-57cbcdfc6d-52ffg 1/1 Running 6 5d19h
[root@k8s-master1 pv]# kubectl delete pod my-dep-pvc-6bc6fb7dd9-pnxs8
pod "my-dep-pvc-6bc6fb7dd9-pnxs8" deleted
[root@k8s-master1 pv]#
[root@k8s-master1 pv]#
[root@k8s-master1 pv]# kubectl get pods
NAME READY STATUS RESTARTS AGE
httpget 1/1 Running 6 5d23h
my-dep-68dbd87f47-pmcdq 1/1 Running 7 10d
my-dep-pvc-6bc6fb7dd9-f828l 1/1 Running 0 5s
my-dep3-6f4f5bbc-48pml 1/1 Running 7 9d
my-dep3-6f4f5bbc-d8zmt 1/1 Running 7 9d
readiness-57cbcdfc6d-52ffg 1/1 Running 6 5d19h

再次使用浏览器访问,页面还是xmxm,数据没有丢失

k8s数据持久化,pv和pvc的更多相关文章

  1. k8s入门之PV和PVC(八)

    某些应用是要持久化数据的,如果直接持久化在pod所在节点,当pod因为某种原因重建或被调度另外一台节点,是无法访问到之前持久化的数据,所以需要一个公共存储数据的地方,无论pod删除重建或重新调度到其他 ...

  2. k8s数据持久化实验

    Step 1:创建PV ============================================ apiVersion: v1kind: PersistentVolumemetadat ...

  3. 容器编排系统K8s之PV、PVC、SC资源

    前文我们聊到了k8s中给Pod添加存储卷相关话题,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14180752.html:今天我们来聊一下持久存储卷相关话题 ...

  4. Kubernetes集群PV和PVC详解

    Kubernetes集群高级存储资源PV及PVC 文章目录 Kubernetes集群高级存储资源PV及PVC 1.高级存储PV和PVC概念部分 2.PV和PVC资源的生命周期 3.PV资源介绍与案例配 ...

  5. k8s的持久化存储PV&&PVC

    1.PV和PVC的引入 Volume 提供了非常好的数据持久化方案,不过在可管理性上还有不足. 拿前面 AWS EBS 的例子来说,要使用 Volume,Pod 必须事先知道如下信息: 当前 Volu ...

  6. k8s集群,使用pvc方式实现数据持久化存储

    环境: 系统 华为openEulerOS(CentOS7) k8s版本 1.17.3 master 192.168.1.244 node1 192.168.1.245 介绍: 在Kubernetes中 ...

  7. K8S学习笔记之Kubernetes数据持久化方案

    在开始介绍k8s持久化存储前,我们有必要了解一下k8s的emptydir和hostpath.configmap以及secret的机制和用途. 0x00 Emptydir EmptyDir是一个空目录, ...

  8. Kubernetes 系列(六):持久化存储 PV与PVC

    在使用容器之后,我们需要考虑的另外一个问题就是持久化存储,怎么保证容器内的数据存储到我们的服务器硬盘上.这样容器在重建后,依然可以使用之前的数据.但是显然存储资源和 CPU 资源以及内存资源有很大不同 ...

  9. 6.k8s.存储Volume.PV.PVC

    #Volume Volume 解决数据持久化和容器间共享数据 Kubernetes支持几十种类型的后端存储卷 #hostPath挂载实例,挂载Node节点/tmp/test-volume目录到容器/t ...

随机推荐

  1. ngRoute 配置路径不能跳转问题

    1.原因:AngularJS 版本更新至1.6后对地址做了特别处理.如:<a hret="#/someurl"> 在浏览器中被解析为"#!%2Fsomeurl ...

  2. WPF开发随笔收录-仿安卓Toast

    一.前言 在项目中,经常需要用到消息提醒功能,在以前接触安卓开发那会使用过Toast,于是打算在WPF上也来模仿一个,话不多说,撸起袖子干起来! 二.正文 1.首先新建一个工程,工程的目录如下 2.编 ...

  3. Node.js精进(5)——HTTP

    HTTP(HyperText Transfer Protocol)即超文本传输协议,是一种获取网络资源(例如图像.HTML文档)的应用层协议,它是互联网数据通信的基础,由请求和响应构成. 在 Node ...

  4. 【python基础】第02回 计算机基础2

    上节内容回顾 1.绝对路径与相对路径 1.路径的概念 用来标识资源的位置 2.绝对路径 类似于全球GPS定位(给到任何人都可以顺利的找到相应的资源) eg: D:\aaa\a.txt 3.相对路径 需 ...

  5. 从一道算法题实现一个文本diff小工具

    众所周知,很多社区都是有内容审核机制的,除了第一次发布,后续的修改也需要审核,最粗暴的方式当然是从头再看一遍,但是编辑肯定想弄死你,显然这样效率比较低,比如就改了一个错别字,再看几遍可能也看不出来,所 ...

  6. python+requests+yaml实现接口自动化用例

    前言:最近也思考了一下怎么做接口自动化,以下内容属于自己目前阶段所学习到的内容,也逐渐投入自己实际工作中,把最近的学习新得跟大家分享下,话不多说,切入正题. 对接口自动化测试用例的思考:接口测试大多测 ...

  7. Java数组的基本操作

    public class Array1 { public static void main(String[] args) { int [] num={1,2,3,4,5}; System.out.pr ...

  8. Microsoft Office Visio Professional 之用例图

    1 用例 用例:表示参与者与系统的一次交互过程. 用例用椭圆来表示: 2 用例的特点 用例用于描述系统的功能,这个功能是外部使用者看到的系统功能,不反映功能的实现方式. 用例描述用户提出的一些可见需求 ...

  9. ArrayList分析1-循环、扩容、版本

    ArrayList分析1-循环.扩容.版本 转载请注明出处 https://www.cnblogs.com/funnyzpc/p/16407733.html 前段时间抽空看了下ArrayList的源码 ...

  10. String类型函数传递问题

    String类型函数传递问题 问题 以前没有注意过的一个问题, 最近在使用String类型作为函数入参的时候, 发现函数内对于String类型的改变并不会影响到外层调用对象本身; 结论 (先说结论) ...