入门

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

  1. 分叉 Postgres Operator 示例存储库并将其克隆到您的主机。

  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

安装好 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)存储的位置。我们将在本教程的灾难恢复部分更深入地讨论 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 集群。这允许您使用 Postgresverify-full “SSL mode”,它提供窃听保护并防止 MITM 攻击。 您还可以选择带上您自己的 CA,这将在本教程后面的“自定义集群”部分中进行描述。

verify-full “SSL mode”

修改 Service Type

默认情况下,PGO 部署具有 ClusterIP Service 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 的保留策略

公众号:黑客下午茶

云原生 PostgreSQL - CrunchyData PGO 教程:创建、连接、删除 Postgres 集群的更多相关文章

  1. 云原生 PostgreSQL 集群 - PGO:来自 Crunchy Data 的 Postgres Operator

    使用 PGO 在 Kubernetes 上运行 Cloud Native PostgreSQL:来自 Crunchy Data 的 Postgres Operator! Cloud Native Po ...

  2. 云原生 PostgreSQL 集群 - PGO:5分钟快速上手

    前提条件 请确保您的主机上安装了以下实用程序: kubectl git 安装 第 1 步:下载示例 首先,转到 GitHub 并 fork Postgres Operator 示例存储库: https ...

  3. keepalived工作原理和配置说明 腾讯云VPC内通过keepalived搭建高可用主备集群

    keepalived工作原理和配置说明 腾讯云VPC内通过keepalived搭建高可用主备集群 内网路由都用mac地址 一个mac地址绑定多个ip一个网卡只能一个mac地址,而且mac地址无法改,但 ...

  4. Spring Boot 2.x基础教程:使用EhCache缓存集群

    上一篇我们介绍了在Spring Boot中整合EhCache的方法.既然用了ehcache,我们自然要说说它的一些高级功能,不然我们用默认的ConcurrentHashMap就好了.本篇不具体介绍Eh ...

  5. eclipse连接远程hadoop集群开发时权限不足问题解决方案

    转自:http://blog.csdn.net/shan9liang/article/details/9734693 eclipse连接远程hadoop集群开发时报错   Exception in t ...

  6. RabbitMQ入门教程(十五):普通集群和镜像集群

    原文:RabbitMQ入门教程(十五):普通集群和镜像集群 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.c ...

  7. spring cloud系列教程第六篇-Eureka集群版

    spring cloud系列教程第六篇-Eureka集群版 本文主要内容: 本文来源:本文由凯哥Java(kaigejava)发布在博客园博客的.转载请注明 1:Eureka执行步骤理解 2:集群原理 ...

  8. wsl2 ubuntu20.04 上使用 kubeadm 创建一个单主集群

    wsl2 ubuntu20.04 上使用 kubeadm 创建一个单主集群 官方文档使用 kubeadm 创建一个单主集群 环境初始化 建议尽可能初始化环境,命令wsl --unregister Ub ...

  9. eclipse连接远程hadoop集群开发时0700问题解决方案

    eclipse连接远程hadoop集群开发时报错 错误信息: Exception in thread "main" java.io.IOException:Failed to se ...

随机推荐

  1. day 21 C语

    (1).有以下程序: 执行后的输出结果是[A] (A).256,1 (B).1,256 (C).255,1 (D).256,0 (2).以下选项中与(!a==0)的逻辑值不等价的表达式是[B] (A) ...

  2. C语言字幕从外向中间汇聚

    演示数据中多个字符,从两端向中间移动,向中间汇聚 简单,粗暴,先上代码: Sleep()函数属于<windows.h>头文件中. sizeof()函数求右下标:数组内是数字时,求右下标要- ...

  3. 达索CATIA许可证(License)管理使用和优化

    现下主流的V6版本CATIA,是由达索公司提供授权的浮动型License,其客户端通过企业内网从许可证服务器获得许可证,最少要有一个服务器端DS License Server提供一定数量的Licens ...

  4. django框架--登录注册功能(ajax)

    注册 实现一个注册功能 编写 html 内容 input 标签 csrf_token ajax 路由 视图: 提供页面 负责处理业务,返回响应 接收到   post   请求传递的参数 写库 返回   ...

  5. entity framework无法写入数据库.SaveChanges()失败

    参考https://stackoverflow.com/questions/26745184/ef-cant-savechanges-to-db/28256645 https://www.codepr ...

  6. 巅峰对决之Swarm、Kubernetes、Mesos

    另外一篇 https://www.sohu.com/a/157185937_287582 Docker Docker是一个主流容器管理工具,它是第一个基于Linux容器(LXC)的[2],但是现在被r ...

  7. 中文分词,自然语言处理器NLP。 新版本已上线,增加二级行业分类。

    一  cacl2新版本上线,在一级行业的基础上深度挖掘,新增了对应的二级分类. 可以查看一级行业[农林牧渔],下面对应的所有二级行业的词库.这里拿[林业]来观察效果. 具体分词的效果. 二    Gi ...

  8. Java 中对象锁和类锁的区别? 关键字 Synchronized的用法?

    一  对象锁和类锁的关系 /* * 对象锁和[类锁] 全局锁的关系? 对象锁是用于对象实例方法,或者一个对象实例上的 this 类锁是用于类的静态方法或者一个类的class对象上的. Ag.class ...

  9. bind方法源码

    'use strict'; module.exports = function bind(fn, thisArg) { return function wrap() { var args = new ...

  10. BootStrap基础入门概述总结

    是否还值得学习BootStrap 因为自己还是学生,自己在学习之前就先在网上看了看BootStrap是否在现在依旧流行,是否还值得学习. 以下是网友的一些评价: 20年11月 Bootstrap作为入 ...