使用 Zalando 將 PostgreSQL 部署至 GKE

本指南說明如何使用 Zalando Postgres 運算子,將 Postgres 叢集部署至 Google Kubernetes Engine (GKE)。

PostgreSQL 是功能強大的開放原始碼物件關聯式資料庫系統,經過數十年的積極開發,在可靠性、功能強大和效能方面享有盛名。

本指南適用於平台管理員、雲端架構師和營運專員。這些人員有興趣在 GKE 上執行 PostgreSQL 做為資料庫應用程式,而不是使用 PostgreSQL 適用的 Cloud SQL

目標

  • 規劃及部署 Postgres 適用的 GKE 基礎架構
  • 部署及設定 Zalando Postgres 運算子
  • 使用運算子設定 Postgres,確保可用性、安全性、可觀測性和效能

優點

Zalando 提供以下優點:

  • 以 Kubernetes 原生方式宣告式地管理及設定 PostgreSQL 叢集
  • Patroni 提供高可用性
  • 支援使用 Cloud Storage 值區管理備份
  • Postgres 叢集變更的滾動式更新,包括快速子版本更新
  • 聲明式 使用者 管理:使用自訂資源產生及輪替密碼
  • 支援 TLS、憑證輪替和連線集區
  • 叢集複製和資料複製

部署架構

在本教學課程中,您將使用 Zalando Postgres 運算子,在 GKE 中部署及設定高可用性 Postgres 叢集。叢集有一個領導者備用資源,以及兩個由 Patroni 管理的待命 (唯讀) 備用資源。Patroni 是由 Zalando 維護的開放原始碼解決方案,可為 Postgres 提供高可用性和自動容錯移轉功能。如果主要備用資源發生故障,系統會自動將一個待命備用資源升級為主要備用資源。

您也會為 Postgres 部署高可用性區域 GKE 叢集,其中有多個 >Kubernetes 節點分散在多個可用區。這項設定有助於確保容錯能力、擴充性和地理位置備援。這項功能可進行滾動式更新和維護,同時提供運作時間和可用性的服務水準協議。詳情請參閱「區域叢集」。

下圖顯示在 GKE 叢集的多個節點和可用區中執行的 Postgres 叢集:

在圖中,Postgres StatefulSet 部署在三個不同可用區的三個節點上。您可以透過在postgresql自訂資源規格中設定必要的 Pod 相依性和反相依性規則,控管 GKE 如何部署至節點。如果一個可用區失效,使用建議的設定時,GKE 會在叢集中的其他可用節點上重新排定 Pod。如要保存資料,請使用 SSD 磁碟 (premium-rwo StorageClass),由於 SSD 磁碟的延遲時間短且 IOPS 高,因此在大多數情況下,建議用於高負載資料庫。

費用

在本文件中,您會使用下列 Google Cloud的計費元件:

如要根據預測用量估算費用,請使用 Pricing Calculator

初次使用 Google Cloud 的使用者可能符合免費試用期資格。

完成本文所述工作後,您可以刪除建立的資源,避免繼續計費,詳情請參閱「清除所用資源」。

事前準備

