我有一个kubernetes集群运行一个应用程序。集群的一部分是postgresql,目前正在运行10.4版本。不幸的是,我发现我需要升级postgresql版本。
postgres yaml如下:
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
,则会得到一个错误:
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。对吗?
发布于 2020-11-16 14:47:48
我尝试了@Justin方法,但遇到了一个问题,无法停止当前在pod中运行postgres进程(由于某种原因,容器内无法访问postgresql服务。你可以看到更多关于这个问题的here)
由于我无法升级postgresql在吊舱内的具体功能,我最后所做的就是在Kubernetes中创建一个并行postgres吊舱,它保存了新版本。然后,我从旧服务器转储数据库,将其复制到新服务器,并使用它初始化数据库。
以下是一个接一个的步骤:
创建并行postgres服务
旧版中的
pg_dumpall -U postgresadmin -h localhost -p 5432 > dumpall.sql
主机中的
kubectl cp postgres-old-pod:/dumpall.sql dumpall.sql
kubectl cp dumpall.sql postgres2-new-pod:/dumpall.sql
我需要的
psql postgresql://postgresadmin:pass1234@127.0.0.1:5432/postgresdb?sslmode=disable
postgresdb=# CREATE ROLE postgres LOGIN SUPERUSER PASSWORD 'somepassword123';
然后退出postgres并退出到普通用户
psql -U postgres -W -f dumpall.sql
发布于 2020-11-16 05:24:36
使用这个How to upgrade postgresql database from 10 to 12 without losing data for openproject作为我的帖子的基础。我正在把它转换成一种体积友好的容器方法。我假设您正在使用Docker上的官方Postgresql映像。
中获取一个shell
# insert your pod and namespace here
kubectl exec -it postgresl-shsdjkfshd -n default /bin/sh
在容器中运行以下命令
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
下一段是从链接的帖子中逐字摘录:
vim /etc/postgresql/12/main/postgresql.conf
#change port to 5432
vim /etc/postgresql/10/main/postgresql.conf
#change port to 5433
service postgresql start
su postgres
psql -c "SELECT version();"
./analyze_new_cluster.sh
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
。
发布于 2022-08-19 17:26:16
感谢@justadev的回答。增加一些内容:
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
不能工作。
以下是解决办法:
kubectl exec -n ${namespace} ${postgresql_pod} -- cat db_dump.sql > db_dump.sql
cat db_dump.sql | kubectl exec -i -n ${namespace} ${postgresql_pod} "--" sh -c "cat > db_dump.sql"
https://stackoverflow.com/questions/64850625
复制相似问题