Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >kubernetes timescaledb statefulset: pod重新创建时丢失的更改

kubernetes timescaledb statefulset: pod重新创建时丢失的更改
EN

Stack Overflow用户
提问于 2019-07-22 06:21:04
回答 1查看 726关注 0票数 1

我有一个时间升级的服务器作为StatefulSet在AKS运行。当我删除并重新创建timescaledb pod时,即使该pod与初始关联的PV (持久卷)相关联,更改也会丢失。任何帮助都是非常感谢的。

下面是通过运行kubectl get statefulset timescaledb -o yaml提取的statefulset的PV、PVC配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: timescaledb
    spec:
      containers:
      - args:
        - -c
        - config_file=/etc/postgresql/postgresql.conf
        env:
        - name: POSTGRES_PASSWORD
          valueFrom:
            secretKeyRef:
              key: password
              name: timescaledb-secret
        image: docker.io/timescale/timescaledb:latest-pg9.6
        name: timescaledb-backend
        ports:
        - containerPort: 5432
          name: server
          protocol: TCP
        resources:
          requests:
            cpu: "3"
            memory: 6Gi
        volumeMounts:
        - mountPath: /var/lib/postgresql
          name: timescaledbdata
        - mountPath: /etc/postgresql
          name: timescaledb-config
      volumes:
      - configMap:
          defaultMode: 420
          name: timescaledb-config
        name: timescaledb-config
  volumeClaimTemplates:
  - metadata:
      annotations:
        volume.alpha.kubernetes.io/storage-class: standard
      creationTimestamp: null
      name: timescaledbdata
    spec:
      accessModes:
      - ReadWriteOnce
      dataSource: null
      resources:
        requests:
          storage: 200Gi
    status:
      phase: Pending

下面演示了创建的临时数据库test_db在pod重新创建后丢失,在整个过程中,pod与Azure上的相同PV/磁盘相关联。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root@e70a91715239:~/keys# k get pvc -l app=timescaledb
NAME                            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
timescaledbdata-timescaledb-0   Bound    pvc-c7eb99cf-6a6b-11e9-b661-be660567cc75   200Gi      RWO            default        83d

root@e70a91715239:~/keys# k exec -ti timescaledb-0 bash
bash-4.4# psql -U postgres;
psql (9.6.13)
Type "help" for help.

postgres=# create database test_db;
CREATE DATABASE
postgres=# \l
                                 List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges   
-----------+----------+----------+------------+------------+-----------------------
 postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
 template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 test_db   | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
(4 rows)


root@e70a91715239:~/keys# k get pods | grep timescale
timescaledb-0                         1/1     Running   0          12m
root@e70a91715239:~/keys# k delete pod/timescaledb-0                            
pod "timescaledb-0" deleted                                                                                                                                         
root@e70a91715239:~/keys# k get pods | grep timescale       
timescaledb-0                         1/1     Running   0          14s   

root@e70a91715239:~/keys# k exec -ti timescaledb-0 bash                                                                                                             
bash-4.4# psql -U postgres
psql (9.6.13)
Type "help" for help.

postgres=# \l
                                 List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges                                                                                    
-----------+----------+----------+------------+------------+-----------------------                                                                                 
 postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +                                                                                 
           |          |          |            |            | postgres=CTc/postgres                                                                                  
 template1 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +                                                                                 
           |          |          |            |            | postgres=CTc/postgres                                                                                  
(3 rows)

root@e70a91715239:~/keys# k get pvc -l app=timescaledb
NAME                            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
timescaledbdata-timescaledb-0   Bound    pvc-c7eb99cf-6a6b-11e9-b661-be660567cc75   200Gi      RWO            default        83d

它可能正在按照提示重新初始化。请参阅logs。任何关于它为什么会这样做的提示。

更新1:我查看了timescale pod中的挂载,它似乎对/var/lib/postgresql/var/lib/postgresql/data有不同的分区。我不明白为什么。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Filesystem                Size      Used Available Use% Mounted on
overlay                  96.9G     22.1G     74.8G  23% /
tmpfs                    64.0M         0     64.0M   0% /dev
tmpfs                     7.8G         0      7.8G   0% /sys/fs/cgroup
/dev/sda1                96.9G     22.1G     74.8G  23% /docker-entrypoint-initdb.d
/dev/sda1                96.9G     22.1G     74.8G  23% /dev/termination-log
shm                      64.0M      4.0K     64.0M   0% /dev/shm
/dev/sda1                96.9G     22.1G     74.8G  23% /etc/resolv.conf
/dev/sda1                96.9G     22.1G     74.8G  23% /etc/hostname
/dev/sda1                96.9G     22.1G     74.8G  23% /etc/hosts
/dev/sdc                196.7G     59.3M    196.7G   0% /var/lib/postgresql
/dev/sda1                96.9G     22.1G     74.8G  23% /var/lib/postgresql/data 

