Kubernetes环境PostgreSQL部署与应用

发布于,最后编辑于。全文约1015字,阅读时间约为3分钟。

KubernetesHelm数据库PostgreSQLBitnami
更新记录
  • 2022-09-17

    • PostgreSQL Helm Chart by Bitnami版本由v11.8.1更新至v11.8.2;

  • 2022-10-14

    • PostgreSQL Helm Chart by Bitnami版本由v11.8.2更新至v11.9.8;

  • 2022-10-20

    • PostgreSQL Helm Chart by Bitnami版本由v11.9.8更新至v11.9.11;

  • 2022-11-13

    • PostgreSQL Helm Chart by Bitnami版本由v11.9.11更新至v11.9.13;

  • 2023-06-07

    • PostgreSQL版本由v14.5.0更新至v15.3.0;

    • PostgreSQL Helm Chart by Bitnami版本由v11.9.13更新至v12.5.6;

  • 2023-07-24

    • PostgreSQL Helm Chart by Bitnami版本由v12.5.6更新至v12.6.8;

  • 2023-08-08

    • PostgreSQL Helm Chart by Bitnami版本由v12.6.8更新至v12.8.0;

  • 2023-08-17

    • PostgreSQL版本由v15.3.0更新至v15.4.0;

    • PostgreSQL Helm Chart by Bitnami版本由v12.8.0更新至v12.8.2;

  • 2023-09-01

    • PostgreSQL Helm Chart by Bitnami版本由v12.8.2更新至v12.10.0;

  • 2024-01-01

    • PostgreSQL版本由v15.4.0更新至v16.1.0;

    • PostgreSQL Helm Chart by Bitnami版本由v12.10.0更新至v13.2.27;

  • 2024-03-31

    • PostgreSQL版本由v16.1.0更新至v16.2.0;

    • PostgreSQL Helm Chart by Bitnami版本由v13.2.27更新至v15.1.4;

  • 2024-08-27

    • PostgreSQL版本由v16.2.0更新至v16.4.0;

    • PostgreSQL Helm Chart by Bitnami版本由v15.1.4更新至v15.5.24;

  • 2024-09-30

    • PostgreSQL Helm Chart by Bitnami版本由v15.5.24更新至v15.5.36;

  • 2025-05-01

    • PostgreSQL版本由v16.4.0更新至v17.4.0;

    • PostgreSQL Helm Chart by Bitnami版本由v15.5.36更新至v16.6.6;

  • 2026-08-23

    • PostgreSQL版本由v17.4.0更新至v18.6.0;

    • PostgreSQL Helm Chart by Bitnami版本由v16.6.6更新至v17.1.0;其发布的appVersion仍为v17.6.0,因此部署时使用18.6.0-debian-12-r3镜像覆盖;

    • 补充Bitnami Secure Image镜像仓库要求,以及PostgreSQL 17升级至18时必须执行逻辑备份与恢复的边界说明;

概述

本文用于整理基于Kubernetes环境的PostgreSQL部署与应用,作为后续演练项目的前置环境准备。

随着各相关组件版本的更新,笔者将在验证通过后对本文进行补充和更新,请参考更新记录。

本次演练环境为Kubernetes集群环境,环境配置可参考笔者另一篇笔记《Kubernetes集群部署笔记》。

注意:本文部署的PostgreSQL实例仅用于演练环境,不可用于生产环境。

组件版本

本文通过覆盖Bitnami chart 17.1.0的镜像使用PostgreSQL 18.6;该chart发布的appVersion仍为17.6.0。18.6.0-debian-12-r3属于Bitnami Secure Image,需要具备授权并完成认证的镜像仓库;本次18.x部署不使用bitnamilegacy归档仓库。

PostgreSQL 17升级至18属于大版本升级,不要将已有的17.x PVC直接挂载到18.x Pod。应先执行逻辑备份,再部署全新的18.x数据目录并恢复备份,验证完成后再切换客户端。请参考PostgreSQL的升级文档。

配置过程

安装PostgreSQL

