一文解析Kubernetes使用PVC后数据丢失

目录
  • 问题现象
  • 复现
  • 问题分析

问题现象

使用官方postgresql镜像,通过pvc将云硬盘挂载至数据目录,每次重建Pod,数据库数据都会丢失。

复现

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgresql-persistent-storage
  namespace: default
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: cbs
  volumeMode: Filesystem

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgresql-deployment
spec:
  selector:
    matchLabels:
      app: postgresql
  template:
    metadata:
      labels:
        app: postgresql
    spec:
      containers:
      - image: postgres:12.4
        name: postgresql
        env:
        - name: POSTGRES_PASSWORD
          value: "123456"
        ports:
        - containerPort: 5432
          name: postgresql
        volumeMounts:
        - name: postgresql-persistent-storage
          ## 注意挂载点
          mountPath: /var/lib/postgresql
      volumes:
      - name: postgresql-persistent-storage
        persistentVolumeClaim:
          claimName: postgresql-persistent-storage

使用上述提供的 yaml创建工作负载,完成后可看到 Pod 正常运行。

根据dockerhub官方镜像的说明中,镜像数据库文件存储的默认目录为/var/lib/postgresql/data

上述yaml中,将持久化存储挂载到/var/lib/postgresql,看似无问题,容器也可以正常启动,但是其实数据库文件并没有写入 PVC 中,当 Pod 发生重启重新调度时,数据库文件便会丢失。

问题分析

进入 Pod, 通过 findmnt命令,可以清楚地看到数据库存储文件并未保存在数据盘中,而是使用 volume 的方式挂载,被挂载到了/dev/vda1中,所以导致 Pod 重启时,该目录被自动释放,数据丢失。

那是什么原因造成的呢?

我们登录 Pod 所在的节点

通过docker history --no-trunc postgres:12.4查看镜像的构建历史发现,此镜像构建所使用的 Dockerfile使用了 VOLUME命令,手工挂载了/var/lib/postgresql/data

Dockerfile构建后的镜像中,VOLUME中的操作并不会被Kubernetes忽略,而是会继续挂载。

即先挂载kubelet给加的volume,后挂载image.config.volumesimage.config.volumes不会覆盖掉kubeletvolume

如需要将其使用 PVC 覆盖目录,必须手工指定 PVC 的挂载点与其同地址,即将volumeMounts中的mountPath/var/lib/postgresql调整为/var/lib/postgresql/data

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgresql-deployment
spec:
  selector:
    matchLabels:
      app: postgresql
  template:
    metadata:
      labels:
        app: postgresql
    spec:
      containers:
      - image: postgres:12.4
        name: postgresql
        env:
        - name: POSTGRES_PASSWORD
          value: "123456"
        ports:
        - containerPort: 5432
          name: postgresql
        volumeMounts:
        - name: postgresql-persistent-storage
          mountPath: /var/lib/postgresql/data
      volumes:
      - name: postgresql-persistent-storage
        persistentVolumeClaim:
          claimName: postgresql-persistent-storage

新建测试文件,并删除 Pod 后测试数据写入

以上就是一文解析Kubernetes使用PVC后数据丢失的详细内容,更多关于Kubernetes PVC后数据丢失的资料请关注我们其它相关文章!

(0)