对于下面的配置,我不了解上面的挂载是如何发生的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        volumeMounts:
        - mountPath: /var/lib/postgresql
          name: timescaledbdata
        - mountPath: /etc/postgresql
          name: timescaledb-config
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-26 13:05:37

问题是在postgres:9.6 Dockerfile文件中有一个/var/lib/postgresql/data的卷声明,这导致在容器上进行额外的挂载。当我们在/var/lib/postgresql挂载卷时,这种挂载是短暂的。但是我们无法将lost+found卷挂载到/var/lib/postgresql/data,因为该卷附带了AKS子目录,而Postgres期望空目录来存储DB文件。

修复方法是在/var/lib/postgresql/data挂载卷,并告诉Postgres在/var/lib/postgresql/data下使用一个子目录来存储带有PGDATA环境变量的文件。

下面是k8s状态集配置中fix的相关部分

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
env:
- name: PGDATA
  value: "/var/lib/postgresql/data/dbfiles"        
...
volumeMounts:
- mountPath: /var/lib/postgresql/data
  name: timescaledata
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57140161

复制
相关文章
Statefulset创建pod慢
线上kubernetes集群从创建sts到创建pod需要时间很长,分钟级别,但是调度却很快。偶尔还会出现导致kube-odin任务失败(超过300s)的情况
李鹤
2023/03/28
3990
Statefulset创建pod慢
StatefulSet-创建和删除Pod的过程
StatefulSet是Kubernetes中一种有状态应用程序的控制器,用于管理一组有序的、命名的Pod。相比于Deployment,StatefulSet更适用于有状态应用程序的场景,因为它可以确保Pod的有序启动和删除,以及Pod的唯一标识符的稳定性。
玖叁叁
2023/04/30
6730
StatefulSet-创建和删除Pod的过程示例
下面是一个简单的StatefulSet示例,用于创建一个包含3个nginx Pod的有状态应用程序:
玖叁叁
2023/04/30
3940
Longhorn,企业级云原生容器分布式存储 - 高可用
数据局部性设置(data locality setting)旨在在以下情况下启用:只要有可能,至少应在与使用该卷的 pod 相同的节点上调度 Longhorn 卷的一个副本。我们将拥有本地副本的特性称为具有 data locality。
为少
2021/09/17
2K0
kubernetes的StatefulSet介绍
在Kubernetes中,Deployment资源对象通常用于管理无状态应用程序,例如Web服务器。但是,对于有状态应用程序,例如数据库,需要一些特殊的考虑。这是因为有状态应用程序需要保持它们的标识和状态,以便它们可以在重启或迁移后正确运行。
堕落飞鸟
2023/04/01
7270
【TKE】Kubernetes中pod的创建流程
一般我们在创建pod的过程中都是,执行kubectl命令去apply对应的yaml文件,但是在执行这个操作的过程到pod被完成创建,k8s的组件都做了哪些操作呢?下面我们简要说说pod被创建的过程。
聂伟星
2020/11/18
11.1K5
基础设施即代码(IAC),Zalando Postgres Operator 简介
Postgres Operator 在由 Patroni 提供支持的 Kubernetes (K8s) 上提供易于运行的高可用性 PostgreSQL 集群。它仅通过 Postgres 清单 (CRD) 进行配置,以轻松集成到自动化 CI/CD 管道中,而无需直接访问 Kubernetes API,从而促进基础设施即代码(infrastructure as code)而不是手动操作。
为少
2022/05/17
1.1K0
基础设施即代码(IAC),Zalando Postgres Operator 简介
一个集群被删的故事
原文: https://thenewstack.io/deleting-production-in-a-few-easy-steps-and-how-to-fix-it/
我的小碗汤
2023/03/19
5730
一个集群被删的故事
kubernetes之StatefulSet
k8s的statefulset在1.5之后才引入的,1.5之前用的是petset,关于petset在之前的老版本的paas开发中用的就是petset,petset和statefulset都是为啦解决容器的有状态服务。 statefulset有状态应用副本集 PetSet -> StatefulSet 1.文档且唯一的网络标识符 2.稳定且持久的存储 3.有序,平滑的部署和扩展 4.有序,平滑的删除和终止 5.有序的滚动更新 三个组件: headless service StatefulSet volumeClaimTemplate
菲宇
2019/06/12
8990
Kubernetes-Pod的重新平衡和碎片整理
默认情况下,Kubernetes不会重新计算和重新平衡工作负载。 您可能会遇到一些节点过度利用的集群,而其他节点只有少量的Pod。 您可以如何解决这个问题呢?
DevOps云学堂
2023/10/07
7040
Kubernetes-Pod的重新平衡和碎片整理
Running Solr on Kubernetes
我们将为搜索工程师介绍在Kubernetes(k8s)上运行Solr的基础知识。 具体来说,我们涵盖以下主题:
黎明你好
2020/02/05
6.3K0
Running Solr on Kubernetes
【重识云原生】第六章容器基础6.4.10.4节——StatefulSet实操案例-使用 StatefulSet 部署Cassandra
本教程描述了如何在 Kubernetes 上运行 Apache Cassandra。 数据库 Cassandra 需要永久性存储提供数据持久性(应用状态)。 在此示例中,自定义 Cassandra seed provider 使数据库在接入 Cassandra 集群时能够发现新的 Cassandra 实例。
江中散人_Jun
2022/11/14
1K0
Kubernetes StatefulSet 实现原理
其中无状态服务在我们前面文章中使用的Deployment编排对象已经可以满足,因为无状态的应用不需要很多要求,只要保持服务正常运行就可以,Deployment删除掉任意中的Pod也不会影响服务的正常,但面对相对复杂的应用,比如有依赖关系或者需要存储数据,Deployment就无法满足条件了,Kubernetes项目也提供了另一个编排对象StatefulSet。
胡齐
2020/07/10
1.1K0
细说 kubernetes - 初识 statefulset
最近遇到一个问题:statefulset 部署能否只是升级部分的 pod?问题本身不难,但我发现没有说过有关 statefulset 的介绍,于是本文将介绍一些有关 statefulset 的点。 问题的答案则放在文章的最后,这也是 statefulset 一个很有用的特性。
LinkinStar
2022/11/03
5160
如何更安全的升级Kubernetes节点
您是否害怕将集群升级到更新的 Kubernetes 版本?有几个原因可能会促使您升级。也许您想要执行以下操作之一:
用户5166556
2023/03/18
7030
如何更安全的升级Kubernetes节点
Kubernetes中StatefulSet介绍
使用Kubernetes来调度无状态的应用非常简单,那Kubernetes如何来管理调度有状态的应用呢?Kubernetes中提供了一个StatefulSet控制器来管理有状态的应用,本文就介绍StatefulSet的应用,解决以下几个问题:
大江小浪
2018/08/10
1.8K0
【重识云原生】第六章容器基础6.4.10.5节——Statefulset原理剖析
首先,StatefulSet 的控制器直接管理的是 Pod。这是因为,StatefulSet 里的不同 Pod 实例,不再像 ReplicaSet 中那样都是完全一样的,而是有了细微区别的。比如,每个 Pod 的 hostname、名字等都是不同的、携带了编号的。而 StatefulSet 区分这些实例的方式,就是通过在 Pod 的名字里加上事先约定好的编号。
江中散人_Jun
2022/11/11
6650
【重识云原生】第六章容器基础6.4.10.5节——Statefulset原理剖析
kubernetes-StatefulSet介绍
Kubernetes是一个流行的容器编排平台,它可以轻松地部署和管理容器化应用程序。其中一种类型的控制器是StatefulSet,它可以管理有状态的应用程序。
玖叁叁
2023/04/30
2980
原 荐 浅析Kubernetes State
StatefulSet和Deployment的区别 “Deployment用于部署无状态服务,StatefulSet用来部署有状态服务”。 具体的,什么场景需要使用StatefulSet呢?官方给出的建议是,如果你部署的应用满足以下一个或多个部署需求,则建议使用StatefulSet。 稳定的、唯一的网络标识。 稳定的、持久的存储。 有序的、优雅的部署和伸缩。 有序的、优雅的删除和停止。 有序的、自动的滚动更新。 稳定的主要是针对Pod发生re-schedule后仍然要保持之前的网络标识和持久化存储。这里
Walton
2018/04/16
1.6K0
K8s节点故障:资源控制器会触发哪些动作
定义:在Kubernetes中,不可达节点被称为分区节点partitioned node,为了了解操作方法,让我们创建一个分区节点方案并了解其行为。
公众号: 云原生生态圈
2020/11/10
2.3K0
K8s节点故障:资源控制器会触发哪些动作

相似问题

Kubernetes StatefulSet pod启动错误恢复

131

Kubernetes:仅公开StatefulSet的单个pod

24

Kubernetes在Minikube重启StatefulSet的pod,“需要杀死pod”

12

通过入口访问所有kubernetes statefulset pod

146

Kubernetes pod在删除时重新创建

16359
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文