传统的RDBMS像Postgres这样的仍然会在你的系统中扮演一定角色。你可以通过安装程序快速且简单粗暴地启动Postgres。不过,在这篇文章里,我们将用Minikube来运行Kubernetes。
https://people.com/pets/first-twin-elephants-born-in-sri-lanka-in-80-years/
特别的部分是Postgres HA,通过一主一从两个Postgres实例实现高可用性。在故障转移情况下,从实例作为备份。就像上面提到的象双胞胎一样。
使用 bitnami 的 Helm Chart 进行部署非常简单。不过,请参照此链接中介绍的方法创建您的 Minikube 集群。
用 Apache Iceberg 构建数据湖 — Minikube (Kubernetes)一天早上,我查看邮件,发现了一家云提供商的账单,虽然金额不多,但也让我有点无奈……
点击这里查看原文
首先确保你已经点击了上面的链接。试着查看一下 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。
「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.com 和 admin123 密码登录到 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-1 和 postgres-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.volumeName 和 metadata.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.type 和 spec.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 复制管理器,一个开源工具,用于管理…共同学习,写下你的评论
评论加载中...
作者其他优质文章