在k8s集群中部署postgreSQL数据+pgadmin dashboard管理界面

先决条件

  • Kubernetes 1.23+
  • Helm 3.8.0+

postgreSQL

添加Helm仓库

添加helm仓库信息,并且更新
请注意在写稿的时候broadcom公司收购了bitnami,我也不确定这个镜像能用多久。
详细信息

helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

拉取chart包,有环境的可以使用search搜一个包信息,直接拉取问题也不大

helm pull bitnami/postgresql
    #直接拉取包
helm search repo bitnami/postgresql
    #搜索包信息
helm pull bitnami/postgresql --version 1.49.0
    #下载指定的包信息,截止写稿时这个版本是最新的

执行后会得到下面内容

[root@master ~]# ls
postgresql-16.7.27.tgz
配置

解压包,并且编辑文件

tar -xf postgresql-16.7.27.tgz
    #解压包
cp postgresql/values.yaml postgresql/values-1.yaml
    #复制文件
vim postgresql/values-1.yaml
    #编辑文件,编辑内容见下
global: 
  postgresql:
    auth:
      postgresPassword: "123456"    #配置密码

primary:
  service:
    type: ClusterIP                 #因为待会会使用web界面管理,所以无需设置端口暴露
  persistence:
    size: 15Gi                       #大小,默认是8Gi
    
      #修改完成后保存退出,

创建PV文件,因为这里制作演示且是单节点所以使用hostPath
创建pv-postgreslq.yaml文件

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-postgresql  # PV名称,自定义
  labels:
    type: local
    app: postgresql
spec:
  capacity:
    storage: 15Gi  # 匹配values.yaml中的size
  accessModes:
    - ReadWriteOnce  # 匹配accessMode
  persistentVolumeReclaimPolicy: Retain  # 删除PVC后保留PV
  hostPath:
    path: /var/postgreSQL_data  # 您的本地路径

      #注意这里并没有使用storageClass:
      #如果要使用也请在values-1.yaml文件中编辑primary.persistence.storageClass

文件编辑好后使用kubectl apply -f命令创建资源

kubectl apply -f pv-postgreslq.yaml

使用命令查看

[root@master ~]# kubectl get pv
NAME                   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                    STORAGECLASS    VOLUMEATTRIBUTESCLASS   REASON   AGE
pv-postgresql          15Gi       RWO            Retain           Available                                                        <unset>                          92m

Available表示没有可用,没有被绑定

部署

kubectl create ns postgresql
helm install postgre bitnami/postgresql -n postgresql -f ./values-1.yaml

出现下面结果表示成功

[root@master gitlab]# kubectl get po -n postgresql 
NAME                                READY   STATUS    RESTARTS   AGE
postgre-postgresql-0                1/1     Running   0          96m

pgadmin

pgadmin介绍【废话】

PgAdmin是PostgreSQL最受欢迎的开源图形化管理工具,提供直观的Web和桌面界面,用于数据库的创建、管理、查询及维护,极大提升DBA和开发者的工作效率。

添加仓库

helm repo add runix https://helm.runix.net
helm repo update

拉取chart包,有环境的可以使用search搜一个包信息,直接拉取问题也不大

helm pull runix/pgadmin4
    #直接拉取包
helm search repo runix/pgadmin4
    #搜索包信息
helm pull runix/pgadmin4 --version 1.49.0
    #下载指定的包信息,截止写稿时这个版本是最新的
配置

解压包,并且编辑文件

tar -xf pgadmin4-1.49.0.tgz
    #解压包
cp pgadmin4/values.yaml pgadmin4/values-1.yaml
    #复制文件
vim pgadmin4/values-1.yaml
    #编辑文件,编辑内容见下
---
    #环境变量。用于登入
env: 
  email: admin@aliruanjianyuan.com  #名称随意,用于登入
  password: "123456"                #密码随意,记住就行
    #PV设置用于持久化存储

    # Ingress 配置 - 无 SSL

#service:
#  type: NodePort  # 修改为 NodePort
#  port: 80
#  # nodePort: 30080  # 可以指定固定的 NodePort 端口(可选,范围 30000-32767)

ingress:
  enabled: true
#  enabled: false       #当service.type的值为NodePort的时候enabled: false禁用ingress
  className: "nginx"
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/proxy-body-size: "50m"
  hosts:
    - host: "postgresqladmin.aliruanjianyuan.com" #在浏览器输入的域名
      paths:
        - path: /
          pathType: Prefix

persistentVolume:
  enabled: true
  accessMode: ReadWriteOnce
  size: 10Gi
    # 服务器自动配置
