2022年3月11日金曜日

Microk8sでCronJobを使用してPostgreSQLのバックアップを行う

Microk8sでCronJobを使用してPostgreSQLのバックアップを行うには、以下の手順を実行します。バックアップの取得と同時に圧縮も行います。バックアップファイルは指定した永続ボリュームに保存します。

作成手順

1. ビルトインレジストリの有効化(※既に実施している場合はスキップしてください)
Microk8sがインストールされているホスト上で以下のコマンドを実行します。
microk8s enable registry:size=50Gi
※registryプラグインが有効化してあるか不明な場合はmicrok8s statusコマンドを実行します。

Dockerがインストールしてあるリモートマシン上で以下のコマンドを実行します。192.168.1.1の部分は、Microk8sのホストのIPに変更してください。
cat << EOF | sudo tee /etc/docker/daemon.json
{
    "insecure-registries" : ["192.168.1.1:32000"]
}
EOF

sudo systemctl restart docker

2. 以下のDockerfileを使用してPostgreSQLのpg_dumpをインストールしたイメージを作成します。
Dockerfile
FROM alpine:3.15
RUN apk --no-cache add postgresql-client \
  && mkdir /data
WORKDIR /data
VOLUME ["/data"]
ENV PG_HOST=localhost \
  PG_USER=postgres \
  PGPASSWORD=postgres \
  PG_DB=postgres \
  PG_PORT=5432 \
  BASENAME=backup \
  POSTFIX=_
CMD ["/bin/sh", "-c", "/usr/bin/pg_dump -h ${PG_HOST} -p ${PG_PORT} -U ${PG_USER} ${PG_DB}  | gzip > /data/${BASENAME}${POSTFIX}.dmp.gz"]

・イメージ作成コマンド ※192.168.1.1の部分はMicrok8sのホストのIPに変更してください。
docker build . -t 192.168.1.1:32000/pgdump:latest

・イメージのタグ付け
docker tag `docker images | grep '192.168.1.1:32000/pgdump' | awk '{print $3}'` 192.168.1.1:32000/pgdump:latest

・イメージをビルトインレジストリにプッシュ
docker push 192.168.1.1:32000/pgdump:latest

・Microk8sのサーバ上で、イメージが登録されたことを確認するには以下のコマンドを実行します。
wget http://192.168.1.1:32000/v2/_catalog -O -

3. local永続ボリュームの作成
以下のコマンドでlocal永続ボリュームを作成します。
cat << EOF > local-pgdump-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pgdump-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  local:
    path: /backup/mydatabase
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - `hostname`
EOF
※`hostname`は今ログオンしているMicrok8sがインストールされているホスト名になります。適宜変更してください。
microk8s kubectl apply -f ./local-pgdump-pv.yml

4. 永続ボリューム要求の作成
以下のコマンドで永続ボリューム要求を作成します。
cat << EOF > local-pgdump-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-pgdump-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 5Gi
  volumeName: local-pgdump-pv
EOF

microk8s kubectl apply -f ./local-pgdump-pvc.yml

5. CronJobの作成
以下のファイルでCronJobを構成します。ここでは12:30にバックアップジョブを実行するようにしています。

cronjob-bakcup-mydatabase.yml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: pgdump
spec:
  schedule: "30 12 * * *"
  successfulJobsHistoryLimit: 5
  failedJobsHistoryLimit: 5
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: pgdump
            image: localhost:32000/pgdump:latest
            env:
            - name: PG_HOST
              value: "192.168.1.1"
            - name: PG_USER
              value: postgres
            - name: PGPASSWORD
              value: mypostgres
            - name: PG_DB
              value: mydatabase
            - name: PG_PORT
              value: "5432"
            - name: BASENAME
              value: backup-mydatabase-
            volumeMounts:
            - name: data
              mountPath: /data
            command:
            - /bin/sh
            - -c
            - PFIX=`/bin/date '+%Y%m%d-%H%M'` && /usr/bin/pg_dump -h ${PG_HOST} -p ${PG_PORT} -U ${PG_USER} ${PG_DB}  | gzip > /data/${BASENAME}${PFIX}.dmp.gz
          restartPolicy: Never
          volumes:
          - name: data
            persistentVolumeClaim:
              claimName: local-pgdump-pvc
以下のコマンドでCronJobを作成します。
microk8s kubectl apply -f ./cronjob-bakcup-mydatabase.yml

関連情報

・Dockerの場合は、以下のページを参照してください。
Dockerでpg_dumpをインストールしたイメージ(Alpine3.15ベース)を作成してバックアップを行う

0 件のコメント:

コメントを投稿