本次演练中将PostgreSQL安装至data-postgresql命名空间,可根据需要替换。

  • 创建命名空间

    kubectl create namespace data-postgresql
  • 创建密码配置文件

    # 创建一个Secret对象,其中`postgres-password`的值将被设置为`postgres`用户的密码
    kubectl create secret --namespace data-postgresql generic postgresql-secret \
      --from-literal=postgres-password=jSTugla950BMlUFuqgXeKWg0
    
    # 或者可以按指定的规则随机生成密码,例如:
    kubectl create secret --namespace data-postgresql generic postgresql-secret \
      --from-literal=postgres-password=$(openssl rand -base64 18)
  • 安装PostgreSQL

    # architecture=standalone                      部署架构(本文演练环境中使用独立架构)
    # auth.existingSecret=postgresql-secret        包含密码的Secret对象名称
    # primary.persistence.enabled=true             启用持久卷
    # primary.persistence.size=8Gi                 持久化卷大小
    # primary.persistence.storageClass=local-path  存储类名称
    # primary.service.type=LoadBalancer            服务类型(本文演练环境中使用`LoadBalancer`访问PostgreSQL服务)
    # image.repository=bitnami/postgresql          Bitnami Secure Image镜像仓库(需要具备访问权限)
    # image.tag=18.6.0-debian-12-r3                PostgreSQL 18.6镜像构建版本
    # image.pullSecrets[0]=postgresql-image-pull   镜像仓库要求认证时设置
    # global.security.allowInsecureImages=true     覆盖chart镜像时需要启用
    helm upgrade --install --namespace data-postgresql \
      --set architecture=standalone \
      --set auth.existingSecret=postgresql-secret \
      --set image.repository=bitnami/postgresql \
      --set image.tag=18.6.0-debian-12-r3 \
      --set global.security.allowInsecureImages=true \
      --set primary.persistence.enabled=true \
      --set primary.persistence.size=8Gi \
      --set primary.persistence.storageClass=local-path \
      --set primary.service.type=LoadBalancer \
      postgresql oci://registry-1.docker.io/bitnamicharts/postgresql --version 17.1.0

访问PostgreSQL

  • 集群外部访问PostgreSQL服务

    # --watch  等待集群分配LoadBalancer地址
    kubectl get svc --namespace data-postgresql --watch postgresql

    上面的命令会输出类似下面的内容。

    NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    postgresql   LoadBalancer   10.108.10.147   10.0.0.203    5432:30823/TCP   35s
  • 使用psql工具访问PostgreSQL服务

    获取postgres用户的密码,并打开一个psql命令行界面。

    # 获取`postgres`用户的密码,保存在变量`POSTGRES_PASSWORD`中
    export POSTGRES_PASSWORD=$(kubectl get secret --namespace data-postgresql postgresql-secret -o jsonpath="{.data.postgres-password}" | base64 -d)
    
    # 打开一个`psql`命令行界面
    kubectl run postgresql-client --rm -it --restart Never --namespace data-postgresql \
      --image docker.io/bitnami/postgresql:18.6.0-debian-12-r3 \
      --env "PGPASSWORD=$POSTGRES_PASSWORD" \
      --command -- psql --host postgresql -U postgres -d postgres -p 5432
    # If you don't see a command prompt, try pressing enter.
    # 如果没有看到命令提示符,请尝试按回车键。

    执行以下的命令,验证PostgreSQL服务可用。

    -- 创建一个示例数据库
    CREATE DATABASE demo;
    
    -- \l       列出所有数据库
    -- \c demo  切换到`demo`数据库
    
    -- 创建一张示例表`users`
    CREATE TABLE public.users (id int8 NOT NULL, username varchar(128) NOT NULL, PRIMARY KEY (id));
    
    -- 向`users`表中插入示例数据
    INSERT INTO public.users (id, username) VALUES(1, 'galen.suen');
    
    -- 查询上一步中插入的数据
    SELECT id, username FROM public.users WHERE id = 1;
    
    -- 删除`users`表中的示例数据
    DELETE FROM public.users WHERE id = 1;
    
    -- 删除示例表`users`
    DROP TABLE public.users;
    
    -- \c postgres  切换到`postgres`数据库
    
    -- 删除示例数据库
    DROP DATABASE demo WITH (FORCE);

参考资料