为了账号安全,请及时绑定邮箱和手机立即绑定

Minikube中搭建PostgreSQL高可用集群及PGAdmin指南

简介

传统的RDBMS像Postgres这样的仍然会在你的系统中扮演一定角色。你可以通过安装程序快速且简单粗暴地启动Postgres。不过,在这篇文章里,我们将用Minikube来运行Kubernetes。

https://people.com/pets/first-twin-elephants-born-in-sri-lanka-in-80-years/

特别的部分是Postgres HA,通过一主一从两个Postgres实例实现高可用性。在故障转移情况下,从实例作为备份。就像上面提到的象双胞胎一样。

https://docs.vmware.com/en/VMware-Tanzu-Application-Catalog/services/apps/GUID-apps-postgresql-ha-index.html

使用 bitnami 的 Helm Chart 进行部署非常简单。不过,请参照此链接中介绍的方法创建您的 Minikube 集群。

用 Apache Iceberg 构建数据湖 — Minikube (Kubernetes)

一天早上,我查看邮件,发现了一家云提供商的账单,虽然金额不多,但也让我有点无奈……
点击这里查看原文

Postgres(即 PostgreSQL)部署

首先确保你已经点击了上面的链接。试着查看一下 kubectl 当前上下文的输出。比如在我的情况里就是 datasaku-cluster

kubectl config current-context # 获取当前的上下文配置

创建命名空间,但确保将其从集群中删除。

    kubectl delete namespace psql-dev  # 删除名为psql-dev的命名空间
    kubectl create namespace psql-dev  # 创建名为psql-dev的命名空间

让我们创建一个密钥并在 Kubernetes 中使用它。下面这两个密钥,将分别用于 psql 和 pgadmin。

这行命令是用来将字符串 'postgres' 转换为 base64 编码格式。  
echo -n 'postgres' | base64  

这行命令是用来将字符串 'admin123' 转换为 base64 编码格式。  
echo -n 'admin123' | base64

现在需要创建几个文件,这些文件稍后再解释。我们先专注于部署,。你可以看看这个GitHub仓库中的文件结构和内容。https://github.com/kurangdoa/lakehouse_iceberg/tree/main/psql

首先,让我们先使用这个密码。根据你选择的密码,你需要填入 psql-secret.yaml 文件中。

kubectl apply -n psql-dev -f psql-secret.yaml # 该命令用于在 psql-dev 命名空间中应用 psql-secret.yaml 文件,以部署 PostgreSQL 密钥配置。

之后,我们将创建PV和PVC,但在那之前,我们需要先删除PV。

kubectl delete pv postgres-volume-0, kubectl delete pv postgres-volume-1, kubectl apply -n psql-dev -f psql-pv.yaml, kubectl apply -n psql-dev -f psql-pvclaim.yaml

要检查部署是否成功,请运行以下命令,如果在pvc上看到绑定状态,就表示部署成功了

查看所有持久化存储卷 (kubectl get pv)  
查看psql-dev命名空间下的所有持久化卷声明 (kubectl get pvc -n psql-dev)

现在我们有了PV和PVC供pod使用,是时候在命令行中运行如下命令来部署PostgreSQL了。

helm 升级 --清理失败时删除 \  
--namespace psql-dev \  
--安装 datasaku-postgres oci://registry-1.docker.io/bitnamicharts/postgresql-ha \  
--版本=14.1.2 \  
--配置文件 config.yaml

注:config.yaml 是一个 YAML 格式的配置文件。

PGAdmin安装

几乎用相同的过程,我们也可以用相同的方法来部署 pgadmin。

「kubectl apply -n psql-dev  -f pgadmin-secret.yaml.」(这将应用pgadmin-secret.yaml文件中的配置)
「kubectl apply -n psql-dev  -f pgadmin-deployment.yaml.」(这将应用pgadmin-deployment.yaml文件中的配置)
「kubectl apply -n psql-dev  -f pgadmin-service.yaml.」(这将应用pgadmin-service.yaml文件中的配置)

你可以通过 127.0.0.1:5432 访问 UI,但首先你可能需要监控从该说明中启动的 minikube 隧道: https://medium.com/@kurangdoa/build-data-lakehouse-with-apache-iceberg-minikube-kubernetes-6b53d02c8ba4。有时候可能需要输入 root 用户的密码。

使用 admin@admin.comadmin123 密码登录到 PGAdmin 之后,你可以注册服务器并查看以下截图。