Cloud Shell 已預先安裝本教學課程所需的軟體,包括 kubectlgcloud CLIHelmTerraform。如果您未使用 Cloud Shell,則必須安裝 gcloud CLI。

  1. 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
  2. 安裝 Google Cloud CLI。

  3. 若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  4. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  5. 建立或選取 Google Cloud 專案

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您已獲授角色,即可選取任何專案。
    • 建立專案:如要建立專案,您需要具備專案建立者角色 (roles/resourcemanager.projectCreator),其中包含 resourcemanager.projects.create 權限。瞭解如何授予角色
    • 建立 Google Cloud 專案:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替換為您要建立的 Google Cloud 專案名稱。

    • 選取您建立的 Google Cloud 專案:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替換為 Google Cloud 專案名稱。

  6. 確認專案已啟用計費功能 Google Cloud

  7. 啟用 Compute Engine、IAM、GKE 和 GKE 備份 API:

    啟用 API 時所需的角色

    如要啟用 API,您需要具備服務使用情形管理員 IAM 角色 (roles/serviceusage.serviceUsageAdmin),其中包含 serviceusage.services.enable 權限。瞭解如何授予角色

    gcloud services enable compute.googleapis.com iam.googleapis.com container.googleapis.com gkebackup.googleapis.com
  8. 安裝 Google Cloud CLI。

  9. 若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  10. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  11. 建立或選取 Google Cloud 專案

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您已獲授角色,即可選取任何專案。
    • 建立專案:如要建立專案,您需要具備專案建立者角色 (roles/resourcemanager.projectCreator),其中包含 resourcemanager.projects.create 權限。瞭解如何授予角色
    • 建立 Google Cloud 專案:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替換為您要建立的 Google Cloud 專案名稱。

    • 選取您建立的 Google Cloud 專案:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替換為 Google Cloud 專案名稱。

  12. 確認專案已啟用計費功能 Google Cloud

  13. 啟用 Compute Engine、IAM、GKE 和 GKE 備份 API:

    啟用 API 時所需的角色

    如要啟用 API,您需要具備服務使用情形管理員 IAM 角色 (roles/serviceusage.serviceUsageAdmin),其中包含 serviceusage.services.enable 權限。瞭解如何授予角色

    gcloud services enable compute.googleapis.com iam.googleapis.com container.googleapis.com gkebackup.googleapis.com
  14. 將角色授予使用者帳戶。針對下列每個 IAM 角色,執行一次下列指令: roles/storage.objectViewer, roles/container.admin, roles/iam.serviceAccountAdmin, roles/compute.admin, roles/gkebackup.admin, roles/monitoring.viewer

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE

    更改下列內容:

    • PROJECT_ID:專案 ID。
    • USER_IDENTIFIER:使用者帳戶的 ID。 例如:myemail@example.com
    • ROLE:授予使用者帳戶的 IAM 角色。

設定環境

如要設定環境,請按照下列步驟操作

  1. 設定環境變數:

    export PROJECT_ID=PROJECT_ID
    export KUBERNETES_CLUSTER_PREFIX=postgres
    export REGION=us-central1
    

    PROJECT_ID 替換為 Google Cloud專案 ID

  2. 複製 GitHub 存放區:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    
  3. 變更為工作目錄:

    cd kubernetes-engine-samples/databases/postgres-zalando
    

建立叢集基礎架構

在本節中,您將執行 Terraform 指令碼,建立高可用性的區域性 GKE 私人叢集。

您可以使用標準或 Autopilot 叢集安裝運算子。

標準

下圖顯示部署在三個不同可用區的私有區域標準 GKE 叢集:

部署這項基礎架構:

export GOOGLE_OAUTH_ACCESS_TOKEN=$(gcloud auth print-access-token)
terraform -chdir=terraform/gke-standard init
terraform -chdir=terraform/gke-standard apply \
  -var project_id=${PROJECT_ID} \
  -var region=${REGION} \
  -var cluster_prefix=${KUBERNETES_CLUSTER_PREFIX}

系統顯示提示訊息時,請輸入 yes。這個指令可能需要幾分鐘才能完成,且叢集會顯示就緒狀態。

Terraform 會建立下列資源:

  • Kubernetes 節點的虛擬私有雲網路和私有子網路
  • 透過 NAT 存取網際網路的路由器
  • us-central1 區域的私人 GKE 叢集
  • 啟用自動調度資源功能的節點集區 (每個可用區一到兩個節點,每個可用區至少一個節點)
  • 具備記錄與監控權限的 ServiceAccount
  • 使用 Backup for GKE 進行災難復原
  • 使用 Google Cloud Managed Service for Prometheus 監控叢集

輸出結果會與下列內容相似:

...
Apply complete! Resources: 14 added, 0 changed, 0 destroyed.
...

Autopilot

下圖顯示私人區域 Autopilot GKE 叢集:

部署基礎架構:

export GOOGLE_OAUTH_ACCESS_TOKEN=$(gcloud auth print-access-token)
terraform -chdir=terraform/gke-autopilot init
terraform -chdir=terraform/gke-autopilot apply \
  -var project_id=${PROJECT_ID} \
  -var region=${REGION} \
  -var cluster_prefix=${KUBERNETES_CLUSTER_PREFIX}

系統顯示提示訊息時,請輸入 yes。這個指令可能需要幾分鐘才能完成,且叢集會顯示就緒狀態。

Terraform 會建立下列資源:

  • Kubernetes 節點的虛擬私有雲網路和私有子網路
  • 透過 NAT 存取網際網路的路由器
  • us-central1 區域的私人 GKE 叢集
  • 具備記錄與監控權限的 ServiceAccount
  • 使用 Google Cloud Managed Service for Prometheus 監控叢集

輸出結果會與下列內容相似:

