背景
個人的にインフラの知識以上にこれからのアプリケーションが動く環境を作ってデプロイしたりしてこれからの知識を身に着けたい。そしてより一層、自分の知識のアップデートをしたいと思いました。
その中でこの本に出会い、これから少しずつやったことを残し、未来の自分への手紙としてもあり、見つめ直せればと思いました。
引用や参考と今回の自分の勉強用の書籍の紹介
技術評論社『Kubernetes実践入門』のサンプルコード
Kubernetes実践入門 プロダクションレディなコンテナ&アプリケーションの作り方
実際の学びについて
書籍を読みながら、章ごとに少しずつ進めていきたいと思います。
GitHub のソースコードも使いながら学んで行きたいと思います。
この章の勉強は本当に書籍の写経が主になるかもしれません・・・
勉強開始
リポジトリ
https://github.com/kubernetes-practical-guide/examples/tree/master/ch3.8.1/manifests/mattermost
1 回のみ実行する Job
バックアップするスクリプト
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-backup
data:
backup-db.sh: |
#!/bin/bash
set -e
echo "Execute backup-db.sh"
MYSQLM="mysql -h mysql-0.mysql --user=root --password=${MYSQL_ROOT_PASSWORD}"
MYSQLDUMP="mysqldump -h mysql-0.mysql --user=root --password=${MYSQL_ROOT_PASSWORD}"
$MYSQLM -e 'FLUSH TABLES WITH READ LOCK;'
log_file=$($MYSQLM -e 'SHOW MASTER STATUS\G;' | grep File: | awk '{print $2}')
pos=$($MYSQLM -e 'SHOW MASTER STATUS\G;' | grep Position: | awk '{print $2}')
datestamp=$(date +%Y%m%d)
backupname="/mnt/backup/${MYSQL_DATABASE}-${datestamp}-${log_file}-${pos}.dump"
${MYSQLDUMP} "${MYSQL_DATABASE}" > "${backupname}"
$MYSQLM -e 'UNLOCK TABLES;'
exit 0
スクリプトを実行する Job
apiVersion: batch/v1
kind: Job
metadata:
name: mysql-backup
spec:
completions: 1 # (a)
parallelism: 1 # (b)
template:
spec:
containers:
- name: backup-mysql
image: k8spracticalguide/mysql:5.7.22
envFrom:
- configMapRef:
name: common-env
- secretRef:
name: common-env
command: ["bash", "/mnt/backup-script/backup-db.sh"]
volumeMounts:
- name: backup-script
mountPath: /mnt/backup-script
- name: backup
mountPath: /mnt/backup
restartPolicy: Never # (c)
volumes:
- name: backup-script
configMap:
name: mysql-backup
- name: backup
persistentVolumeClaim:
claimName: backup-mysql
backoffLimit: 3 # (d)
ab. completions/parallelism Job の正常終了の回数と並列実行数の指定
c. restartPolicy Pod が異常終了したときの再起動ポリシーの指定
d. backoffLimit は Job が失敗した場合のリトライ回数を指定
# ConfigMap と Job をデプロイ
$ kubectl apply -f mysql-cm-backup.yaml
configmap/mysql-backup created
$ kubectl apply -f mysql-job.yaml
job.batch/mysql-backup created
# Pod の状態を確認
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
mattermost-67d4ff7dd-z5zq5 1/1 Running 0 140m
mysql-0 1/1 Running 0 140m
mysql-1 1/1 Running 0 140m
mysql-backup-v4s88 1/1 Running 0 4s
# Jobの状態の確認
$ kubectl get jobs
NAME COMPLETIONS DURATION AGE
mysql-backup 1/1 7s 20s
## 定期実行する CronJob
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cron-mysql-backup
spec:
schedule: "0 * * * *" # (a)
startingDeadlineSeconds: 60 # (b)
concurrencyPolicy: Forbid # (c)
successfulJobsHistoryLimit: 5 # (d)
failedJobsHistoryLimit: 5 # (e)
jobTemplate: # (f)
spec:
template:
spec:
containers:
- name: cron-backup-mysql
image: mysql:5.7.22
envFrom:
- configMapRef:
name: common-env
- secretRef:
name: common-env
command: ["bash", "/mnt/backup-script/backup-db.sh"]
volumeMounts:
- name: backup-script
mountPath: /mnt/backup-script
- name: backup
mountPath: /mnt/backup
restartPolicy: Never
volumes:
- name: backup-script
configMap:
name: mysql-backup
- name: backup
persistentVolumeClaim:
claimName: backup-mysql
restartPolicy: Never
a. schedule を設定
b. startingDeadlineSeconds は CronJob が実行されなかった際にいつまでの期間は実行可能かを設定
c. concurrencyPolicy は同時実行ポリシーを設定
d. successfulJobsHistoryLimit 保持する成功 Job 数
e. failedJobsHistoryLimit 保持する失敗 Job 吸う
f. jobTemplate に定義された内容を実行する
# CronJobをデプロイ
$ kubectl apply -f mysql-cronjob.yaml
cronjob.batch/cron-mysql-backup created
# CronJobの状態を確認
$ kubectl get cronjobs
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
cron-mysql-backup 0 * * * * False 0 <none> 18s
18:00 のバッチ実行後のディレクトリ確認
$ ls -tlr
total 88
-rw-r--r-- 1 xxxxxxxxxx staff 1259 5 1 14:31 mattermost-20200501-mysql-bin.000003-154.dump
-rw-r--r-- 1 xxxxxxxxxx staff 40070 5 1 17:30 mattermost-20200501-mysql-bin.000004-92675.dump
-rw-r--r-- 1 xxxxxxxxxx staff 40070 5 1 18:00 mattermost-20200501-mysql-bin.000004-117085.dump
次は 6 章をやっていきます。
**「アプリケーションの安定性を上げる」**です。
最後に
今回は、Job を見てみましたが、サーバに DB を入れてバックアップしてってやっているけどそれを kubernetes で確認が取れたのは良かったと思います。
SoftwareDesign 5月号を読んでいて osv / unikernel って キーワード が今回のKubernetes にも後々、普及されるのでしょう。と思いました。インフラやネットワーク、軽量な OS って非常に個人的に興味のある部分です、アプリ開発についても興味はもちろんあります。
今までの投稿
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)Pod編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)NameSpace 編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)Label 編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)ReplicaSet 編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)Deployment 編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)Service 編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)ConfigMap 編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)Secret 編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)操作編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)体感編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)体感編パート2
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)体感編パート3(Label操作)
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)体感編パート3(OwnerReference 操作)
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)マニュフェスト編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)マニュフェスト(ConfigMap)編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)通信編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)通信編 パート2
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)通信編 パート3
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)通信編 パート4
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)公開編パート1(NodePort)
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)公開編パート2(LoadBalancer)
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)公開編パート3(Ingress)
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)外部ストレージ編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)外部ストレージ編パート2
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)StatfulSet編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)StatfulSet編 パート2
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)StatfulSet編 パート3
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)スケール編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)Mattermost接続編