主机名: datasaku-postgres-postgresql-ha-pgpool.psql-dev.svc.cluster.local
端口: 5433
用户名: postgres
密码: postgres

如 FQDN 中解释的 https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-s-hostname-and-subdomain-fields,主机名由以下部分组成:

[服务名称].[命名空间名].svc.cluster.local

解释一下

下面,让我们一个个来看在 minikube 中部署 postgres HA 所需的文件清单。

psql-pv.yaml(一个配置文件)

apiVersion: v1  
kind: PersistentVolume  
metadata:  
  name: postgres-volume-0  
  # 名称:data-datasaku-postgres-postgresql-ha-postgresql-0  
  labels:  
    app: postgres-app  
spec:  
  storageClassName: psql-manual  
  # 存储类别:psql-manual  
  claimRef:  
    name: data-datasaku-postgres-postgresql-ha-postgresql-0  
    # 名称:data-datasaku-postgres-postgresql-ha-postgresql-0  
    namespace: psql-dev  
    # 命名空间:psql-dev  
  capacity:  
    storage: 8Gi  
    # 存储容量:8Gi  
  accessModes:  
    - ReadWriteMany  
    # 访问模式:读写许多(读写许多)  
  hostPath:  
    path: /data/postgres/postgres0  
    # 主机路径:/data/postgres/postgres0  

---  

apiVersion: v1  
kind: PersistentVolume  
metadata:  
  name: postgres-volume-1  
  # 名称:data-datasaku-postgres-postgresql-ha-postgresql-1  
  labels:  
    app: postgres-app  
spec:  
  storageClassName: psql-manual  
  # 存储类别:psql-manual  
  claimRef:  
    name: data-datasaku-postgres-postgresql-ha-postgresql-1  
    # 名称:data-datasaku-postgres-postgresql-ha-postgresql-1  
    namespace: psql-dev  
    # 命名空间:psql-dev  
  capacity:  
    storage: 8Gi  
    # 存储容量:8Gi  
  accessModes:  
    - ReadWriteMany  
    # 访问模式:读写许多(读写许多)  
  hostPath:  
    path: /data/postgres/postgres1  
    # 主机路径:/data/postgres/postgres1

这里可以看到我们创建了两个卷,分别命名为 postgres-volume-1postgres-volume-0,并指定了 claimref 以匹配定义的模式。

data-[helm安装名称]postgresql-ha-postgresql-0
data-[helm安装名称]postgresql-ha-postgresql-1

helm安装的名称将来自安装命令之后的行,“datasaku-postgres”

helm 更新 --cleanup-on-fail (清理失败时) \  
--namespace psql-dev \  
--set chart=datasaku-postgres oci://registry-1.docker.io/bitnamicharts/postgresql-ha \  
--version=14.1.2 \  
--values config.yaml

注:oci:// 是 Oracle Cloud Infrastructure 的标识符,用于表示从 Oracle 容器注册表获取资源。

psql-pvclaim.yaml (这是一个技术文件名,具体含义请参考上下文)

apiVersion: v1  # API版本为v1
kind: PersistentVolumeClaim  # 持久存储卷声明
metadata:  # 元数据
  name: data-datasaku-postgres-postgresql-ha-postgresql-0  # 名称为data-datasaku-postgres-postgresql-ha-postgresql-0
  labels:  # 标签
    app: postgres-app  # 应用为postgres-app
spec:  # 规格
  storageClassName: psql-manual  # 存储类名为psql-manual
  volumeName: postgres-volume-0  # 卷名为postgres-volume-0
  accessModes:  # 访问模式
    - ReadWriteMany  # 可读写
  resources:  # 资源
    requests:  # 请求
      storage: 8Gi  # 存储为8Gi
---
apiVersion: v1  # API版本为v1
kind: PersistentVolumeClaim  # 持久存储卷声明
metadata:  # 元数据
  name: data-datasaku-postgres-postgresql-ha-postgresql-1  # 名称为data-datasaku-postgres-postgresql-ha-postgresql-1
  labels:  # 标签
    app: postgres-app  # 应用为postgres-app
spec:  # 规格
  storageClassName: psql-manual  # 存储类名为psql-manual
  volumeName: postgres-volume-1  # 卷名为postgres-volume-1
  accessModes:  # 访问模式
    - ReadWriteMany  # 可读写
  resources:  # 资源
    requests:  # 请求
      storage: 8Gi  # 存储为8Gi