...
Apply complete! Resources: 12 added, 0 changed, 0 destroyed.
...

連線至叢集

設定 kubectl 與叢集通訊:

gcloud container clusters get-credentials ${KUBERNETES_CLUSTER_PREFIX}-cluster --location ${REGION}

將 Zalando 運算子部署至叢集

使用 Helm 圖表將 Zalando 運算子部署至 Kubernetes 叢集。

  1. 新增 Zalando 運算子 Helm 資訊套件存放區:

    helm repo add postgres-operator-charts https://opensource.zalando.com/postgres-operator/charts/postgres-operator
    
  2. 為 Zalando 運算子和 Postgres 叢集建立命名空間:

    kubectl create ns postgres
    kubectl create ns zalando
    
  3. 使用 Helm 指令列工具部署 Zalando 運算子:

    helm install postgres-operator postgres-operator-charts/postgres-operator -n zalando \
        --set configKubernetes.enable_pod_antiaffinity=true \
        --set configKubernetes.pod_antiaffinity_preferred_during_scheduling=true \
        --set configKubernetes.pod_antiaffinity_topology_key="topology.kubernetes.io/zone" \
        --set configKubernetes.spilo_fsgroup="103"
    

    您無法直接在代表 Postgres 叢集的自訂資源上設定 podAntiAffinity 設定。請改為在運算子設定中,為所有 Postgres 叢集設定全域設定。podAntiAffinity

  4. 使用 Helm 檢查 Zalando 運算子的部署狀態:

    helm ls -n zalando
    

    輸出結果會與下列內容相似:

    NAME                 NAMESPACE    REVISION    UPDATED                                STATUS      CHART                       APP VERSION
    postgres-operator    zalando     1           2023-10-13 16:04:13.945614 +0200 CEST    deployed    postgres-operator-1.10.1    1.10.1
    

部署 Postgres

Postgres 叢集執行個體的基本設定包含下列元件:

  • 三個 Postgres 副本:一個主要副本和兩個待機副本。
  • 一個 CPU 要求和兩個 CPU 限制的 CPU 資源分配,以及 4 GB 記憶體要求和限制。
  • 為每個工作負載設定容許條件、nodeAffinitiestopologySpreadConstraints,確保工作負載在 Kubernetes 節點之間適當分配,並利用各自的節點集區和不同可用區。

這項設定代表建立可供正式環境使用的 Postgres 叢集所需的基本設定。

下列資訊清單說明 Postgres 叢集:

apiVersion: "acid.zalan.do/v1"
kind: postgresql
metadata:
  name: my-cluster
spec:
  dockerImage: ghcr.io/zalando/spilo-15:3.0-p1
  teamId: "my-team"
  numberOfInstances: 3
  users:
    mydatabaseowner:
    - superuser
    - createdb
    myuser: []
  databases:
    mydatabase: mydatabaseowner
  postgresql:
    version: "15"
    parameters:
      shared_buffers: "32MB"
      max_connections: "10"
      log_statement: "all"
      password_encryption: scram-sha-256
  volume:
    size: 5Gi
    storageClass: premium-rwo
  enableShmVolume: true
  podAnnotations:
    cluster-autoscaler.kubernetes.io/safe-to-evict: "true"
  tolerations:
  - key: "app.stateful/component"
    operator: "Equal"
    value: "postgres-operator"
    effect: NoSchedule
  nodeAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 1
      preference:
        matchExpressions:
        - key: "app.stateful/component"
          operator: In
          values:
          - "postgres-operator"
  resources:
    requests:
      cpu: "1"
      memory: 4Gi
    limits:
      cpu: "2"
      memory: 4Gi
  sidecars:
    - name: exporter
      image: quay.io/prometheuscommunity/postgres-exporter:v0.14.0
      args:
      - --collector.stat_statements
      ports:
      - name: exporter
        containerPort: 9187
        protocol: TCP
      resources:
        limits:
          cpu: 500m
          memory: 256M
        requests:
          cpu: 100m
          memory: 256M
      env:
      - name: "DATA_SOURCE_URI"
        value: "localhost/postgres?sslmode=require"
      - name: "DATA_SOURCE_USER"
        value: "$(POSTGRES_USER)"
      - name: "DATA_SOURCE_PASS"
        value: "$(POSTGRES_PASSWORD)"

