云原生 PostgreSQL - CrunchyData PGO 教程:创建、连接、删除 Postgres 集群

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 云原生 PostgreSQL - CrunchyData PGO 教程:创建、连接、删除 Postgres 集群

入门



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


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

安装好 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)

持久卷声明

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


修改 Service Type


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

Service type

您可以从以下属性修改 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

部署 KeycloakPostgresCluster 的示例

官方清单可能水土不服,请参阅:云原生 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: 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 派生的。这意味着我们不需要知道任何连接凭据,也不需要不安全地传递它们 — 它们直接可供应用程序使用!


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


删除 Postgres 集群


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


kubectl delete -k kustomize/postgres


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


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


PVC 的保留策略

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
1月前
|
Kubernetes Cloud Native 云计算
云原生之旅:Kubernetes 集群的搭建与实践
【8月更文挑战第67天】在云原生技术日益成为IT行业焦点的今天,掌握Kubernetes已成为每个软件工程师必备的技能。本文将通过浅显易懂的语言和实际代码示例,引导你从零开始搭建一个Kubernetes集群,并探索其核心概念。无论你是初学者还是希望巩固知识的开发者,这篇文章都将为你打开一扇通往云原生世界的大门。
120 17
|
1月前
|
关系型数据库 数据库 PostgreSQL
深入理解 PostgreSQL 的 JOIN 连接
深入理解 PostgreSQL 的 JOIN 连接
107 4
|
1月前
|
Kubernetes Cloud Native Ubuntu
云原生之旅:Kubernetes集群搭建与应用部署
【8月更文挑战第65天】本文将带你进入云原生的世界,通过一步步指导如何在本地环境中搭建Kubernetes集群,并部署一个简单的应用。我们将使用Minikube和Docker作为工具,探索云原生技术的魅力所在。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和实践技巧。
|
1月前
|
Kubernetes Cloud Native 流计算
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
73 0
|
2月前
|
关系型数据库 分布式数据库 数据库
开源云原生数据库PolarDB PostgreSQL 15兼容版本正式发布
PolarDB进行了深度的内核优化,从而实现以更低的成本提供商业数据库的性能。
|
2月前
|
Kubernetes 监控 Cloud Native
Cluster Optimizer:一款云原生集群优化平台
**Cluster Optimizer** 是一款云原生集群优化平台,旨在通过自动化和智能化工具帮助企业降低云成本,解决云原生架构中的成本管理难题。面对资源闲置、配置不当和缺乏自动化优化机制等挑战,Cluster Optimizer能够深入分析云资源、应用和用户行为,精准识别优化机会,并给出具体建议,涵盖节点组、节点、GPU 节点、磁盘、持久卷和应用等多个维度。通过优化实例类型、自动扩缩容和资源分配,帮助企业降低成本、提升性能和效率。[点击此处](https://www.wiseinf.com.cn/docs/setup/) 免费安装和试用 **Cluster Optimizer 社区版**。
96 9
|
2月前
|
Cloud Native 持续交付 Docker
云原生技术实践:Docker容器化部署教程
【9月更文挑战第4天】本文将引导你了解如何利用Docker这一云原生技术的核心工具,实现应用的容器化部署。文章不仅提供了详细的步骤和代码示例,还深入探讨了云原生技术背后的哲学,帮助你理解为何容器化在现代软件开发中变得如此重要,并指导你如何在实际操作中运用这些知识。
|
3月前
|
运维 Kubernetes Cloud Native
云原生之旅:Kubernetes 集群的搭建与实践Python 编程入门:从零基础到编写实用脚本
【8月更文挑战第30天】在数字化转型的大潮中,云原生技术以其弹性、可扩展性及高效运维能力成为企业IT架构升级的关键。本文将通过实际操作演示如何在本地环境搭建一个简易的Kubernetes集群,带你领略云原生的魅力所在。从集群规划到服务部署,每一步都是对云原生理念的深刻理解和应用。让我们共同探索,如何通过Kubernetes集群的搭建和运维,提升业务灵活性和创新能力。
|
3月前
|
运维 Kubernetes Cloud Native
探索云原生:Kubernetes集群的部署与管理
【8月更文挑战第31天】 本文将带领读者深入了解云原生技术,特别是以Kubernetes为核心的集群部署和管理。文章不仅介绍了Kubernetes的基础概念和架构,还通过实际的代码示例展示了如何在云平台上搭建一个Kubernetes集群。我们将从基础的安装步骤到高级的服务部署,一步步揭示如何利用Kubernetes来简化容器化应用的管理与扩展。无论你是云原生新手还是希望提升现有技能的开发者,这篇文章都将成为你实践云原生技术的宝贵指南。
|
3月前
|
Kubernetes Cloud Native 应用服务中间件
云原生之旅:构建你的首个Kubernetes集群
【8月更文挑战第31天】在这个数字化迅速演进的时代,云原生技术如同星辰般璀璨。它不仅是企业数字化转型的引擎,更是开发者们探索创新的乐园。本文将带你开启一场云原生的奇妙旅程,从零开始,一步步构建属于你自己的Kubernetes集群。想象一下,当你的应用在云端自如地伸缩、滚动更新时,那份成就感和掌控感,是不是已经让你跃跃欲试了呢?那就让我们开始吧!