树叶云 PostgreSQL – CrunchyData PGO 教程:创建、连接、删除 Postgres 集群

入门

作为安装的一部分,请确保您已完成以下操作:

  1. 分叉 Postgres Operator 示例存储库并将其克隆到您的主机。
  2. https://github.com/CrunchyData/postgres-operator-examples/fork
  3. 将 PGO 安装到 postgres-operator 命名空间。如果您位于 postgres-operator-examples 目录中,则可以运行 kubectl apply -k kustomize/install 命令。

详细安装过程,请参阅:云原生 PostgreSQL – CrunchyData PGO:5分钟快速上手

在本教程中,我们将基于 kustomize/postgres 中提供的示例进行构建。

在 YAML 清单中引用嵌套对象时,我们将使用 . 格式类似于 kubectl explain。例如,如果我们想引用这个 yaml 文件中最深的元素:

spec:
hippos:
appetite: huge

我们会说 spec.hippos.appetite。

kubectl explain 是你的朋友。您可以使用 kubectl explain postgrescluster 来内省 postgrescluster.postgres-operator.crunchydata.com 自定义资源定义。您还可以查看 CRD reference。

CRD

  • https://access.crunchydata.com/documentation/postgres-operator/5.0.4/references/crd/

安装好 PGO(Postgres Operator) 后,让我们开始创建 Postgres 集群吧!

创建 Postgres 集群

创建 Postgres 集群非常简单。使用 kustomize/postgres 目录中的示例,我们所要做的就是运行:

kubectlapply-kkustomize/postgres

PGO 将在 postgres-operator 命名空间中创建一个名为 hippo 的简单 Postgres 集群。您可以使用 postgresclusters.postgres-operator.crunchydata.com 自定义资源上的 kubectl describe 跟踪 Postgres 集群的状态:

kubectl-npostgres-operatordescribepostgresclusters.postgres-operator.crunchydata.comhippo

您可以使用以下命令跟踪 Postgres Pod 的状态:

--selector=postgres-operator.crunchydata.com/cluster=hippo,postgres-operator.crunchydata.com/instance

刚刚发生了什么?

PGO 根据位于 kustomize/postgres 目录中的 Kustomize 清单中提供的信息创建了一个 Postgres 集群。让我们通过检查 kustomize/postgres/postgres.yaml 文件更好地了解发生了什么:

apiVersion: postgres-operator.crunchydata.com/v1beta1
kind: PostgresCluster
metadata:
name: hippo
spec:
image: registry.developers.crunchydata.com/crunchydata/crunchy-postgres:centos8-13.5-0
postgresVersion: 13
instances:
-name: instance1
dataVolumeClaimSpec:
accessModes:
-"ReadWriteOnce"
resources:
requests:
storage: 1Gi
backups:
pgbackrest:
image: registry.developers.crunchydata.com/crunchydata/crunchy-pgbackrest:centos8-2.36-0
repos:
-name: repo1
volume:
volumeClaimSpec:
accessModes:
-"ReadWriteOnce"
resources:
requests:
storage: 1Gi

当我们之前运行 kubectl apply 命令时,我们所做的是在 Kubernetes 中创建一个 PostgresCluster 自定义资源。PGO 检测到我们添加了一个新的 PostgresCluster 资源并开始创建在 Kubernetes 中运行 Postgres 所需的所有对象!

还发生了什么?PGO 从 metadata.name 中读取值,为 Postgres 集群提供名称 hippo。此外,PGO 通过分别查看 spec.image 和 spec.backups.pgbackrest.image 中的值来知道哪些容器用于 Postgres 和 pgBackRest。spec.postgresVersion 中的值很重要,因为它将帮助 PGO 跟踪您正在使用的 Postgres 的主要版本。

PGO 通过清单的 spec.instances 部分知道要创建多少个 Postgres 实例。虽然名称是可选的,但我们选择将其命名为 instance1。我们也可以在集群初始化期间创建多个副本和实例,但是当我们讨论如何扩展和创建 HA Postgres 集群时,我们将介绍更多内容。

您的 PostgresCluster 自定义资源的一个非常重要的部分是 dataVolumeClaimSpec 部分。这描述了您的 Postgres 实例将使用的存储。它以持久卷声明为模型。如果您不提供 spec.instances.dataVolumeClaimSpec.storageClassName,则使用 Kubernetes 环境中的默认存储类(storage class)。

