此项目采用单实例部署,切勿在生产环境使用!

1. 说明

此文档需要镜像 postgres:14。部署完成后,集群内部地址为:

1
svc-postgres.core-middle.svc.cluster.local:5432

2. 创建 PVC

导入以下配置,创建PVC。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-postgres-data
  namespace: core-middle
  labels:
    app: postgres
spec:
  storageClassName: 'sc-nfs-share'
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 100Gi

3. 管理员用户配置

将管理员用户配置导入到 Secret 中。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
apiVersion: v1
kind: Secret
metadata:
  name: secret-postgres-root
  namespace: core-middle
  labels:
    app: postgres
type: Opaque
stringData:
  username: 'postgres'
  password: 'postgres-admin-password' (1)
其中
1 你需要为管理员用户配置更为复杂的密码

4. 创建 PostgresSQL 服务器

使用以下配置创建 PostgresSQL 服务器。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sts-postgres
  namespace: core-middle
  labels:
    app: postgres
spec:
  serviceName: svc-postgres
  selector:
    matchLabels:
      app: postgres
  replicas: 1
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgres
          image: postgres:14
          volumeMounts:
            - name: postgres-data
              mountPath: /var/lib/postgresql/data
          env:
            - name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: secret-postgres-root
                  key: password
            - name: POSTGRES_USER
              valueFrom:
                secretKeyRef:
                  name: secret-postgres-root
                  key: username
            - name: 'PGDATA'
              value: "/var/lib/postgresql/data/pgdata"
          resources:
            requests:
              memory: 3Gi
      volumes:
        - name: postgres-data
          persistentVolumeClaim:
            claimName: pvc-postgres-data

5. 关联Service

将 PostgresSQL 服务关联到 Service 下。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
apiVersion: v1
kind: Service
metadata:
  labels:
    app: postgres
  name: svc-postgres
  namespace: core-middle
spec:
  ports:
    - port: 5432
      targetPort: 5432
  selector:
    app: postgres

6. 测试

使用以下命令查看实例部署情况:

1
kubectl get pods,secrets,services,deployments,pvc -n core-middle -l app=postgres

如果一切无误的话可使用以下命令测试 PostgresSQL ,输出结果如下所示。

测试命令
1
2
3
PG_NAME=$(kubectl get secrets -n core-middle secret-postgres-root -o jsonpath='{.data.username}' | base64 -d)
PG_PASSWD=$(kubectl get secrets -n core-middle secret-postgres-root  -o jsonpath='{.data.password}' | base64 -d)
kubectl exec -it -n core-middle pods/sts-postgres-0 -- psql  postgresql://$PG_NAME:$PG_PASSWD@svc-postgres.core-middle.svc.cluster.local:5432 -c "select 1"
输出结果
1
2
3
4
 ?column?
----------
        1
(1 row)