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. Typora配置阿里云图床

    一.Typora安装PicGo 更新typora到最新版,打开文件-->偏好设置-->图像-->上传服务选择PicGo-Core-->下载或更新   二.注册并配置阿里云 1. ...

  2. python基础中遇到的问题(TypeError: unhashable type: 'list')

    d20220330 #false >>> l=[{i:i+1} for i in [1,2,3]] >>> l [{1: 2}, {2: 3}, {3: 4}] & ...

  3. sqlserver用windows方式验证登录踩过的坑

    坑位一: 之前没用过windows验证方式登录sqlserver,连接串怎么写 坑位二: 链接上了,但是启动报错 八月 19, 2020 9:33:43 上午 com.microsoft.sqlser ...

  4. List集合五种遍历方式

    一.使用Iterator接口遍历 二.普通for循环遍历 三.增强for循环遍历 四.List集合自带迭代器 五.Lambda(JDK8新增特性) //使用多态方式创建对象 List<Strin ...

  5. 十进制转换为K进制 Java 代码

    最近在读<计算机科学导论--跨学科方法>(机械工业出版社),习题索引:1.3.21: 编写一个新程序Kary,输入两个命令行参数i和k,并将i转换为基数k的数值表示.假设i是java中的l ...

  6. dotnet 控制台 使用 Microsoft.Maui.Graphics 配合 Skia 进行绘图入门

    本文将告诉大家如何在 dotnet 的控制台模式下,采用 MAUI 自绘库 Microsoft.Maui.Graphics 进行绘图,设置 Microsoft.Maui.Graphics 底层调用 M ...

  7. Tapdata Real Time DaaS 技术详解 PART I :实时数据同步

      摘要:企业信息化过程形成了大量的数据孤岛,这些并不连通的数据孤岛是企业数字化转型的巨大挑战.Tapdata Real Time DaaS 采用的CDC模式,具有巨大的优势,同时是一个有技术壁垒的活 ...

  8. 最优化:凸集、凸函数、KKT条件极其解释

    1.凸集(大概定义) 2.凸函数  3.KK条件      

  9. Java之取余操作 "%"

    取模运算与取余运算两个概念有重叠的部分但又不完全一致.主要的区别在于对负整数进行除法运算时操作不同. 对于整形数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商 c = a / b: 2. ...

  10. 洛谷P4017 最大食物链数量 dfs

    老规矩,传送门 做题从头到尾的思路: 1. 这个题明显就是dfs数数量了,简单,邻接矩阵干他! TLE警告,8个点 额... 2. 老师说这玩意不能邻接矩阵?没事,还有邻接表,再来! 再次TLE 8个 ...