雲原生 PostgreSQL - CrunchyData PGO 教程:建立、連線、刪除 Postgres 叢集

為少發表於2022-02-25

入門

作為安裝的一部分,請確保您已完成以下操作:

  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 的保留策略

公眾號:黑客下午茶

相關文章