實現過程
postgres-operator支持在postgresqls cr中定義additionalVolumes,用于為pod中指定容器的指定路徑做獨立掛載,詳細使用如下:
apiVersion: acid.zalan.do/v1
kind: postgresql
metadata:
name: pg1
namespace: po
spec:
...
volume:
size: 1Gi
storageClass: local-path
additionalVolumes:
- name: log
mountPath: /home/postgres/pgdata/pgroot/pg_log #容器內掛載路徑
targetContainers:
- postgres
volumeSource:
PersistentVolumeClaim:
claimName: pg-log
readyOnly: false
其中volumnSource就是通用的hostpath、emptydir、網絡存儲、配置文件、pvc等,不包括指定storageclass;
以上使用pvc方式實現分目錄掛載前提就是預先創建pvc;
operator內部實現additionalVolumes的處理在generateStatefulSet->generatePodTemplate,具體細節如下:
如果postgres CR中additionalVolumes不為空,那么operator對additionalVolumes中每一層進行以下解析:
如果mountpath是/home/postgres/pgdata,那么略過該掛載;(pgdata默認用postgresqls cr中spec.volume下的配置)
如果targetContainers是空,那么默認選擇postgres容器;
如果targetContainers是all,表示掛載適用于所有容器(包括postgres sidecar exporter等);
此外targetContainers還可以配置多個容器,但該方式與配置為all互斥;
將additionalVolumes中name及volumnsource配置生成到podTemplate/spec/volumns下;
將additionalVolumes中name及mountPath組成VolumeMounts結構,生成到指定container的volumeMounts中;
實際創建集群后, 反映在sts中如下:
kind: StatefulSet
apiVersion: apps/v1
metadata:
name: pg1
namespace: po
spec:
......
spec:
volumes:
- name: dshm
emptyDir:
medium: Memory
- name: log
persistentVolumeClaim:
claimName: pg-log
containers:
- name: postgres
image: spilo-14:2.1-p4
......
volumeMounts:
- name: pgdata
mountPath: /home/postgres/pgdata
- name: dshm
mountPath: /dev/shm
- name: log
mountPath: /home/postgres/pgdata/pgroot/pg_log
terminationMessagePath: /dev/termination-log
......
volumeClaimTemplates:
- kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pgdata
creationTimestamp: null
annotations:
volume.beta.kubernetes.io/storage-class: local-path
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: local-path
volumeMode: Filesystem
status:
phase: Pending
......
使用效果
通過additionalVolumes的配置可以實現容器內指定路徑使用指定pvc,從而實現分盤掛載,如下所示
PS C:\WINDOWS\system32> kubectl get pvc -n po
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pg-log Bound pvc-df13c2e3-6b17-466d-b780-98cd1b0a8272 322122547200m RWX standard 54m
pgdata-pg1-0 Bound pvc-bfaedb3a-04b9-4218-a397-1308d7d5caa5 1Gi RWO local-path 54m
比如以上將數據主目錄使用localpath方式掛載到主機/opt/local-path-provisioner:
# ls /tmp/hostpath-provisioner/po/pg-log/
postgresql-0.csv postgresql-2.csv postgresql-3.csv postgresql-5.csv postgresql-7.csv
postgresql-1.csv postgresql-2.log postgresql-4.csv postgresql-6.csv
注意點:
數據主目錄由于默認掛載的容器內/home/postgres/pgdata,而pg_log是主目錄的一個子目錄,所以主目錄在主機的掛載路徑中,也是有pg_log這個目錄的,只是該目錄為空,實際pg_log內容在其單獨掛載pv中。