入門
作為安裝的一部分,請確保您已完成以下操作:
- 分叉
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 的保留策略
公眾號:黑客下午茶