這個資訊清單包含下列欄位:

  • spec.teamId:您選擇的叢集物件前置字串
  • spec.numberOfInstances:叢集的執行個體總數
  • spec.users:具有權限的使用者清單
  • spec.databases:資料庫清單,格式為 dbname: ownername
  • spec.postgresql:postgres 參數
  • spec.volume:永久磁碟參數
  • spec.tolerations:容許條件 Pod 範本,可讓叢集 Pod 排定在 pool-postgres 節點上
  • spec.nodeAffinitynodeAffinity Pod 範本,可告知 GKE 叢集 Pod 偏好排程在 pool-postgres 節點上。
  • spec.resources:叢集 Pod 的要求和限制
  • spec.sidecars:補充容器清單,包含 postgres-exporter

詳情請參閱 Postgres 說明文件中的叢集資訊清單參考資料

建立基本 Postgres 叢集

  1. 使用基本設定建立新的 Postgres 叢集:

    kubectl apply -n postgres -f manifests/01-basic-cluster/my-cluster.yaml
    

    這個指令會建立 Zalando 運算子的 PostgreSQL 自訂資源,並包含下列項目:

    • CPU 和記憶體要求與限制
    • taint 和親和性,可將佈建的 Pod 副本分散到各個 GKE 節點。
    • 資料庫
    • 兩位具備資料庫擁有者權限的使用者
    • 沒有權限的使用者
  2. 等待 GKE 啟動必要的工作負載:

    kubectl wait pods -l cluster-name=my-cluster  --for condition=Ready --timeout=300s -n postgres
    

    這個指令可能需要幾分鐘才能完成。

  3. 確認 GKE 是否已建立 Postgres 工作負載:

    kubectl get pod,svc,statefulset,deploy,pdb,secret -n postgres
    

    輸出結果會與下列內容相似:

    NAME                                    READY   STATUS  RESTARTS   AGE
    pod/my-cluster-0                        1/1     Running   0         6m41s
    pod/my-cluster-1                        1/1     Running   0         5m56s
    pod/my-cluster-2                        1/1     Running   0         5m16s
    pod/postgres-operator-db9667d4d-rgcs8   1/1     Running   0         12m
    
    NAME                        TYPE        CLUSTER-IP  EXTERNAL-IP   PORT(S)   AGE
    service/my-cluster          ClusterIP   10.52.12.109   <none>       5432/TCP   6m43s
    service/my-cluster-config   ClusterIP   None        <none>      <none>  5m55s
    service/my-cluster-repl     ClusterIP   10.52.6.152 <none>      5432/TCP   6m43s
    service/postgres-operator   ClusterIP   10.52.8.176 <none>      8080/TCP   12m
    
    NAME                        READY   AGE
    statefulset.apps/my-cluster   3/3   6m43s
    
    NAME                                READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/postgres-operator   1/1     1           1           12m
    
    NAME                                                MIN AVAILABLE   MAX UNAVAILABLE   ALLOWED DISRUPTIONS   AGE
    poddisruptionbudget.policy/postgres-my-cluster-pdb   1              N/A             0                   6m44s
    
    NAME                                                            TYPE                DATA   AGE
    secret/my-user.my-cluster.credentials.postgresql.acid.zalan.do  Opaque              2   6m45s
    secret/postgres.my-cluster.credentials.postgresql.acid.zalan.do   Opaque            2   6m44s
    secret/sh.helm.release.v1.postgres-operator.v1                  helm.sh/release.v1   1      12m
    secret/standby.my-cluster.credentials.postgresql.acid.zalan.do  Opaque              2   6m44s
    secret/zalando.my-cluster.credentials.postgresql.acid.zalan.do  Opaque              2   6m44s
    

運算子會建立下列資源:

  • Postgres StatefulSet,可控制三個 Postgres Pod 副本
  • PodDisruptionBudgets,確保至少有一個可用的副本
  • my-cluster 服務,僅以領導者副本為目標
  • my-cluster-repl 服務,用於公開 Postgres 連接埠,以供連入連線和 Postgres 副本之間的複製作業使用
  • my-cluster-config 無標題服務,用於取得執行中的 Postgres Pod 副本清單
  • 密鑰,內含使用者憑證,用於存取資料庫,以及在 Postgres 節點之間進行複製

向 Postgres 驗證

您可以建立 Postgres 使用者,並指派資料庫權限。舉例來說,下列資訊清單說明指派使用者和角色的自訂資源:

apiVersion: "acid.zalan.do/v1"
kind: postgresql
metadata:
  name: my-cluster