相关推荐

  • Kubernetes上使用Jaeger分布式追踪基础设施详解

    目录 正文 微服务架构中的可观察性 分布式追踪 Jaeger组件 架构图 Jaeger客户端 Jaeger代理 Jaeger SideCar 代理 Jaeger Daemonset 代理 Jaeger Collector 服务 Jaeger Query 查询服务 Storage Configuration 存储配置 监控 正文 作为分布式系统(或任何系统)的一个组成部分,监测基础设施的重要性怎么强调都不过分.监控不仅要跟踪二进制的 "上升 "和 "下降 "模式,还要

  • IoT 边缘集群Kubernetes Events告警通知进一步配置详解

    目录 目标 配置 告警内容显示资源名称 屏蔽特定的节点和工作负载 最终效果 目标 上一篇文章 IoT 边缘集群基于 Kubernetes Events 的告警通知实现 告警恢复通知 - 经过评估无法实现 原因: 告警和恢复是单独完全不相关的事件, 告警是 Warning 级别, 恢复是 Normal 级别, 要开启恢复, 就会导致所有 Normal Events 都会被发送, 这个数量是很恐怖的; 而且, 除非特别有经验和耐心, 否则无法看出哪条 Normal 对应的是 告警的恢复. 未恢复进行

  • Kubernetes Ingress实现细粒度IP访问控制

    目录 业务场景 业务场景 有这么一个业务场景:业务平台还是通过Kubernetes进行编排对外提供服务.然后其后台管理部分,出于安全的考虑,只允许特定的IP才能访问.如何实现? 目前,我们的网络架构是 SLB + Nginx Ingress + Ingress + Service + Pod的模式.其中,SLB使用的是阿里云的负载均衡SaaS服务,使用的是7层负载,支持一个SLB实例+多个域名的转发模式,如下图所示. 阿里云SLB可以通过设定黑/白名单的方式进行访问控制,但是该访问控制会进行”一

  • Kubernetes如何限制不同团队只能访问各自namespace实现

    目录 场景说明 1 | 实现思路 2 | 实现的脚本 3 | 使用方式 场景说明 假设有这么一个场景:一个 Kubernetes 集群,有多个 namespace,然后每个 namespace 由一个工程团队去使用,不同的工程团队之间无法访问和操作其他团队的 namespace 下的资源,实现资源和权限隔离的目的. 1 | 实现思路 可以利用 Kubernetes 的 RBAC 来实现: 在各自的 namespace 下创建一个 ServiceAccount 在这个 namespace 下创建一

  • 详解Kubernetes 中容器跨主机网络

    目录 前言 什么是 Flannel Flannel 的后端实现有哪些 UDP VXLAN Host-gw 基于 Flannel UDP 模式的实现跨主通信 UDP 模式案例实现 基于 Flannel VXLAN 模式的跨主通信 VXLAN 模式案例实现 总结 前言 在云原生领域,Kubernetes 已经成为了最主流的容器管理工具.Kubernetes 支持将容器部署到多个节点(即主机)上,因此必须解决容器间跨主机通信的问题. 本文将详细介绍 Kubernetes 中容器跨主机网络的实现原理和方

  • 一文解析Apache Avro数据

    摘要:本文将演示如果序列化生成avro数据,并使用FlinkSQL进行解析.  Avro官方文档所写,http://avro.apache.org/docs/current/index.html. Avro简介 avro是一个数据序列化系统 提供了: 丰富的数据结构 紧凑的,快速的,二进制的数据格式 一种文件格式,用于存储持久化数据 远程过程调用系统(RPC) 和动态语言的简单交互.并不需要为数据文件读写产生代码,也不需要使用或实现RPC协议.代码生成是一种优化方式,但是只对于静态语言有意义.

  • 一文解析Apache Avro数据

    摘要:本文将演示如果序列化生成avro数据,并使用FlinkSQL进行解析. Avro官方文档所写,http://avro.apache.org/docs/current/index.html. Avro简介 avro是一个数据序列化系统 提供了: 丰富的数据结构 紧凑的,快速的,二进制的数据格式 一种文件格式,用于存储持久化数据 远程过程调用系统(RPC) 和动态语言的简单交互.并不需要为数据文件读写产生代码,也不需要使用或实现RPC协议.代码生成是一种优化方式,但是只对于静态语言有意义. 技

  • 一文解析Java中的方法重写

    目录 1.含义 2.为什么要使用方法重写 3.如何使用方法重写 3.1 基本语法 3.2 具体分析 3.3 方法重写的一些小技巧 1.含义 子类继承父类后,可以在子类中书写一个与父类同名同参的方法,从而实现对父类中同名同参数的方法的覆盖,我们把这一过程叫做方法的重写(override) 2.为什么要使用方法重写 2.1 当父类的方法满足不了子类的需求的时候,需要在子类中对该方法进行重写 2.2 题目与分析 例如存在一个父类Peple,子类Chinese,父类中有一个say()方法,输出人在说话,

  • 一文解析 Golang sync.Once 用法及原理

    目录 前言 1. 定位 2. 对外接口 3. 实战用法 3.1 初始化 3.2 单例模式 3.3 关闭channel 4. 原理 5. 避坑 前言 在此前一篇文章中我们了解了 Golang Mutex 原理解析,今天来看一个官方给出的 Mutex 应用场景:sync.Once. 1. 定位 Once is an object that will perform exactly one action. sync.Once 是 Go 标准库提供的使函数只执行一次的实现,常应用于单例模式,例如初始化配

  • JS中利用localStorage防止页面动态添加数据刷新后数据丢失

    非常不多说了,直接给大家贴代码了,具体代码如下所示: <!doctype html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,use

  • jQuery实现在HTML文档加载完毕后自动执行某个事件的方法

    本文实例讲述了jQuery实现在HTML文档加载完毕后自动执行某个事件的方法.分享给大家供大家参考,具体如下: 原来onchange="fucntionname(parms)": <select name="country" id="selCountries_{$sn}" onchange="region.changed(this, 1, 'selProvinces_{$sn}')" style="border

  • vuex刷新后数据丢失的解决方法

    导语: 我们在写vue项目的时候,经常要用到vuex作为内存来储存,但是我们存放在vuex中的数据(用户数据,当前页面的数据等等)在刷新后就会丢失,那么如何解决呢?超级简单. 1,安装vuex-persistedstate npm install --save vuex-persistedstate 2,修改store import createPersistedState from 'vuex-persistedstate' const store = new Vuex.Store({ sta

  • 一文解析ORACLE树结构查询

    我们在日常程序设计中,经常会遇到树状结构的表示,例如组织机构.行政区划等等.这些在数据库中往往通过一张表进行展示.这里我们以一张简单的行政区划表为例进行展示,在实际使用过程中,可以为其添加其他描述字段以及层级. 表中通过ID和PID关联,实现树状结构的存储.建表以及数据语句如下: -- Create table create table TREETEST ( id NVARCHAR2(50), pid NVARCHAR2(50), name NVARCHAR2(50) ) insert into

  • vuex页面刷新后数据丢失的方法

    1. 原因 (1)js代码是运行在内存中的,代码运行时的所有变量.函数都是保存在内存中. (2)刷新页面,以前申请的内存被释放,重新加载脚本代码,变量要重新赋值. (3)要想刷新后数据不丢失就必须把数据存储在外部,例如:Local Storage.Session Storage.Index DB等.这些都是浏览器提供的API,让你可以将数据存储在硬盘上,做持久化存储. 2. HTML5提供的2种客户端存储数据的新方法 localStorage存储数据: (1)存储的数据是永久性的,永不过期: (

  • 一文解析MySQL的MVCC实现原理

    目录 1. 什么是MVCC 2. 事务的隔离级别 3. Undo Log(回滚日志) 4. MVCC的实现原理 4.1 当前读和快照读 4.2 隐藏字段 4.3 版本链 4.4 Read View(读视图) 5. 不同隔离级别下可见性分析 5.1 READ COMMITTED(读已提交) 5.2 REPEATABLE READ(可重复读) 1. 什么是MVCC MVCC全称是Multi-Version Concurrency Control(多版本并发控制),是一种并发控制的方法,通过维护一个数

随机推荐