持久卷声明

  • https://kubernetes.io/docs/concepts/storage/persistent-volumes/

作为创建 Postgres 集群的一部分,我们还指定了有关备份存档的信息。PGO 使用 pgBackRest,这是一种开源备份和恢复工具,旨在处理 TB 级备份。作为初始化集群的一部分,我们可以指定我们希望备份和存档(预写日志或 WAL)存储的位置。我们将在本教程的灾难恢复部分更深入地讨论 PostgresCluster spec的这一部分,并了解我们如何将备份存储在 Amazon S3、Google GCS 和 Azure Blob 存储中。

连接到 Postgres 集群

创建 Postgres 集群是一回事;连接它是另一回事。让我们来看看 PGO 是如何连接到 Postgres 集群的!

背后:Services, Secrets, 和 TLS

PGO 创建了一系列 Kubernetes 服务,以提供稳定的端点来连接您的 Postgres 数据库。这些端点可以轻松地为您的应用程序提供一致的方式来保持与数据的连接。要检查哪些服务可用,您可以运行以下命令:

kubectl-npostgres-operatorgetsvc--selector=postgres-operator.crunchydata.com/cluster=hippo

将产生类似于如下结果:

NAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)    AGE
hippo-haClusterIP10.103.73.92<none>5432/TCP3h14m
hippo-ha-configClusterIPNone<none><none>3h14m
hippo-podsClusterIPNone<none><none>3h14m
hippo-primaryClusterIPNone<none>5432/TCP3h14m
hippo-replicasClusterIP10.98.110.215<none>5432/TCP3h14m

您无需担心大多数这些服务,因为它们用于帮助管理 Postgres 集群的整体健康状况。为了连接到您的数据库,感兴趣的服务称为 hippo-primary。多亏了 PGO,您甚至不必担心这一点,因为该信息是在 Secret 中捕获的!

当您的 Postgres 集群初始化时,PGO 将引导您的应用程序可以访问的数据库和 Postgres 用户。此信息存储在以 -pguser- 模式命名的 Secret 中。对于我们的 hippo 集群,这个 Secret 称为 hippo-pguser-hippo。此 Secret 包含将应用程序连接到 Postgres 数据库所需的信息:

  • user: 用户帐户的名称。
  • password: 用户帐户的密码。
  • dbname: 默认情况下用户有权访问的数据库的名称。
  • host: 数据库主机的名称。这引用了主 Postgres 实例的 Service。
  • port: 数据库正在侦听的端口。
  • uri: 一个 PostgreSQL 连接 URI,它提供了登录 Postgres 数据库的所有信息。
  • jdbc-uri: 一个 PostgreSQL JDBC 连接 URI,它提供了通过 JDBC driver 登录到 Postgres 数据库的所有信息。

所有连接都通过 TLS。PGO 提供自己的证书颁发机构 (CA) 以允许您将应用程序安全地连接到 Postgres 集群。这允许您使用 Postgres 的 verify-full “SSL mode”,它提供窃听保护并防止 MITM 攻击。您还可以选择带上您自己的 CA,这将在本教程后面的“自定义集群”部分中进行描述。

verify-full “SSL mode”

  • https://www.postgresql.org/docs/current/libpq-ssl.html#LIBPQ-SSL-SSLMODE-STATEMENTS

修改 Service Type

默认情况下,PGO 部署具有 ClusterIP Service type 的服务。根据您想要公开数据库的方式,您可能需要修改服务以使用不同的 Service type。

Service type

  • https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types

您可以从以下属性修改 PGO 管理的服务:

  • spec.service – 这管理用于连接到 Postgres 主服务器的 Service。
  • spec.proxy.pgBouncer.service – 这管理用于连接到 PgBouncer 连接池的服务。

例如,要将 Postgres 主节点设置为使用 NodePort 服务,您可以在清单中添加以下内容:

spec:
service:
type: NodePort

对于我们的 hippo 集群,您将在。例如:

kubectl-npostgres-operatorgetsvc--selector=postgres-operator.crunchydata.com/cluster=hippo

将产生类似于以下内容:

NAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)          AGE
hippo-haNodePort10.96.17.210<none>5432:32751/TCP2m37s
hippo-ha-configClusterIPNone<none><none>2m37s
hippo-podsClusterIPNone<none><none>2m37s
hippo-primaryClusterIPNone<none>5432/TCP2m37s
hippo-replicasClusterIP10.96.151.53<none>5432/TCP2m37s

(请注意,如果您在外部公开您的服务并依赖 TLS 验证,您将需要使用 PGO 的自定义 TLS 功能)。

连接应用程序

对于本教程,我们将连接 Keycloak,一个开源身份管理应用程序。Keycloak 可以部署在 Kubernetes 上,并由 Postgres 数据库提供支持。虽然我们在 Postgres Operator 示例存储库中提供了一个部署 Keycloak 和 PostgresCluster 的示例,但下面的清单使用我们已经运行的 hippo 集群来部署它:

Keycloak

  • https://www.keycloak.org/

部署 Keycloak 和 PostgresCluster 的示例

  • https://github.com/CrunchyData/postgres-operator-examples/tree/main/kustomize/keycloak

官方清单可能水土不服,请参阅:云原生 PostgreSQL – CrunchyData PGO:5分钟快速上手

kubectlapply--filename=- <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: keycloak
namespace: postgres-operator
labels:
app.kubernetes.io/name: keycloak
spec:
selector:
matchLabels:
app.kubernetes.io/name: keycloak
template:
metadata:
labels:
app.kubernetes.io/name: keycloak
spec:
containers:
-image: quay.io/keycloak/keycloak:latest
name: keycloak
env:
-name: DB_VENDOR
value: "postgres"
-name: DB_ADDR
valueFrom: { secretKeyRef: { name: hippo-pguser-hippo, key: host } }
-name: DB_PORT
valueFrom: { secretKeyRef: { name: hippo-pguser-hippo, key: port } }
-name: DB_DATABASE
valueFrom: { secretKeyRef: { name: hippo-pguser-hippo, key: dbname } }
-name: DB_USER
valueFrom: { secretKeyRef: { name: hippo-pguser-hippo, key: user } }
-name: DB_PASSWORD
valueFrom: { secretKeyRef: { name: hippo-pguser-hippo, key: password } }
-name: KEYCLOAK_USER
value: "admin"
-name: KEYCLOAK_PASSWORD
value: "admin"
-name: PROXY_ADDRESS_FORWARDING
value: "true"
ports:
-name: http
containerPort: 8080
-name: https
containerPort: 8443
readinessProbe:
httpGet:
path: /auth/realms/master
port: 8080
restartPolicy: Always
EOF

注意清单的这一部分:

- name: DB_ADDR
valueFrom: { secretKeyRef: { name: hippo-pguser-hippo, key: host } }
-name: DB_PORT
valueFrom: { secretKeyRef: { name: hippo-pguser-hippo, key: port } }
-name: DB_DATABASE
valueFrom: { secretKeyRef: { name: hippo-pguser-hippo, key: dbname } }
-name: DB_USER
valueFrom: { secretKeyRef: { name: hippo-pguser-hippo, key: user } }
-name: DB_PASSWORD
valueFrom: { secretKeyRef: { name: hippo-pguser-hippo, key: password } }

上面的清单显示了所有这些值是如何从 hippo-pguser-hippo Secret 派生的。这意味着我们不需要知道任何连接凭据,也不需要不安全地传递它们 — 它们直接可供应用程序使用!

使用这种方法,您可以将应用程序直接绑定到连接到 Postgres 的 GitOps 管道,而无需事先了解 PGO 将如何部署 Postgres:您的应用程序需要的所有信息都会传播到 Secret!

删除 Postgres 集群

有时需要删除您的集群。如果您一直遵循官方示例,您可以通过简单地运行以下命令来删除您的 Postgres 集群:

kubectldelete-kkustomize/postgres

PGO 将删除与您的集群关联的所有对象。

对于数据保留,这取决于您的 PVC 的保留策略。有关 Kubernetes 如何管理数据保留的更多信息,请参阅关于卷回收的 Kubernetes 文档。

PVC 的保留策略

  • https://kubernetes.io/docs/concepts/storage/persistent-volumes/#reclaiming

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/262795.html<

(0)
管理的头像管理
上一篇2025-05-04 06:38
下一篇 2025-05-04 06:39

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注