1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Kubernetes Cronjobの書き方 DB backup to S3

Posted at

##Kubernetes

他社の運用例を知らないからこれが普通なのかわからないけど、うちはCloud FormationとEKSを使ってこんな形で運用してます。

jsonnet > compile > manifest yaml化 > deploy

Kubernetesに移行し始めて2ヶ月なのでまだまだ設定することが。

###今週のタスク
現在EC2のcrontabで走っているpython scriptをKubernetes cronjobに移行。

DB - Postgres, RDS -> s3 bucket

###Official Document
https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/
https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/
https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.10/#cronjob-v1beta1-batch

###References

# Dockerfile Cloud k8s DB Storage Notes
1 alpine Azure CronJob postgres Azurefile
2 alpine AWS N/A postgres S3
3 alpine AWS CronJob mysql S3 With slack notification
4 alpine Docker-compose AWS N/A postgres S3
  1. https://www.orange-networks.com/blogs/208-back-up-databases-using-kubernetes-cronjobs
    https://github.com/rinormaloku/postgres-backup-container

  2. https://github.com/Birne94/rds-s3-database-backup

  3. https://sierrasoftworks.com/2017/11/01/scheduled-backups-with-k8s/
    https://github.com/benjamin-maynard/kubernetes-s3-mysql-backup

  4. https://github.com/schickling/dockerfiles/tree/master/postgres-backup-s3

これらの例はimage上にバックアップのスクリプトを走らせる形をとっているけど、自分達の用途には向いてない方法だと。なぜなら他にcronjobを設定した時に同じimageの再利用ができないから。

同僚曰くやり方は2つあって
1、Kubernetes Cronjob -> これを設定した。
2、Bitbucket Pipelineを使う。ただこれだとRDSへのSSH tunnelingが必要になるかも?と -> さっと関係のありそうなものを調べた

###Kubernetes Cronjob設定手順
1、現在のpython scriptのpg_dumpコマンドとs3へコピーしているコマンドを書き出す。

pg_dump postgres://<username>:<password>@<host>:<port>/<DB-name> -Fc -b -v -f <DB-name>-<date>

aws s3 mv <DB-name>-<date> s3://<bucket-name>

2、Docker Imageの作成
最初は以下を使ったけれど、awsコマンドが認識されなかった。
RUN apk add --no-cache aws-cli --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing

FROM alpine:3.7
RUN apk --no-cache update \
    && apk --no-cache add postgresql bash python py-pip py-setuptools \
    && pip --no-cache-dir install awscli \
    && rm -rf /var/cache/apk/*

3、cronjobの作成、オフィシャルと#1と#3を見ながら設定。

ポイント

a) args: ["/bin/bash", "/scripts/backup.sh"]

b) restartPolicy: "OnFailure", <- requirement

4、backup.sh.j2の原型を作成 

#!/bin/bash
{% set p = aaa %}
DUMP_FILE_NAME="`date +%Y-%m-%d-%H-%M`.dump"

{% for db in p.bbb.bbb %}
pg_dump postgres://{{db.user}}:{{db.password}}@{{db.host}}:{{db.port}}/{{db.dbname}} -Fc -b -v -f {{db.dbname}}-$DUMP_FILE_NAME
aws s3 mv {{db.dbname}}-$DUMP_FILE_NAME s3://{{p.ccc.ccc.s3_bucket}}
{% endfor %}

これに以下の前半部分を追加

###Useful commands

kubectl describe job
kubectl get cronjob <cronjob name>
kubectl get jobs --watch

###Log formatting

FROM

Database backup successfully completed for <DB name> at 09-08-2019 08:29:14.
Database backup successfully uploaded for <DB name> at 09-08-2019 08:29:19.

TO

09-08-2019 13:52:47 - [Success] <DB name> backup successfully completed.
09-08-2019 13:52:57 - [Success] <DB name> backup successfully uploaded to s3 bucket <bucket name>.

###Testing
各シナリオで試しました。

1、dashboard上でCronJobs > Trigger
2、Jobsから選んでLogsで確認

  • スクリプト有無
  • DB有無
  • S3bucket有無
  • Node上でもDiskSizeをBefore/Afterで確認
  • IPが再利用されるか

###学んだこと

1、 kubernetes-apiの読み方

初心者にとってはkubernetes-apiとか読むのが結構怖いです。どこから手をつけていいかわからないから。

例えばcronjobを見ると以下が必要で、

  • apiVersion
  • kind
  • metadata
  • spec
  • status

さらに絞り込むとpodtemplatespecは他のSpecでも使われてることがわかる。

(e.g.) https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.10/#podtemplatespec-v1-core

  • DaemonSetSpec apps/v1
  • JobSpec batch/v1
  • PodTemplate core/v1等

2、 Jinja2の使い方、前にFlaskを勉強した時にさっと触れたものだけどイマイチ理解していなかった。shを中に入れることができるのはすごい便利。

###やりたいこと
Slack notificationの設定、Errorになった時のみNotifyするようにしたい。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?