Kubernetes环境PostgreSQL部署与应用

发布于2022-09-11,最后编辑于2024-03-22,全文约1082字,阅读时间约3分钟。

Kubernetes Helm Database PostgreSQL Bitnami

更新记录
  • 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

概述

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

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

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

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

组件版本

配置过程

安装PostgreSQL

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

  • 添加Helm仓库

    1helm repo add bitnami https://charts.bitnami.com/bitnami
    2helm repo update
    
  • 创建命名空间

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

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

     1# architecture=standalone                      部署架构(本文演练环境中使用独立架构)
     2# auth.existingSecret=postgresql-secret        包含密码的Secret对象名称
     3# primary.persistence.enabled=true             启用持久卷
     4# primary.persistence.size=8Gi                 持久化卷大小
     5# primary.persistence.storageClass=local-path  存储类名称
     6# primary.service.type=LoadBalancer            服务类型(本文演练环境中使用`LoadBalancer`访问PostgreSQL服务)
     7helm upgrade --install --namespace data-postgresql \
     8  --set architecture=standalone \
     9  --set auth.existingSecret=postgresql-secret \
    10  --set primary.persistence.enabled=true \
    11  --set primary.persistence.size=8Gi \
    12  --set primary.persistence.storageClass=local-path \
    13  --set primary.service.type=LoadBalancer \
    14  postgresql bitnami/postgresql
    

访问PostgreSQL

  • 集群外部访问PostgreSQL服务

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

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

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

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

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

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

     1-- 创建一个示例数据库
     2CREATE DATABASE demo;
     3
     4-- \l       列出所有数据库
     5-- \c demo  切换到`demo`数据库
     6
     7-- 创建一张示例表`users`
     8CREATE TABLE public.users (id int8 NOT NULL, username varchar(128) NOT NULL, PRIMARY KEY (id));
     9
    10-- 向`users`表中插入示例数据
    11INSERT INTO public.users (id, username) VALUES(1, 'galen.suen');
    12
    13-- 查询上一步中插入的数据
    14SELECT id, username FROM public.users WHERE id = 1;
    15
    16-- 删除`users`表中的示例数据
    17DELETE FROM public.users WHERE id = 1;
    18
    19-- 删除示例表`users`
    20DROP TABLE public.users;
    21
    22-- \c postgres  切换到`postgres`数据库
    23
    24-- 删除示例数据库
    25DROP DATABASE demo WITH (FORCE);
    

参考资料