spec:
  ...
  users:
    mydatabaseowner:
    - superuser
    - createdb
    myuser: []
  databases:
    mydatabase: mydatabaseowner

在這個資訊清單中:

  • mydatabaseowner 使用者具有 SUPERUSERCREATEDB 角色,可享有完整管理員權限 (即管理 Postgres 設定、建立新資料庫、資料表和使用者)。請勿與客戶共用這個使用者。舉例來說,Cloud SQL「不允許」客戶存取具備 SUPERUSER 角色的使用者。
  • myuser使用者未獲指派任何角色。這項做法符合最佳做法,也就是使用 SUPERUSER 建立最低權限使用者。mydatabaseowner 會授予 myuser 細項權利。為確保安全,您應只與用戶端應用程式分享 myuser 憑證。

儲存密碼

您應該使用scram-sha-256 建議的密碼儲存方法。舉例來說,下列資訊清單說明自訂資源,該資源使用 postgresql.parameters.password_encryption 欄位指定 scram-sha-256 加密:

apiVersion: "acid.zalan.do/v1"
kind: postgresql
metadata:
  name: my-cluster
spec:
  ...
  postgresql:
    parameters:
      password_encryption: scram-sha-256

輪替使用者憑證

您可以透過 Zalando 輪替儲存在 Kubernetes Secret 中的使用者憑證。舉例來說,下列資訊清單會說明自訂資源,該資源使用 usersWithSecretRotation 欄位定義使用者憑證輪替:

apiVersion: "acid.zalan.do/v1"
kind: postgresql
metadata:
  name: my-cluster
spec:
  ...
  usersWithSecretRotation:
  - myuser
  - myanotheruser
  - ...

驗證範例:連線至 Postgres

