Cụm PostgreSQL gốc mây - PGO: Bắt đầu nhanh trong 5 phút

Điều kiện tiên quyết

Vui lòng đảm bảo máy chủ của bạn đã cài đặt các công cụ sau:

  • kubectl
  • git

Cài đặt

Bước 1: Tải xuống ví dụ

Đầu tiên, hãy truy cập vào GitHub và fork repository ví dụ Postgres Operator:

Sau khi bạn fork repo này, bạn có thể sử dụng lệnh tương tự như sau để tải nó về môi trường làm việc của mình:

TEN_DANG_NHAP_GITHUB="<tên người dùng GitHub của bạn>"
git clone --depth 1 "git@github.com:${TEN_DANG_NHAP_GITHUB}/postgres-operator-examples.git"
cd postgres-operator-examples

Bước 2: Cài đặt PGO, tức là Postgres Operator

Bạn có thể sử dụng lệnh sau để cài đặt PGO, tức là Postgres Operator từ Crunchy Data:

kubectl apply -k kustomize/install

Điều này sẽ tạo một không gian tên có tên postgres-operator và tạo tất cả các đối tượng cần thiết để triển khai PGO.

Để kiểm tra trạng thái cài đặt, bạn có thể chạy lệnh sau:

kubectl -n postgres-operator get pods \
  --selector=postgres-operator.crunchydata.com/control-plane=postgres-operator \
  --field-selector=status.phase=Running

Nếu Pod PGO chạy tốt, bạn sẽ thấy đầu ra tương tự như sau:

NAME                                READY   STATUS    RESTARTS   AGE
postgres-operator-9dd545d64-t4h8d   1/1     Running   0          3s

Tạo cụm Postgres

Hãy tạo một cụm Postgres đơn giản. Bạn có thể thực hiện việc này bằng cách thực thi lệnh sau:

kubectl apply -k kustomize/postgres

Lưu ý:

  • Lưu ý rằng cụm của bạn đã có một Storage Class mặc định

Điều này sẽ tạo một cụm Postgres có tên hippo trong không gian tên postgres-operator. Bạn có thể sử dụng lệnh sau để theo dõi tiến độ của cụm:

kubectl -n postgres-operator describe postgresclusters.postgres-operator.crunchydata.com hippo

Kết nối với cụm Postgres

Là một phần của việc tạo cụm Postgres, Postgres Operator tạo một tài khoản người dùng PostgreSQL. Thông tin đăng nhập của tài khoản này được lưu trữ trong một Secret có tên <clusterName>-pguser-<userName>.

Các thuộc tính trong Secret này cung cấp thông tin để bạn đăng nhập vào cụm PostgreSQL. Chúng bao gồm:

  • user: Tên của tài khoản người dùng.
  • password: Mật khẩu của tài khoản người dùng.
  • dbname: Tên cơ sở dữ liệu mà người dùng có quyền truy cập theo mặc định.
  • host: Tên máy chủ của cơ sở dữ liệu. Điều này tham chiếu đến dịch vụ của instance Postgres chính.
  • port: Cổng mà cơ sở dữ liệu đang lắng nghe.
  • uri: Một URI kết nối PostgreSQL cung cấp tất cả thông tin cần thiết để đăng nhập vào cơ sở dữ liệu Postgres.
  • jdbc-uri: Một URI kết nối JDBC PostgreSQL cung cấp tất cả thông tin cần thiết để đăng nhập vào cơ sở dữ liệu Postgres bằng driver JDBC.

Nếu bạn triển khai cụm Postgres với bộ đệm kết nối PgBouncer, các giá trị khác sẽ được điền vào Secret của người dùng, bao gồm:

  • pgbouncer-host: Tên máy chủ của bộ đệm kết nối PgBouncer. Điều này tham chiếu đến dịch vụ của bộ đệm kết nối PgBouncer.
  • pgbouncer-port: Cổng mà bộ đệm kết nối PgBouncer đang lắng nghe.
  • pgbouncer-uri: Một URI kết nối PostgreSQL cung cấp tất cả thông tin cần thiết để đăng nhập vào cơ sở dữ liệu qua bộ đệm kết nối PgBouncer.
  • pgbouncer-jdbc-uri: Một URI kết nối JDBC PostgreSQL cung cấp tất cả thông tin cần thiết để đăng nhập vào cơ sở dữ liệu bằng driver JDBC qua bộ đệm kết nối PgBouncer.

