如何使用CrunchyData PGO教程高效创建、连接及管理Postgres集群?

2026-05-25 13:161阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计2820个文字,预计阅读时间需要12分钟。

如何使用CrunchyData PGO教程高效创建、连接及管理Postgres集群?

入门+作为安装的一部分,请确保您已完成以下操作:+安装+Postgres+Operator+示例+存储库并将其实例化到您的主机。+https://github.com/CrunchyData/postgres-operator-examples/fork+将+PGO+安装到+postgres-opera

入门

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

  1. 分叉 Postgres Operator 示例存储库并将其克隆到您的主机。
    • github.com/CrunchyData/postgres-operator-examples/fork
  2. PGO 安装到 postgres-operator 命名空间。如果您位于 postgres-operator-examples 目录中,则可以运行 kubectl apply -k kustomize/install 命令。
  3. 详细安装过程,请参阅:云原生 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

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

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

创建 Postgres 集群

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

kubectl apply -k kustomize/postgres

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

kubectl -n postgres-operator describe postgresclusters.postgres-operator.crunchydata.com hippo

您可以使用以下命令跟踪 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 所需的所有对象!

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

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

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

持久卷声明

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

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

连接到 Postgres 集群

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

背后:Services, Secrets, 和 TLS

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

kubectl -n postgres-operator get svc --selector=postgres-operator.crunchydata.com/cluster=hippo

将产生类似于如下结果:

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hippo-ha ClusterIP 10.103.73.92 <none> 5432/TCP 3h14m hippo-ha-config ClusterIP None <none> <none> 3h14m hippo-pods ClusterIP None <none> <none> 3h14m hippo-primary ClusterIP None <none> 5432/TCP 3h14m hippo-replicas ClusterIP 10.98.110.215 <none> 5432/TCP 3h14m

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

当您的 Postgres 集群初始化时,PGO 将引导您的应用程序可以访问的数据库和 Postgres 用户。此信息存储在以 <clusterName>-pguser-<userName> 模式命名的 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 数据库的所有信息。

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

verify-full “SSL mode”

  • www.postgresql.org/docs/current/libpq-ssl.html#LIBPQ-SSL-SSLMODE-STATEMENTS
修改 Service Type

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

Service type

  • 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 -n postgres-operator get svc --selector=postgres-operator.crunchydata.com/cluster=hippo

将产生类似于以下内容:

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hippo-ha NodePort 10.96.17.210 <none> 5432:32751/TCP 2m37s hippo-ha-config ClusterIP None <none> <none> 2m37s hippo-pods ClusterIP None <none> <none> 2m37s hippo-primary ClusterIP None <none> 5432/TCP 2m37s hippo-replicas ClusterIP 10.96.151.53 <none> 5432/TCP 2m37s

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

连接应用程序

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

Keycloak

如何使用CrunchyData PGO教程高效创建、连接及管理Postgres集群?

  • www.keycloak.org/

部署 KeycloakPostgresCluster 的示例

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

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

kubectl apply --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: kubernetes.io/docs/concepts/storage/persistent-volumes/#reclaiming

公众号:黑客下午茶

本文共计2820个文字,预计阅读时间需要12分钟。

如何使用CrunchyData PGO教程高效创建、连接及管理Postgres集群?

入门+作为安装的一部分,请确保您已完成以下操作:+安装+Postgres+Operator+示例+存储库并将其实例化到您的主机。+https://github.com/CrunchyData/postgres-operator-examples/fork+将+PGO+安装到+postgres-opera

入门

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

  1. 分叉 Postgres Operator 示例存储库并将其克隆到您的主机。
    • github.com/CrunchyData/postgres-operator-examples/fork
  2. PGO 安装到 postgres-operator 命名空间。如果您位于 postgres-operator-examples 目录中,则可以运行 kubectl apply -k kustomize/install 命令。
  3. 详细安装过程,请参阅:云原生 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

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

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

创建 Postgres 集群

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

kubectl apply -k kustomize/postgres

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

kubectl -n postgres-operator describe postgresclusters.postgres-operator.crunchydata.com hippo

您可以使用以下命令跟踪 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 所需的所有对象!

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

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

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

持久卷声明

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

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

连接到 Postgres 集群

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

背后:Services, Secrets, 和 TLS

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

kubectl -n postgres-operator get svc --selector=postgres-operator.crunchydata.com/cluster=hippo

将产生类似于如下结果:

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hippo-ha ClusterIP 10.103.73.92 <none> 5432/TCP 3h14m hippo-ha-config ClusterIP None <none> <none> 3h14m hippo-pods ClusterIP None <none> <none> 3h14m hippo-primary ClusterIP None <none> 5432/TCP 3h14m hippo-replicas ClusterIP 10.98.110.215 <none> 5432/TCP 3h14m

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

当您的 Postgres 集群初始化时,PGO 将引导您的应用程序可以访问的数据库和 Postgres 用户。此信息存储在以 <clusterName>-pguser-<userName> 模式命名的 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 数据库的所有信息。

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

verify-full “SSL mode”

  • www.postgresql.org/docs/current/libpq-ssl.html#LIBPQ-SSL-SSLMODE-STATEMENTS
修改 Service Type

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

Service type

  • 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 -n postgres-operator get svc --selector=postgres-operator.crunchydata.com/cluster=hippo

将产生类似于以下内容:

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hippo-ha NodePort 10.96.17.210 <none> 5432:32751/TCP 2m37s hippo-ha-config ClusterIP None <none> <none> 2m37s hippo-pods ClusterIP None <none> <none> 2m37s hippo-primary ClusterIP None <none> 5432/TCP 2m37s hippo-replicas ClusterIP 10.96.151.53 <none> 5432/TCP 2m37s

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

连接应用程序

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

Keycloak

如何使用CrunchyData PGO教程高效创建、连接及管理Postgres集群?

  • www.keycloak.org/

部署 KeycloakPostgresCluster 的示例

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

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

kubectl apply --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: kubernetes.io/docs/concepts/storage/persistent-volumes/#reclaiming

公众号:黑客下午茶