serverDefinitions: 
  enabled: true
  resourceType: ConfigMap
  servers:
    k8s-postgre:            # postgreSQL服务器名称,随意
      Name: "k8s-postgre"   # postgreSQL服务器名称,随意
      Group: "Kubernetes Servers"   # postgreSQL服务器组,随意
      Username: "postgres"  #默认为postgres,超级管理员
      Host: "postgre-postgresql.postgresql.svc.cluster.local"
      Port: 5432            #postgreSQL服务端口默认
      SSLMode: "prefer"     #默认即可
      MaintenanceDB: "postgres" #默认即可

networkPolicy:
  enabled: true

创建PV,同上,使用hostPath,创建kubectl apply -f pv-pgadmin.yaml文件

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-pgadmin  # PV名称,自定义
  labels:
    type: local
    app: postgresql
spec:
  capacity:
    storage: 10Gi  # 匹配values.yaml中的size
  accessModes:
    - ReadWriteOnce  # 匹配accessMode
  persistentVolumeReclaimPolicy: Retain  # 删除PVC后保留PV
  hostPath:
    path: /var/pgadmin_data  # 您的本地路径

      #注意这里并没有使用storageClass:
      #如果要使用也请在values-1.yaml文件中编辑persistentVolume.storageClass

创建资源

kubectl apply -f pv-pgadmin.yaml

部署

使用helm命令部署pgadmin

helm install pgadmin runix/pgadmin4 -n postgresql -f values-1.yaml

查看部署结果

[root@master gitlab]# kubectl get -n postgresql po,ingress
NAME                                    READY   STATUS    RESTARTS   AGE
pod/pgadmin-pgadmin4-69c9849cf9-lxfb2   1/1     Running   0          89m
pod/postgre-postgresql-0                1/1     Running   0          125m

NAME                                         CLASS   HOSTS                                 ADDRESS   PORTS   AGE
ingress.networking.k8s.io/pgadmin-pgadmin4   nginx   postgresqladmin.aliruanjianyuan.com             80      89m
[root@master gitlab]# 

我这里使用的是ingress做的方向代理,所以我使用域名访问http://postgresqladmin.aliruanjianyuan.com

[root@master pv]# curl -I http://postgresqladmin.aliruanjianyuan.com
HTTP/1.1 302 FOUND
Date: Thu, 11 Sep 2025 14:24:03 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 213
Connection: keep-alive
Location: /login?next=/
Vary: Accept-Encoding
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: default-src ws: http: data: blob: 'unsafe-inline' 'unsafe-eval';
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Set-Cookie: pga4_session=7bf90158-ea6c-4e7c-b65f-eb03294b49d6!7pXDB29y/FeWR/r0EZAQvi+Rublc89ENo/ty9/YCjUM=; Expires=Fri, 12 Sep 2025 14:24:03 GMT; HttpOnly; Path=/; SameSite=Lax

[root@master pv]# 

如果你使用的NodePort的端口暴露方式请使用节点IP直接访问

  • 获取SVC运行信息,查看端口
kubectl get svc -n postgresql | grep pgadmin

结果类型下面,32456就是端口

NAME                TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
pgadmin-pgadmin4   NodePort   10.96.123.456   <none>        80:32456/TCP   5m
  • 获取所有节点 IP 地址
kubectl get nodes -o wide

结果如下

NAME        STATUS                     ROLES    AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                      KERNEL-VERSION                 CONTAINER-RUNTIME
master      Ready,SchedulingDisabled   master   28h   v1.32.3   10.0.0.10     <none>        Rocky Linux 9.5 (Blue Onyx)   5.14.0-503.14.1.el9_5.x86_64   containerd://2.0.4
worker-01   Ready                      node     28h   v1.32.3   10.0.0.11     <none>        Rocky Linux 9.5 (Blue Onyx)   5.14.0-503.14.1.el9_5.x86_64   containerd://2.0.4
  • 获取pod运行节点信息
kubectl get po -n postgresql -o wide

结果如下,我的pgadmin-pgadmin4工作在worker-01,所以我的访问地址是http://10.0.0.11:32456

NAME                                READY   STATUS    RESTARTS   AGE    IP              NODE        NOMINATED NODE   READINESS GATES
pgadmin-pgadmin4-69c9849cf9-lxfb2   1/1     Running   0          97m    172.20.171.18   worker-01   <none>           <none>
postgre-postgresql-0                1/1     Running   0          134m   172.20.171.20   worker-01   <none>           <none>
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