首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何升级Kubernetes吊舱内的postgresql?

如何升级Kubernetes吊舱内的postgresql?
EN

Stack Overflow用户
提问于 2020-11-15 22:53:23
回答 3查看 3.2K关注 0票数 2

我有一个kubernetes集群运行一个应用程序。集群的一部分是postgresql,目前正在运行10.4版本。不幸的是,我发现我需要升级postgresql版本。

postgres yaml如下:

代码语言:javascript
运行
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgres
          image: postgres:10.4
          imagePullPolicy: "IfNotPresent"
          ports:
            - containerPort: 5432
          envFrom:
            - configMapRef:
                name: postgres-config
          volumeMounts:
            - mountPath: /var/lib/postgresql/data
              name: postgredb
      volumes:
        - name: postgredb
          persistentVolumeClaim:
            claimName: postgres-pv-claim

postgresql数据库中已经有一些数据。我需要找到一种在生产中升级集群的方法。

如果我只是尝试将图像更改为12.0并运行kubectl apply,则会得到一个错误:

代码语言:javascript
运行
复制
2020-11-15 22:48:08.332 UTC [1] DETAIL:  The data directory was initialized by PostgreSQL version 10, which is not compatible with this version 12.5 (Debian 12.5-1.pgdg100+1).

因此,我理解需要手动升级集群内的postgres数据库,只有这样,我才能修复yaml。对吗?

EN

回答 3

Stack Overflow用户

发布于 2020-11-16 14:47:48

我尝试了@Justin方法,但遇到了一个问题,无法停止当前在pod中运行postgres进程(由于某种原因,容器内无法访问postgresql服务。你可以看到更多关于这个问题的here)

由于我无法升级postgresql在吊舱内的具体功能,我最后所做的就是在Kubernetes中创建一个并行postgres吊舱,它保存了新版本。然后,我从旧服务器转储数据库,将其复制到新服务器,并使用它初始化数据库。

以下是一个接一个的步骤:

  1. 使用新版本的

创建并行postgres服务

旧版中的

代码语言:javascript
运行
复制
pg_dumpall -U postgresadmin -h localhost -p 5432 > dumpall.sql

主机中的

代码语言:javascript
运行
复制
kubectl cp postgres-old-pod:/dumpall.sql dumpall.sql
kubectl cp dumpall.sql postgres2-new-pod:/dumpall.sql

  1. ssh至新荚

我需要的

  1. 额外步骤,因为由于某种原因,新pod没有创建“postgres”用户:使用您的进入postgres客户端

代码语言:javascript
运行
复制
psql postgresql://postgresadmin:pass1234@127.0.0.1:5432/postgresdb?sslmode=disable
postgresdb=# CREATE ROLE postgres LOGIN SUPERUSER PASSWORD 'somepassword123';

然后退出postgres并退出到普通用户

  1. 最后更新数据库:

代码语言:javascript
运行
复制
psql -U postgres -W -f dumpall.sql
票数 3
EN

Stack Overflow用户

发布于 2020-11-16 05:24:36

使用这个How to upgrade postgresql database from 10 to 12 without losing data for openproject作为我的帖子的基础。我正在把它转换成一种体积友好的容器方法。我假设您正在使用Docker上的官方Postgresql映像。

  1. 备份此答案的范围外的数据。还有其他人更适合回答这个问题。

  1. 从吊舱内部升级postgres并迁移数据在postgres pod

中获取一个shell

代码语言:javascript
运行
复制
# insert your pod and namespace here
kubectl exec -it postgresl-shsdjkfshd -n default /bin/sh 

在容器中运行以下命令

代码语言:javascript
运行
复制
apt update
apt-get install postgresql-12 postgresql-server-dev-12
service postgresql stop
# Migrate the data
su postgres
/usr/lib/postgresql/12/bin/pg_upgrade \
     --old-datadir=/var/lib/postgresql/10/main \
     --new-datadir=/var/lib/postgresql/12/main \
     --old-bindir=/usr/lib/postgresql/10/bin \
     --new-bindir=/usr/lib/postgresql/12/bin \
     --old-options '-c config_file=/etc/postgresql/10/main/postgresql.conf' \
     --new-options '-c config_file=/etc/postgresql/12/main/postgresql.conf'
exit # exits the postgres user

下一段是从链接的帖子中逐字摘录:

  1. 交换旧的和新的postgres版本的端口.

代码语言:javascript
运行
复制
     vim /etc/postgresql/12/main/postgresql.conf
     #change port to 5432
     vim /etc/postgresql/10/main/postgresql.conf
     #change port to 5433

  1. 启动postgresql服务

代码语言:javascript
运行
复制
     service postgresql start

  1. 登录为postgres用户

代码语言:javascript
运行
复制
     su postgres

  1. 检查您的新postgres版本

代码语言:javascript
运行
复制
     psql -c "SELECT version();"

  1. 运行生成的新集群脚本

代码语言:javascript
运行
复制
     ./analyze_new_cluster.sh

  1. 作为普通用户(默认用户)返回,并清理旧版本的混乱

代码语言:javascript
运行
复制
     apt-get remove postgresql-10 postgresql-server-dev-10
     #uninstalls postgres packages
     rm -rf /etc/postgresql/10/
     #removes the old postgresql directory
     su postgres
     #login as postgres user
     ./delete_old_cluster.sh
     #delete the old cluster data

现在将部署YAML映像引用更改为Postgres 12和kubectl apply

  1. 检查日志以确定它是否正确启动。
票数 0
EN

Stack Overflow用户

发布于 2022-08-19 17:26:16

感谢@justadev的回答。增加一些内容:

代码语言:javascript
运行
复制
psql -U postgres -d keycloak -W -f dumpall.sql

我必须添加-d keycloak数据库标志,因为虽然导入期间psql日志没有问题,但之后数据库中的数据丢失了。您需要显式地指示psql的数据库。

所以,检查这里的psql标志:https://www.postgresql.org/docs/current/app-psql.html

顺便说一下,我从Postgres 11升级到Posgres 14.5。

另外,我想补充一句:tar可能不在一个吊舱上,这意味着kubectl cp不能工作。

以下是解决办法:

  1. 将数据从荚复制到本地机器:

代码语言:javascript
运行
复制
kubectl exec -n ${namespace} ${postgresql_pod} -- cat db_dump.sql  > db_dump.sql

  1. 将数据从本地机器复制到pod:

代码语言:javascript
运行
复制
cat db_dump.sql | kubectl exec -i -n ${namespace} ${postgresql_pod} "--" sh -c "cat > db_dump.sql"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64850625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档