初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Job編

# 背景
個人的にインフラの知識以上にこれからのアプリケーションが動く環境を作ってデプロイしたりしてこれからの知識を身に着けたい。そしてより一層、自分の知識のアップデートをしたいと思いました。

その中でこの本に出会い、これから少しずつやったことを残し、未来の自分への手紙としてもあり、見つめ直せればと思いました。

# 引用や参考と今回の自分の勉強用の書籍の紹介
[技術評論社『Kubernetes実践入門』のサンプルコード](https://github.com/kubernetes-practical-guide/examples)
[Kubernetes実践入門 プロダクションレディなコンテナ＆アプリケーションの作り方](https://gihyo.jp/book/2019/978-4-297-10438-2)
![](http://image.gihyo.co.jp/assets/images/cover/2019/9784297104382.jpg)


## 実際の学びについて

書籍を読みながら、章ごとに少しずつ進めていきたいと思います。
GitHub のソースコードも使いながら学んで行きたいと思います。
***この章の勉強は本当に書籍の写経が主になるかもしれません・・・***


# 勉強開始

## リポジトリ

[https://github.com/kubernetes-practical-guide/examples/tree/master/ch3.8.1/manifests/mattermost](https://github.com/kubernetes-practical-guide/examples/tree/master/ch3.8.1/manifests/mattermost)

## 1 回のみ実行する Job

### バックアップするスクリプト

```yaml:mysql-cm-backup.yaml
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

```yaml:mysql-job.yaml
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 が失敗した場合のリトライ回数を指定

```console
# 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
```

```yaml:mysql-cronjob.yaml
## 定期実行する 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** に定義された内容を実行する

```console
# 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 のバッチ実行後のディレクトリ確認

```console
$ 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 ５月号を読んでいて **osv / unikernel** って **キーワード** が今回のKubernetes にも後々、普及されるのでしょう。と思いました。インフラやネットワーク、軽量な OS って非常に個人的に興味のある部分です、アプリ開発についても興味はもちろんあります。

# 今までの投稿
1. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Pod編](https://qiita.com/nodokaodayaka/items/04d8bc3c9c40443c1cd3)
2. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）NameSpace 編](https://qiita.com/nodokaodayaka/items/73bc1c939a665aaa4b7b)
3. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Label 編](https://qiita.com/nodokaodayaka/items/fd5284475fb1ba920559)
4. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）ReplicaSet 編](https://qiita.com/nodokaodayaka/items/fc9f749f123649a2dbd9)
5. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Deployment 編](https://qiita.com/nodokaodayaka/items/2c9d4eefec40d4896126)
6.  [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Service 編](https://qiita.com/nodokaodayaka/items/28955bd813eaf512baf5)
7. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）ConfigMap 編](https://qiita.com/nodokaodayaka/items/09c7627eaa913da78cf8)
8. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Secret 編](https://qiita.com/nodokaodayaka/items/8bc1a5963a7c7c177010)
9. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）操作編](https://qiita.com/nodokaodayaka/items/09cb848164e4a1855c83)
10. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）体感編](https://qiita.com/nodokaodayaka/items/ae95e04b064b7600f6af) 
11. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）体感編パート２](https://qiita.com/nodokaodayaka/items/fa87fd7a3733957e7aca) 
12. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）体感編パート3（Label操作）](https://qiita.com/nodokaodayaka/items/8f1892eb1627d0717180)
13. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）体感編パート3（OwnerReference 操作）](https://qiita.com/nodokaodayaka/items/b4ad326be41626da9b2e)
14. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）マニュフェスト編](https://qiita.com/nodokaodayaka/items/8d212a5f1eeb2685f51c)
15. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）マニュフェスト(ConfigMap)編](https://qiita.com/nodokaodayaka/items/7dd2f3885d8e957ffaad)
16. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）通信編](https://qiita.com/nodokaodayaka/items/71c6f7d469cf2f277d3d)
17. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）通信編 パート２](https://qiita.com/nodokaodayaka/items/2663e1931bd1ec007785)
18. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）通信編 パート３](https://qiita.com/nodokaodayaka/items/9ad45aa52d76bcb844d7)
19. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）通信編 パート４](https://qiita.com/nodokaodayaka/items/e6ef632223f9ac2cc99e)
20. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）公開編パート１（NodePort）](https://qiita.com/nodokaodayaka/items/754a32235cf7e648e8f9)
21. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）公開編パート２（LoadBalancer）](https://qiita.com/nodokaodayaka/items/79df5bbefbb0e1a938bd)
22. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）公開編パート３（Ingress）](https://qiita.com/nodokaodayaka/items/f4433cce735f967c294e)
23. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）外部ストレージ編](https://qiita.com/nodokaodayaka/items/ae7dc8d442280b5bb9ab)
24. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）外部ストレージ編パート２](https://qiita.com/nodokaodayaka/items/beead2c136d591fe18d6)
25. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）StatfulSet編](https://qiita.com/nodokaodayaka/items/9cd9cff01b15d7ab3e01)
26. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）StatfulSet編 パート２](https://qiita.com/nodokaodayaka/items/bac0fa82f390b315f411)
27. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）StatfulSet編 パート３](https://qiita.com/nodokaodayaka/items/5583bbbb70438b8f9a0f)
28. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）スケール編](https://qiita.com/nodokaodayaka/items/e524099729d6baabca87)
29. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Mattermost接続編](https://qiita.com/nodokaodayaka/items/59953e5a21e5394ecb6a)