Lưu ý rằng tất cả các kết nối đều sử dụng TLS. PGO thiết lập PKI cho cụm Postgres của bạn. Bạn cũng có thể chọn mang theo PKI/certificate authority của riêng mình; điều này sẽ được đề cập trong tài liệu sau.

PgBouncer

Kết nối qua psql trong terminal

Kết nối trực tiếp

Nếu bạn ở trong cùng một mạng với cụm PostgreSQL, bạn có thể sử dụng lệnh sau để kết nối trực tiếp với nó:

psql $(kubectl -n postgres-operator get secrets hippo-pguser-hippo -o go-template='{{.data.uri | base64decode}}')

Kết nối bằng chuyển tiếp cổng

Trong terminal mới, tạo một chuyển tiếp cổng:

POD_CHINH=$(kubectl get pod -n postgres-operator -o name \
  -l postgres-operator.crunchydata.com/cluster=hippo,postgres-operator.crunchydata.com/role=master)
kubectl -n postgres-operator port-forward "${POD_CHINH}" 5432:5432

Thiết lập kết nối với cụm PostgreSQL.

TEN_SECRET_NGUOI_DUNG=hippo-pguser-hippo

MAT_KHAU=$(kubectl get secrets -n postgres-operator "${TEN_SECRET_NGUOI_DUNG}" -o go-template='{{.data.password | base64decode}}') \
TEN_NGUOI_DUNG=$(kubectl get secrets -n postgres-operator "${TEN_SECRET_NGUOI_DUNG}" -o go-template='{{.data.user | base64decode}}') \
CO_SO_DU_LIEU=$(kubectl get secrets -n postgres-operator "${TEN_SECRET_NGUOI_DUNG}" -o go-template='{{.data.dbname | base64decode}}') \
psql -h localhost

Thực hành kết nối cụm PostgreSQL với Keycloak

Thông tin được cung cấp trong Secret của người dùng sẽ cho phép bạn kết nối ứng dụng của mình trực tiếp với cơ sở dữ liệu PostgreSQL của bạn.

Ví dụ, hãy kết nối với Keycloak. Keycloak là một công cụ quản lý danh tính nguồn mở phổ biến được hỗ trợ bởi cơ sở dữ liệu PostgreSQL. Sử dụng cụm hippo mà chúng ta đã tạo, chúng ta có thể triển khai tệp kê khai sau:

Keycloak

cat <<EOF >> keycloak.yaml
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
        args: ["start-dev"]
        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_ADMIN
          value: "admin"
        - name: KEYCLOAK_ADMIN_PASSWORD
          value: "admin"
        - name: PROXY_ADDRESS_FORWARDING
          value: "true"
        ports:
        - name: http
          containerPort: 8080
        - name: https
          containerPort: 8443
      restartPolicy: Always

EOF

kubectl apply -f keycloak.yaml


POD_KEYCLOAK=$(kubectl get pod -n postgres-operator -l app.kubernetes.io/name=keycloak -o name)
kubectl -n postgres-operator port-forward ${POD_KEYCLOAK} 8086:8080 --address='0.0.0.0'
# Forwarding from 0.0.0.0:8086 -> 8080

Truy cập http://127.0.0.1:8086

Trong thư mục kustomize/keycloak có một ví dụ đầy đủ về cách triển khai Keycloak bằng Postgres Operator.

Lưu ý:

  • quay.io/keycloak/keycloak:latest, khoa học kéo hình ảnh
  • Đã thực hiện các sửa đổi trên keycloak.yaml như trên

Chúc mừng, cụm Postgres của bạn đã sẵn sàng và đang chạy, và còn có một ứng dụng được kết nối! 👏 👏 👏

Bạn có thể tìm hiểu thêm về postgresclusters tùy chỉnh resource definition qua tài liệu và kubectl explain, tức là:

kubectl explain postgresclusters

postgresclusters tùy chỉnh resource definition

Thẻ: PostgreSQL Kubernetes PGO Postgres Operator Cloud Native

Đăng vào ngày 10 tháng 6 lúc 01:56