本節說明如何部署 Postgres 用戶端範例,並使用 Kubernetes 密鑰中的密碼連線至資料庫。

  1. 執行用戶端 Pod,與 Postgres 叢集互動:

    kubectl apply -n postgres -f manifests/02-auth/client-pod.yaml
    

    系統會從相關的 Secret 取得 myusermydatabaseowner 使用者的憑證,並以環境變數的形式掛接至 Pod。

  2. Pod 準備就緒時,請按照下列步驟連線:

    kubectl wait pod postgres-client --for=condition=Ready --timeout=300s -n postgres
    kubectl exec -it postgres-client -n postgres -- /bin/bash
    
  3. 連線至 Postgres,並嘗試使用以下憑證建立新資料表:myuser

    PGPASSWORD=$CLIENTPASSWORD psql \
      -h my-cluster \
      -U $CLIENTUSERNAME \
      -d mydatabase \
      -c "CREATE TABLE test (id serial PRIMARY KEY, randomdata VARCHAR ( 50 ) NOT NULL);"
    

    指令應會失敗,並顯示類似下列內容的錯誤:

    ERROR:  permission denied for schema public
    LINE 1: CREATE TABLE test (id serial PRIMARY KEY, randomdata VARCHAR...
    

    這項指令會失敗,因為根據預設,使用者必須獲得指派的權限,才能登入 Postgres 並列出資料庫。

  4. 使用 mydatabaseowner 憑證建立資料表,並將資料表的所有權限授予 myuser

    PGPASSWORD=$OWNERPASSWORD psql \
      -h my-cluster \
      -U $OWNERUSERNAME \
      -d mydatabase \
      -c "CREATE TABLE test (id serial PRIMARY KEY, randomdata VARCHAR ( 50 ) NOT NULL);GRANT ALL ON test TO myuser;GRANT ALL ON SEQUENCE test_id_seq TO myuser;"
    

    輸出結果會與下列內容相似:

    CREATE TABLE
    GRANT
    GRANT
    
  5. 使用 myuser 憑證將隨機資料插入資料表:

    for i in {1..10}; do
      DATA=$(tr -dc A-Za-z0-9 </dev/urandom | head -c 13)
      PGPASSWORD=$CLIENTPASSWORD psql \
      -h my-cluster \
      -U $CLIENTUSERNAME \
      -d mydatabase \
      -c "INSERT INTO test(randomdata) VALUES ('$DATA');"
    done
    

    輸出結果會與下列內容相似:

    INSERT 0 1
    INSERT 0 1
    INSERT 0 1
    INSERT 0 1
    INSERT 0 1
    INSERT 0 1
    INSERT 0 1
    INSERT 0 1
    INSERT 0 1
    INSERT 0 1
    
  6. 取得您插入的值:

    PGPASSWORD=$CLIENTPASSWORD psql \
      -h my-cluster \
      -U $CLIENTUSERNAME \
      -d mydatabase \
      -c "SELECT * FROM test;"
    

    輸出結果會與下列內容相似:

    id |  randomdata
    ----+---------------
      1 | jup9HYsAjwtW4
      2 | 9rLAyBlcpLgNT
      3 | wcXSqxb5Yz75g
      4 | KoDRSrx3muD6T
      5 | b9atC7RPai7En
      6 | 20d7kC8E6Vt1V
      7 | GmgNxaWbkevGq
      8 | BkTwFWH6hWC7r
      9 | nkLXHclkaqkqy
     10 | HEebZ9Lp71Nm3
    (10 rows)
    
  7. 退出 Pod Shell:

    exit
    

瞭解 Prometheus 如何收集 Postgres 叢集的指標

下圖顯示 Prometheus 指標的收集方式:

在圖表中,GKE 私人叢集包含:

  • Postgres Pod,會收集路徑 / 和通訊埠 9187 的指標
  • 以 Prometheus 為基礎的收集器,可處理來自 Postgres Pod 的指標
  • 將指標傳送至 Cloud Monitoring 的 PodMonitoring 資源

Google Cloud Managed Service for Prometheus 支援以 Prometheus 格式收集指標。Cloud Monitoring 會使用整合式資訊主頁顯示 PostgreSQL 指標。

Zalando 會使用 postgres_exporter 元件,以 Prometheus 格式公開叢集指標,做為邊車容器

  1. 建立 labelSelector 資源,以抓取指標: PodMonitoring

    kubectl apply -n postgres -f manifests/03-prometheus-metrics/pod-monitoring.yaml
    
  2. 前往 Google Cloud 控制台的「GKE Clusters Dashboard」(GKE 叢集資訊主頁) 頁面。

    前往 GKE 叢集資訊主頁

    資訊主頁顯示的指標擷取率不是零。

  3. 前往 Google Cloud 控制台的「Dashboards」(資訊主頁) 頁面。

    前往資訊主頁

  4. 開啟 PostgreSQL Prometheus 總覽資訊主頁。資訊主頁會顯示擷取的資料列數量。自動佈建資訊主頁可能需要幾分鐘的時間。

  5. 連線至用戶端 Pod:

    kubectl exec -it postgres-client -n postgres -- /bin/bash
    
  6. 插入隨機資料:

    for i in {1..100}; do
      DATA=$(tr -dc A-Za-z0-9 </dev/urandom | head -c 13)
      PGPASSWORD=$CLIENTPASSWORD psql \
      -h my-cluster \
      -U $CLIENTUSERNAME \
      -d mydatabase \
      -c "INSERT INTO test(randomdata) VALUES ('$DATA');"
    done
    
  7. 重新整理頁面。「資料列」和「區塊」圖表會更新,顯示實際的資料庫狀態。

  8. 退出 Pod Shell:

    exit
    

清除所用資源

刪除專案

    刪除 Google Cloud 專案:

    gcloud projects delete PROJECT_ID

刪除個別資源

  1. 設定環境變數。

    export PROJECT_ID=${PROJECT_ID}
    export KUBERNETES_CLUSTER_PREFIX=postgres
    export REGION=us-central1
    
  2. 執行 terraform destroy 指令:

    export GOOGLE_OAUTH_ACCESS_TOKEN=$(gcloud auth print-access-token)
    terraform  -chdir=terraform/FOLDER destroy \
      -var project_id=${PROJECT_ID} \
      -var region=${REGION} \
      -var cluster_prefix=${KUBERNETES_CLUSTER_PREFIX}
    

    FOLDER 替換為 gke-autopilotgke-standard

    系統顯示提示訊息時,請輸入 yes

  3. 找出所有未連接的磁碟:

    export disk_list=$(gcloud compute disks list --filter="-users:* AND labels.name=${KUBERNETES_CLUSTER_PREFIX}-cluster" --format "value[separator=|](name,zone)")
    
  4. 刪除磁碟:

    for i in $disk_list; do
      disk_name=$(echo $i| cut -d'|' -f1)
      disk_zone=$(echo $i| cut -d'|' -f2|sed 's|.*/||')
      echo "Deleting $disk_name"
      gcloud compute disks delete $disk_name --zone $disk_zone --quiet
    done
    
  5. 刪除 GitHub 存放區:

    rm -r ~/kubernetes-engine-samples/
    

後續步驟