spec.volumeNamemetadata.name 必须与 psql-pv.yaml 文件中的内容匹配。这样做的好处是,你可以决定用于 psql 部署的 PV 是什么。否则,将会创建带有随机后缀的 PV。

psql-secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: psql-secret
type: Opaque
data:
  password: cG9zdGdyZXM=
  repmgr-password: cG9zdGdyZXM=
  admin-password: cG9zdGdyZXM=
# 此Opaque类型的Secret定义了数据库的密码,包括普通密码,repmgr密码和管理员密码。

这只是密码“postgres”的base-64编码。如果你在mac终端里这样做,可能会得到同样的结果。

echo -n ‘postgres’ | base64
这个命令会将字符串 'postgres' 转换成 base64 编码。

配置文件:config.yaml

global:
postgresql:
username: postgres
# password: postgres
existingSecret: psql-secret
# storageClass: psql-manual

service:
type: LoadBalancer
ports:
postgresql: 5433

postgresql:
replicaCount: 2
username: postgres
# password: postgres
existingSecret: psql-secret

pgpool:
# adminPassword: postgres
existingSecret: psql-secret

# 取消以下内容的注释以使用默认的持久卷
# persistence:
# existingClaim: postgres-volume-claim
# storageClass: manual

# volumePermissions:
# enabled: true

# 取消以下内容的注释以使用自定义的持久卷
persistence:
selector:
matchLabels:
app: postgres-app
storageClass: psql-manual

volumePermissions:
enabled: true

以下将展示Helm部署PostgreSQL时使用的配置。最重要的是XXX配置项。(注:需补充具体内容以使句子更加完整。)

  • persistence.selector.matchLabels.app 与 pv 和 pvc 匹配
  • persistence.storageClass 与 pv 和 pvs 匹配
  • postgresql 服务器服务端口

pgadmin-secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: pgadmin-secret
type: Opaque
data:
  pgadmin-default-password: YWRtaW4xMjM=

几乎和 psql-secret.yaml 的解释一样

pgadmin-deployment.yaml
这是pgadmin部署的配置文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pgadmin
spec:
  selector:
    matchLabels:
      app: pgadmin
  replicas: 1
  template:
    metadata:
      labels:
        app: pgadmin
    spec:
      containers:
        - name: pgadmin4
          image: dpage/pgadmin4
          env:
            - name: PGADMIN_DEFAULT_EMAIL
              value: "admin@admin.com"
            - name: PGADMIN_DEFAULT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: pgadmin-secret
                  key: pgadmin-default-password
            - name: PGADMIN_PORT
              value: "80"
          ports:
            - containerPort: 80
              name: pgadminport

pgadmin的部署不是通过helm,而是通过kubectl使用YAML文件进行的。

文件名: pgadmin-service.yaml

apiVersion: v1
kind: 服务
metadata:
  name: pgadmin
  labels:
    app: 应用
spec:
  selector: 选择器
    app: pgadmin
  type: LoadBalancer
  ports:
    - port: 5432
      targetPort: 80
      nodePort: 节点端口 30200

Note: The term "选择器" is used directly for "selector" and "节点端口" for "nodePort". However, in practice, "selector" might not typically be translated, nor is "nodePort" usually translated in technical documentation of this nature. Therefore, adhering strictly to the original XML suggestions but considering standard practice in zh technical documentation, a more appropriate translation would be:

apiVersion: v1
kind: 服务
metadata:
  name: pgadmin
  labels:
    app: pgadmin
spec:
  selector:
    app: pgadmin
  type: LoadBalancer
  ports:
    - port: 5432
      targetPort: 80
      nodePort: 30200

特殊之处在于 spec.typespec.ports 这两个参数,它们用于通过 minikube 隧道工具以 LoadBalancer 模式将服务暴露。

最后的话

使用 Kubernetes 部署 postgresql-ha 相对直接。我们需要了解基础知识,才能知道要配置和编辑的内容。我建议你在使用 Helm 部署之前再多学习一些基本的 kubectl 部署知识。

有个情况要告诉你:我遇到几个无故崩溃的问题。也许你能帮我解决这几个问题麻烦。

链接地址
Bitnami/charts 中的 postgresql-ha main 分支 · Bitnami Helm Charts。通过在 GitHub 上创建账户来为 bitnami/charts 贡献代码
postgresql-ha 14.2.14 · bitnami/bitnami此 PostgreSQL 集群解决方案包括 PostgreSQL 复制管理器,一个开源工具,用于管理…
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消