아래 1편에서 고도화할 작업을 정리해두었다.
이번 포스팅에서는
- gitlab project 생성(백업 형상관리용)
- Dockerfile 작성
- start.sh 스크립트
을 다룰 것이다.
gitlab project 생성
간단히 그룹>서브그룹>프로젝트 형태로 만들었다.
Group Name | OCP |
Sub Group Name | BACKUP |
Project Name | 3scale-backup |
(gitlab은 aro에 구축함.)
Dockerfile 작성
FROM registry.access.redhat.com/ubi8/ubi
# USER root
LABEL maintainer="Joonhyeok Lim"
LABEL title="backup base image create"
LABEL version="1.0"
LABEL description="어플리케이션 백업용 베이스 이미지"
# Update image
RUN yum update --disablerepo=* --enablerepo=ubi-8-appstream --enablerepo=ubi-8-baseos -y && rm -rf /var/cache/yum
RUN yum install jq rsync wget zip -y
# User Add
RUN groupadd -r -g 2000 backup && useradd -r -d /home/backupuser -u 1000 -g backup backupuser
RUN mkdir /home/backupuser && chown backupuser. /home/backupuser
RUN mkdir /pv-storage
COPY start.sh /home/backupuser
# oci ADD
WORKDIR /home/backupuser
RUN wget https://downloads-openshift-console.apps.x6m10kjj.australiaeast.aroapp.io/amd64/linux/oc.tar
RUN tar -xvf oc.tar
RUN cp ./oc /usr/bin
# Add default Web page and expose port
RUN echo "This `oc` CMD install"
USER backupuser
# Start the service
CMD ["oc"]
base 이미지는 redhat에서 인증된 ubi 를 사용하였고,
설치 패키지는 아래의 용도로 설치하였다.
jq | json 파싱 용도 |
rsync | 파일 이동 복사 용도 |
wget | 외부 파일 다운 (oc cli) 용도 |
zip | 백업파일 압축 용도 |
일반유저 추가사항은 아래내용으로 하였다.
일반유저명 : backupuser | uid : 1000 |
그룹명 : backup | gid : 2000 |
backupuser 홈 디렉토리 | /home/backupuser |
다음으로 pv 마운트위치에 폴더를 생성해주고,
백업실행 쉘스크립트를 홈디렉토리에 넣어주었다.
oc cli 는 ocp가 정상 구동 중이라면 다운로드 콘솔 url에
/amd64/linux/oc.tar
파일에 링크되어있다.(다른 운영체제도 지원)
wget으로 다운받고, 압축을 해제한 뒤 /usr/bin 폴더에 이동시켜주었다.
마지막으로 backupuser 계정으로 컨테이너를 실행시키고,
간단히 oc 명령어를 출력하는 것으로 제작하였따.
start.sh
#!/bin/sh
# oc login
TOKEN=`cat /var/run/secrets/kubernetes.io/serviceaccount/token`
oc login --server=https://api.x6m10kjj.australiaeast.aroapp.io:6443 --token=$TOKEN
oc project 3scale
# 작업 디렉토리 생성
export BACK_DIR=`date +%Y%m%d_%H%M%S`
mkdir -p /home/backupuser/$BACK_DIR/dir
cd /home/backupuser/$BACK_DIR
# 백업 시작
echo '###################### Secret/ConfigMap Backup START ######################'
oc get secrets system-smtp -o json > system-smtp.json
oc get secrets system-seed -o json > system-seed.json
oc get secrets system-database -o json > system-database.json
oc get secrets backend-internal-api -o json > backend-internal-api.json
oc get secrets system-events-hook -o json > system-events-hook.json
oc get secrets system-app -o json > system-app.json
oc get secrets system-recaptcha -o json > system-recaptcha.json
oc get secrets system-redis -o json > system-redis.json
oc get secrets zync -o json > zync.json
oc get secrets system-master-apicast -o json > system-master-apicast.json
oc get configmaps system-environment -o json > system-environment.json
oc get configmaps apicast-environment -o json > apicast-environment.json
echo '###################### Secret/ConfigMap Backup END ########################'
echo '###################### Mysql Backup START ########################'
oc rsh $(oc get pods -l 'deploymentConfig=system-mysql' -o json | jq -r '.items[0].metadata.name') bash -c 'export MYSQL_PWD=${MYSQL_ROOT_PASSWORD}; mysqldump --single-transaction -hsystem-mysql -uroot system' | gzip > system-mysql-backup.gz
echo '###################### Mysql Backup END ########################'
echo '###################### system-storage Backup START ########################'
oc rsync $(oc get pods -l 'deploymentConfig=system-app' -o json | jq '.items[0].metadata.name' -r):/opt/system/public/system ./dir
echo '###################### system-storage Backup END ########################'
echo '###################### backend-redis Backup START ########################'
oc cp $(oc get pods -l 'deploymentConfig=backend-redis' -o json | jq '.items[0].metadata.name' -r):/var/lib/redis/data/dump.rdb ./backend-redis-dump.rdb
echo '###################### backend-redis Backup END ########################'
echo '###################### system-redis Backup START ########################'
oc cp $(oc get pods -l 'deploymentConfig=system-redis' -o json | jq '.items[0].metadata.name' -r):/var/lib/redis/data/dump.rdb ./system-redis-dump.rdb
echo '###################### system-redis Backup END ########################'
echo '###################### Zync-database Backup START ########################'
oc rsh $(oc get pods -l 'deploymentConfig=zync-database' -o json | jq -r '.items[0].metadata.name') bash -c 'pg_dump zync_production' | gzip > zync-database-backup.gz
echo '###################### Zync-database Backup END ########################'
echo '\n\n###################### ZIP ########################\n'
cd /home/backupuser/
zip -r $BACK_DIR.zip ./$BACK_DIR
cp $BACK_DIR.zip /pv-storage/
rm -rf ./$BACK_DIR
echo '\n\n###################### old backup file remove (last 5) ##################'
cd /pv-storage/
ls -t *.zip | tail -n +6 | xargs rm -rf
ls -al *.zip
echo '###################### old backup file rmove END ########################'
기존 백업과 달라진 부분은
- oc login 시 --token 을 사용
- 일반유저의 홈디렉토리에서 작업(Azure Disk로 성능이 빠름)
- 백업파일을 zip 압축
- 마운트 경로를 /tmp 에서 /pv-storage 로 변경(Azure Files)
기존 백업 내용
- secret, configMap 백업
- mysql 백업
- system-storage 백업
- backend-redis 백업
- system-redis 백업
- zync-database 백업
git push
이제 작성된 도커파일과 스크립트 파일을 git 에 업로드하자.
# 클론 받기
$ git clone https://git.apps.x6m10kjj.australiaeast.aroapp.io/ocp/bakcup/3scale-backup.git
# 프로젝트 폴더 이동
$ cd 3scale-backup
# 작성한 파일 이동
$ mv 저장한위치/* ./
# 파일 확인
$ ls
Dockerfile start.sh
# 로컬 repo add & commit
$ git add .
$ git commit -m "도커파일추가"
# 원격 repo push
$ git push
이제 다음 포스팅에 이어 작성하겠다.
'엔지니어링 > 3scale' 카테고리의 다른 글
[OCP] 3scale 백업 자동화 고도화하기 - 4편(마지막) (0) | 2022.08.31 |
---|---|
[OCP] 3scale 백업 자동화 고도화하기 - 3편(이미지생성, 권한부여) (0) | 2022.08.31 |
[OCP] 3scale 백업 자동화 고도화하기 - 1편(도입부) (0) | 2022.08.31 |
[OCP] 3scale Operator 리소스 조정(관리) (0) | 2022.08.24 |
[OCP] 3scale 백업 자동화 크론잡 (0) | 2022.08.24 |