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

入门
作为安装的一部分,请确保您已完成以下操作:
- 分叉
Postgres Operator示例存储库并将其克隆到您的主机。 - 将
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
安装好 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 所需的所有对象!
还发生了什么?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)。
持久卷声明
作为创建 Postgres 集群的一部分,我们还指定了有关备份存档的信息。PGO 使用 pgBackRest,这是一种开源备份和恢复工具,旨在处理 TB 级备份。 作为初始化集群的一部分,我们可以指定我们希望备份和存档(预写日志或 WAL)存储的位置。我们将在本教程的灾难恢复部分更深入地讨论 PostgresCluster spec的这一部分,并了解我们如何将备份存储在 Amazon S3、Google GCS 和 Azure 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数据库的所有信息。
所有连接都通过 TLS。PGO 提供自己的证书颁发机构 (CA) 以允许您将应用程序安全地连接到 Postgres 集群。这允许您使用 Postgres 的 verify-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 示例存储库中提供了一个部署 Keycloak 和 PostgresCluster 的示例,但下面的清单使用我们已经运行的 hippo 集群来部署它:
Keycloak
部署 Keycloak 和 PostgresCluster 的示例
官方清单可能水土不服,请参阅:云原生 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 派生的。 这意味着我们不需要知道任何连接凭据,也不需要不安全地传递它们 — 它们直接可供应用程序使用!
使用这种方法,您可以将应用程序直接绑定到连接到 Postgres 的 GitOps 管道,而无需事先了解 PGO 将如何部署 Postgres:您的应用程序需要的所有信息都会传播到 Secret!
删除 Postgres 集群
有时需要删除您的集群。如果您一直遵循官方示例,您可以通过简单地运行以下命令来删除您的 Postgres 集群:
kubectl delete -k kustomize/postgres
PGO 将删除与您的集群关联的所有对象。
对于数据保留,这取决于您的 PVC 的保留策略。有关 Kubernetes 如何管理数据保留的更多信息,请参阅关于卷回收的 Kubernetes 文档。
PVC 的保留策略
公众号:黑客下午茶
云原生 PostgreSQL - CrunchyData PGO 教程:创建、连接、删除 Postgres 集群的更多相关文章
- 云原生 PostgreSQL 集群 - PGO:来自 Crunchy Data 的 Postgres Operator
使用 PGO 在 Kubernetes 上运行 Cloud Native PostgreSQL:来自 Crunchy Data 的 Postgres Operator! Cloud Native Po ...
- 云原生 PostgreSQL 集群 - PGO:5分钟快速上手
前提条件 请确保您的主机上安装了以下实用程序: kubectl git 安装 第 1 步:下载示例 首先,转到 GitHub 并 fork Postgres Operator 示例存储库: https ...
- keepalived工作原理和配置说明 腾讯云VPC内通过keepalived搭建高可用主备集群
keepalived工作原理和配置说明 腾讯云VPC内通过keepalived搭建高可用主备集群 内网路由都用mac地址 一个mac地址绑定多个ip一个网卡只能一个mac地址,而且mac地址无法改,但 ...
- Spring Boot 2.x基础教程:使用EhCache缓存集群
上一篇我们介绍了在Spring Boot中整合EhCache的方法.既然用了ehcache,我们自然要说说它的一些高级功能,不然我们用默认的ConcurrentHashMap就好了.本篇不具体介绍Eh ...
- eclipse连接远程hadoop集群开发时权限不足问题解决方案
转自:http://blog.csdn.net/shan9liang/article/details/9734693 eclipse连接远程hadoop集群开发时报错 Exception in t ...
- RabbitMQ入门教程(十五):普通集群和镜像集群
原文:RabbitMQ入门教程(十五):普通集群和镜像集群 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.c ...
- spring cloud系列教程第六篇-Eureka集群版
spring cloud系列教程第六篇-Eureka集群版 本文主要内容: 本文来源:本文由凯哥Java(kaigejava)发布在博客园博客的.转载请注明 1:Eureka执行步骤理解 2:集群原理 ...
- wsl2 ubuntu20.04 上使用 kubeadm 创建一个单主集群
wsl2 ubuntu20.04 上使用 kubeadm 创建一个单主集群 官方文档使用 kubeadm 创建一个单主集群 环境初始化 建议尽可能初始化环境,命令wsl --unregister Ub ...
- eclipse连接远程hadoop集群开发时0700问题解决方案
eclipse连接远程hadoop集群开发时报错 错误信息: Exception in thread "main" java.io.IOException:Failed to se ...
随机推荐
- spring是线程安全的吗
spring默认bean是单例无状态的,我们交给spring管理的service,controller都是一个单例的bean,也就是说多个线程共享一个实例. 如果你在这种类里写成员变量,那这个变量的访 ...
- 嫌Excel VBA执行速度慢,这些建议你一定要看
Excel是办公利器,这无需多言.尤其在办公室,Excel用的熟练与否,会的Excel知识点多不多,很大程度上决定了你工作是否高效,能否按时打卡下班.可我们也时常听到这样的吐槽:Excel好是好,可就 ...
- leetcode 54. 螺旋矩阵 及 59. 螺旋矩阵 II
54. 螺旋矩阵 问题描述 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, ...
- JavaScript创建和获取时间的方法
一.获取时间常用方法 1.创建时间对象 var time=new Date() //创建当前的时间信息对象 var time1=new Date(2022,1,1,10,25,30) //创建2022 ...
- 【记录一个问题】thanos receiver在tsdb切换期间,导致remote write接口失败增加
如图:配置了thanos receiver落盘的时间周期为10分钟,结果导致在切换tsdb期间,remote write接口的失败率增高. 目前看来,解决办法就是上游增加重试.
- 【记录一个问题】linux+opencv+cuvid解码1080P视频,当使用CUDA核函数的时候,必然崩溃
崩溃的信息如下: 1 OpenCV(4.1.0-dev) Error: Gpu API call (invalid configuration argument) in videoDecPostPro ...
- manjaro20安装TIM
安装 yaourt -S deepin-wine-tim 失败 yaourt -S deepin.qq.office 成功,但是tim版本没有待办,版本比较旧. 配置分辨率 https://blog. ...
- Cesium和Kaarta用高分辨率激光雷达可视化室内和地下环境
Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ Cesium使急救人员和军事操作人员更容易快速评估和了解密集和不 ...
- POSIX之共享内存
shm_write.c: #include<stdio.h> #include<stdlib.h> #include <stdlib.h> #include < ...
- C++构造函数语义学(二)(基于C++对象模型)
带有虚函数的情况. 下面情况编译器也会在需要的时候为其合成. 1.如果一个类自己声明为虚函数. 1 #include<iostream> 2 using namespace std; 3 ...