入门
作为安装的一部分,请确保您已完成以下操作:
- 分叉
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 的保留策略