OpenShift 4.16 버전에 구성된 Quay Registry Operator에서 managed 형태로 구성되는 PostgreSQL Pod가 있다.
PostgreSQL DB용 저장 용도로 PV가 NAS가 아닌 ODF(OpenShift Data Foundation, Ceph 기반)의 RBD(Rados Block Device) 볼륨을 사용하고 있다.
기존의 PV(Persistens Volume), PVC(Persistens Volume Claim)가 deattach 되고 새로운 PV, PVC가 Attached 되었을 경우
기존 데이터를 백업하고 신규 RBD에 데이터를 복구하는 절차에 대해서 정리한다.
$ oc get pv| grep pvc-f050101-e4c0-447e-9198-759793a64f0e
pvc-f050101-e4c0-447e-9198-759793a64f0e 200Gi RWO Retain Available / ocs-storagecluster-ceph-rbd <unset> 229d
Ceph의 RBD Pool 및 RBD Image를 조회 한다.
$ oc get pv -o yaml pvc-f050101-e4c0-447e-9198-759793a64f0e | egrep 'imageName:|pool:'
imageName: csi-vol-86bef23e-5eff-4be1-b025-eb1f16562fcf
pool: ocs-storagecluster-cephblockpool
이전 버전에서는 별도의 Ceph ToolBox 이미지가 필요 했었지만, operator 이미지로 제공된다.
spec.enableCephTools 필드를 추가한다.
$ oc edit storagecluster ocs-storagecluster -n openshift-storage
spec:
enableCephTools: true
[1]: RedHat KCS - Configuring the Rook-Ceph Toolbox in OpenShift Data Foundation 4.x
$ oc get pod -n openshift-storage | grep rook-ceph-tools
NAME READY STATUS RESTARTS AGE
rook-ceph-tools-75f778d7b4-xrxlt 2/2 Running 2 10s
$ oc project openshift-storage
$ oc rsh rook-ceph-tools-75f778d7b4-xrxlt
$ ceph osd pool ls
..
....
ocs-storagecluster-cephblockpool
$ rbd ls -p ocs-storagecluster-cephblockpool
..
....
csi-vol-86bef23e-5eff-4be1-b025-eb1f16562fcf
$ rbd info -p ocs-storagecluster-cephblockpool csi-vol-86bef23e-5eff-4be1-b025-eb1f16562fcf
rbd image 'csi-vol-86bef23e-5eff-4be1-b025-eb1f16562fcf':
size 200GiB in 512000 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: b3c8a194442fb
block_name_prefix: rbd_data.b3c8a194442fb
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flasgs:
create_timestamp: Wed Sep 4 08:27:55 2024
access_timestamp: Wed Sep 4 08:27:55 2024
modify_timestamp: Wed Sep 4 08:27:55 2024
Ceph ToolBox의 Pod 단에서는 PV를 마운트할 수 없어 백업 본을 파일 및 디렉토리를 복사할 수 없으므로,
Bastion에서 custom 이미지를 만들고, 해당 이미지를 Ceph OSD 노드 중 1곳에서 볼륨 마운트하여 백업 본을 복사 및 복구를 진행한다.
ODF Operator에서 제공하는 registry.redhat.io/odf4/rook-ceph-rhel9-operator 이미지는
podman으로 수동으로 구동시 bash 쉘로 접근을 할 수가 없기 때문에, Custom하여 이미지를 빌드해서 사용해야한다.
ENTRYPOINT ["/usr/local/bin/rook"]
CMD [""]
[2]: Rook Ceph Operator - Dockerfile
Root 권한을 가지는 이미지를 생성하며 ENTRYPOINT를 사용하여 무기한 대기할 수 있도록 한다.
$ mkdir ~/ceph-toolbox-custom
$ cd ~/ceph-toolbox-custom
$ vi Dockerfile
FROM registry.redhat.io/odf4/rook-ceph-rhel9-operator
USER 0
ENTRYPOINT trap : TERM INT; sleep infinity & wait
$ podman build --rm -t registry.ocp4.local:5000/odf4/rook-ceph-rhel9-operator:custom .
$ podman push registry.ocp4.local:5000/odf4/rook-ceph-rhel9-operator:custom
혹시 모를 상황에 대비하여, Ceph에서 원본 RBD 볼륨에 대해 스냅샷 백업을 진행한다.
진행간 Ceph OSD 노드로 사용되는 OpenShift 노드(CoreOS) 중 1 곳을 지정하여 ssh or debug node로 접속한다.
$ oc debug node/odf01.ocp4.local
sh-5.1# chroot /host
sh-5.1# bash
[root@odf01 /]#
또는
$ ssh [email protected]
[core@odf01 ~]$ sudo -i
[root@odf01 ~]#
백업을 받을 디렉토리를 core 계정의 홈 디렉토리로 지정한다.
[root@odf01 ~]# mkdir -p /home/core/ceph-backup/quay-postgresql-pvc-f050101-e4c0-447e-9198-759793a64f0e/original-data
[root@odf01 ~]# podman run -d --name "ceph-backup" -v /home/core/ceph-backup:/backup registry.ocp4.local:5000/odf4/rook-ceph-rhel9-operator:custom
[root@odf01 ~]# podman exec -it ceph-backup bash
[root@c4100c4ecdd1 /]#
기존의 openshift-storage 프로젝트(namespace)에 존재하는 Secret, ConfigMap의 정보를 사용해야 하므로, 파일을 생성한다.
해당 파일은 3. Ceph ToolBox 활성화(Bastion) 항목의 Pod로 접근하면 /etc/ceph/ceph.conf, /etc/rook/mon-endpoints, /etc/ceph/keyring 3가지 파일의 확인이 가능하다.
3가지 파일을 Custom Ceph ToolBox Container에 파일로 추가해야 정상 동작한다.
- ceph.conf
[root@c4100c4ecdd1 /]# cat << EOF > /etc/ceph/ceph.conf
[global]
mon_host=172.30.173.195:3300,172.30.194.29:3300,172.30.200.120:3300
[client.admin]
keyring = /etc/ceph/keyring
EOF
- mon-endpoints
[root@c4100c4ecdd1 /]# cat << EOF > /etc/rook/mon-endpoints
a=172.30.173.195:3300,b=172.30.194.29:3300,c=172.30.200.120:3300
EOF
- keyring
[root@c4100c4ecdd1 /]# cat << EOF > /etc/ceph/keyring
[client.admin]
key = AQaeX99m/mmPCXXXdf9csCgRiT2tYcXXXX==
EOF
[root@c4100c4ecdd1 /]# rbd snap create ocs-storagecluster-cephblockpool/csi-vol-86bef23e-5eff-4be1-b025-eb1f16562fcf@quay-postgresql-rbd-snap-20250421
[root@c4100c4ecdd1 /]# rbd snap ls ocs-storagecluster-cephblockpool/csi-vol-86bef23e-5eff-4be1-b025-eb1f16562fcf
SNAPPID NAME SIZE PROTECTED TIMESTAMP
8 quay-postgresql-rbd-snap-20250421 200GiB no Mon Apr 21 11:00:03 2025
[root@c4100c4ecdd1 /]# rbd info ocs-storagecluster-cephblockpool/csi-vol-86bef23e-5eff-4be1-b025-eb1f16562fcf-snap-20250421
rbd image 'csi-vol-86bef23e-5eff-4be1-b025-eb1f16562fcf-snap-20250421':
size 200GiB in 512000 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 967c8f2701e925
block_name_prefix: rbd_data.967c8f2701e925
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flasgs:
create_timestamp: Mon Apr 21 11:00:03 2025
access_timestamp: Mon Apr 21 11:00:03 2025
modify_timestamp: Mon Apr 21 11:00:03 2025
사용자가 실수로 원본 스냅샷을 삭제할 경우를 복구가 되지 않는 상황을 대비하여,
보호(Protect) 모드로 설정해야 해당 스냅샷 이미지를 파일로 복제가 가능하다.
[root@c4100c4ecdd1 /]# rbd protect ocs-storagecluster-cephblockpool/csi-vol-86bef23e-5eff-4be1-b025-eb1f16562fcf@quay-postgresql-rbd-snap-20250421
[4]: Ceph Docs - Protecting a Snapshot
[5]: RedHat Docs - Protecting a block device snapshot
Container 기반에서 /dev/rbdx 형태의 block device를 마운트가 되지 않을 가능성이 많아, 디스크를 이미지 형태(.img)로 추출한다.
[root@c4100c4ecdd1 /]# rbd export \
ocs-storagecluster-cephblockpool/csi-vol-86bef23e-5eff-4be1-b025-eb1f16562fcf-snap-20250421 \
/data/quay-postgresql-pvc-f050101-e4c0-447e-9198-759793a64f0e/quay-postgresql-pvc-f050101-e4c0-447e-9198-759793a64f0e.img
Exporting image: 55% complete...
Exporting image: 62% complete...
Exporting image: 100% complete...done.
백업 된 이미지를 마운트 진행한다.
[root@c4100c4ecdd1 /]# losetup -fP \
/data/quay-postgresql-pvc-f050101-e4c0-447e-9198-759793a64f0e/quay-postgresql-pvc-f050101-e4c0-447e-9198-759793a64f0e.img
[root@c4100c4ecdd1 /]# lsblk | grep loop
/dev/loop0 200G
[root@c4100c4ecdd1 /]# mount /dev/loop0 /mnt
[root@c4100c4ecdd1 /]# ls -al /mnt
total 1
drwxrwsr-x. 3 99 1000920000 741431709 Apr 17 11:07 .
dr-xr-xr-x. 1 root root 741431709 Apr 17 00:00 ..
drwx--S---. 20 1000920000 1000920000 741431709 Apr 17 00:00 userdata
[root@c4100c4ecdd1 /]# cp -ar /mnt/userdata \
/backup/quay-postgresql-pvc-f050101-e4c0-447e-9198-759793a64f0e/original-data
RBD의 경우 block device 형태로 제공이 되기 때문에 Pod 단에서 백업 된 데이터를 복사하기가 쉽지 않다.
(permission denied 발생)
따라서, ODF에서 제공하고 있는 CephFS(NFS)를 추가 생성하고 여기에 백업 데이터를 복사 후 옮기는 작업을 진행한다.
1. Web Console -> Storage -> PersistenVolumeClaims -> Create PersistenVolumeClaims
2. Storage Class에서 ocs-storagecluster-ceph-nfs를 선택.
3. PersistenVolumeClaims Name: quay-postgresql-backup
4. Access mode: RWX
5. Size: 200Gi(백업 데이터 용량 보다 10%이상 필요)
Quay Registry를 구성시 별도의 PostgreSQL 서버가 없는 경우 Operator에서 Pod 형태로 제공한다.
이를 unmanaged로 변경하여 의도적으로 Deployment를 사용자 정의로 제어가 가능할 수 있도록 변경한다.
웹 콘솔에서 아래 처럼 이동한다.
Web Console -> Operators -> Installed Operators -> Project: quay-enterprise -> RedHat Quay -> Quay Registry
이후 Instance 객체(object)의 YAML을 편집하여 아래 내용 중 managed를 false로 변경한다.
spec:
components:
- kind: postgresql
managed: false
백업 된 데이터를 신규 RBD PV에 복사하려면 Root 권한을 부여하여 복사해야 한다.
따라서, quay registy database용 Service Account에 anyuid 권한을 강제로 부여한다.
$ oc adm policy add-scc-to-user anyuid -z registry-quay-database -n quay-enterprise
Deployment에도 Root 권한을 SCC로 부여하고 CephFS로 생성한 quay-postgresql-backup PV를 볼륨 마운트 한다.
$ oc edit deployment registry-quay-database -n quay-enterprise
spec:
template:
spec:
containers:
securityContext:
runAsUser:0
runAsGroup: 0
volumeMounts:
- name: quay-postgresql-backup
mountPath: /cephfs-backup
volumes:
- name: quay-postgresql-backup
persistentVolumeClaim:
claimName: quay-postgresql-backup
PostgreSQL은 nonroot 사용자를 통해 구동을 해야하기 때문에, Pod 상태가 Error, CrashLoopBackOff 상태가 되는 것은 정상이다.
따라서, 백업 본 데이터를 Custom Ceph ToolBox Container에서 CephFS PV(quay-postgresql-backup)에 복사 후 debug pod를 통해 신규 RBD PV에 데이터를 복사해야 한다.
- CephFS Service 확인(Bastion)
$ oc get svc -n openshift-storage | grep rook-ceph-nfs
[root@vdoskap02 00_build]# oc get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
rook-ceph-nfs-ocs-storagecluster-cephnfs ClusterIP 172.30.8.178 <none> 2049/TCP 239d
- Custom Ceph ToolBox Container to CephFS PV로 데이터 파일 복사(CoreOS)
[root@c4100c4ecdd1 /]# mount -t nfs rook-ceph-nfs-ocs-storagecluster-cephnfs.openshift-storage:/csi-vol-99ace46e-7eaae-3ad8-a077-ab7f22548bag /cephfs-backup
[root@c4100c4ecdd1 /]# cd /data/quay-postgresql-pvc-f050101-e4c0-447e-9198-759793a64f0e/quay-postgresql-pvc-f050101-e4c0-447e-9198-759793a64f0e/original-data/
[root@c4100c4ecdd1 /]# cp -ar userdata/ /cephfs-backup/
- Debug Pod 접속 (Bastion)
$ oc project quay-enterprise
$ oc get pod | grep registry-quay-database
NAME READY STATUS RESTARTS AGE
registry-quay-database-688c49fc95-f5mm8 2/2 Running 2 3m
$ oc debug registry-quay-database-688c49fc95-f5mm8
- 기존 디렉토리 UID/GID 확인(Debug Pod)
OpenShift는 프로젝트(namespace) 마다 고유한 UID/GID가 제공 된다.
기존 원본 데이터의 UID/GID가 현재와 맞지 않으면 권한 거부(permission denied)가 발생할 수 있다.
따라서, PostgreSQL이 초기화 했을때의 정보를 확인하고 맞춰야 한다.
(보통은 프로젝트가 삭제 되지 않는 이상 UID/GID 정보는 동일하다.)
# ls -al /var/lib/pgsql/data/userdata
drwx--S---. 20 1000920000 1000920000 741431709 Apr 17 00:00 userdata
- 기존 데이터 삭제(Debug Pod)
PostgreSQL Pod가 초기화 했을때의 DB 디렉토리를 삭제한다.
# rm -rf /var/lib/pgsql/data/userdata
- 백업 데이터 복사(Debug Pod)
백업 데이터를 CephFS PV(quay-postgresql-backup)에서 복사한다.
# cp -ar /cephfs-backup/userdata /var/lib/pgsql/data/
- Debug Pod 종료
백업 데이터를 CephFS PV(quay-postgresql-backup)에서 복사한다.
# exit
Deployment에 SCC 및 PV 볼륨 마운트 부분을 제거 후 replicas를 0으로 변경한다.
replicas를 0으로 변경하는 이유는 5.6. Quay Registry Operator 설정 변경(Web Console) 항목에서
PostgreSQL의 Managed로 설정을 변경하는 순간 Pod가 기동될때 DB 깨짐을 방지하기 위해서 설정한다.
주석(#) 처리한 부분을 라인에서 내용을 삭제 후 replicas: 0을 추가한다.
$ oc edit deployment registry-quay-database -n quay-enterprise
spec:
replicas: 0
template:
spec:
containers:
#securityContext:
# runAsUser:0
# runAsGroup: 0
#volumeMounts:
# - name: quay-postgresql-backup
# mountPath: /cephfs-backup
#volumes:
# - name: quay-postgresql-backup
# persistentVolumeClaim:
# claimName: quay-postgresql-backup
더 이상 Service Account에 Anyuid 권한(root)이 필요 없으므로 제거한다.
$ oc adm policy remove-scc-from-user anyuid -z registry-quay-database -n quay-enterprise
Operator에서 PostgreSQL Pod에 대해 자동 관리가 될 수 있도록 Managed로 변경한다.
웹 콘솔에서 아래 처럼 이동한다.
Web Console -> Operators -> Installed Operators -> Project: quay-enterprise -> RedHat Quay -> Quay Registry
이후 Instance 객체(object)의 YAML을 편집하여 아래 내용 중 managed를 true로 변경한다.
spec:
components:
- kind: postgresql
managed: true
Error 및 CrashLoopBackOff Pod들은 몇초 또는 몇분 이후 시간이 지나면 자동으로 Self-Healing 되어 정상 구동이 되면서 복구가 완료 된다.
$ oc get pod -n quay-enterprise
NAME READY STATUS RESTARTS AGE
registry-quay-app-84559564f7-5x6sf 1/1 Running 0 47m
registry-quay-app-84559564f7-g6s4g 1/1 Running 0 48m
registry-quay-app-upgrade-b84p4 0/1 Completed 0 49m
registry-quay-database-86d645f54-k8x7r 1/1 Running 0 47m
registry-quay-mirror-69bcb6878d-9mddx 1/1 Running 0 47m
registry-quay-mirror-69bcb6878d-hvq2l 1/1 Running 0 47m
registry-quay-redis-9d99d8fbf-5bl5t 1/1 Running 0 47m
끝.