Kubernetes基礎(11)：DaemonSet, Job, CronJobの詳細

##Overview
<img width="794" alt="スクリーンショット 2020-07-14 14.20.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/f0ced7d6-cefe-b8b7-e3e6-305eadcfe4a3.png">
##1. DaemonSet
![DaemonSet_detail1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/f9a1207b-fcf5-970d-0456-95d89b722c7c.png)
DaemonSetにはSelectorとTemplateがあって、全てのNodeにTemplateに指定されている設定値通りにPodが作成されて、DaemonSetのSelectorとPodのLabelで接続が可能になる。
もしNodeのOSが違って、上記の図のようにLabelで区分して、ubuntuにはPodを作成したくない場合は
Templateの「nodeSelector：centos」を指定すると、ubuntuにはPodが生成されない。
DaemonSetは1つのNodeに1つを超えるPodを作ることは出来ないが指定したNodeにPodを作らないことはできる。
そして、特定のNodeにアクセスしたとき、そのNodeに繋がっているPodへアクセスする方法を多く使っている。
少しだけ細かく説明すると、NodeタイプのServiceを作成して「externalTrafficPolicy：Local」を指定すると、特定のNodeのPortにアクセスしたらこのtrafficは、Serviceへ行ってServiceが該当NodeのPodに接続させてくれるよく使われている方法であるが、
templateのhostPortを設定するだけでNodeのPortからPodへ直接接続できる方法もある。

【yaml】
templateの中にnodeSelectorを指定するとそのLabelが指定されているNodeのみPodが生成されて、指定しない場合は全てのNodeにPodが生成される。
containerの中のhostPortに18080を設定すると18080に入ってきたtrafficはそのPodの8080 Containerへ接続される。

**DamonSet**

```Yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-1
spec:
  selector:
    matchLabels:
      type: app
  template:
    metadata:
      labels:
        type: app
    spec:
      containers:
      - name: container
        image: <image file>
        ports:
        - containerPort: 8080
          hostPort: 18080
```

**DamonSet-nodeSelector**

```Yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-2
spec:
  selector:
    matchLabels:
      type: app
  template:
    metadata:
      labels:
        type: app
    spec:
      nodeSelector:
        os: centos
      containers:
      - name: container
        image: <image file>
        ports:
        - containerPort: 8080
```
##2. Job
![スクリーンショット 2020-07-14 14.19.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/10133674-1424-131f-6265-8a36cd5a3229.png)
Jobもtemplateとselectorがある。
templateは特定の作業だけ実行して終了となるPodを設定する。
selectorは直接作らなくてもJobが作成する。
templateは一般的に1つのPodを作成し、そのPodがタスクを完了すると、Jobも終了となるが、
上の図のように「Completions：6」を指定すると6つのPodを1つずつ順番に実行させて、全てのタスクが終了したらJobを終了させる方法もある。
そしてparallelismに2を指定すると、2つずつPodが生成され
「activeDeadlineSeconds：30」を指定すると、そのJobは30秒後に機能が停止され、実行されているすべてのPodは削除されて実行されていないPodも今後の実行ができなくなる
もし10秒かかる作業を作ったが、30秒になっても作業が終わらないとsystem hangになっている可能性が高く、その場合はPodを削除してresourceを返却して作業がこれ以上進まないように設定するときにactiveDeadlineSecondsを使う。

【yaml】
restartPolicy：Jobの場合はNaverまたはOnfailerを設定する。（必須）

**Job-1**

```Yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: job-1
spec:
  template:
    spec:
      restartPolicy: Never
      containers:
      - name: container
        image: <image file>
        command: ["sh", "-c", "echo 'job start';sleep 20; echo 'job end'"]
        terminationGracePeriodSeconds: 0
```
**Job-2**

```Yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: job-2
spec:
  completions: 6
  parallelism: 2
  activeDeadlineSeconds: 30
  template:
    spec:
      restartPolicy: Never
      containers:
      - name: container
        image: <image file>
        command: ["sh", "-c", "echo 'job start';sleep 20; echo 'job end'"]
        terminationGracePeriodSeconds: 0
```

##3. CronJob
![CronJob_detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/3a4e0433-2f45-64a9-459a-667fac6930ab.png)
JobTemplateの設定通りにJobを作成する。
scheduleの設定通りに時間になったらJobを作成する。
上の図のFormatはよく使っているcron形式で、1分に1つのJobを作成する設定値である。
即ち1分間隔でJobが生成され、JobはPodを作ることになる。
※Suspendは、実行中のJobを一時停止させる機能

【yaml】
schdule와 concurrencyPolicy가 있으며 template은 Job을 만드는 내용을 지정한다

**CronJob**

```Yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cron-job
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: Never
          containers:
          - name: container
            image: <image file>
            command: ["sh", "-c", "echo 'job start';sleep 20; echo 'job end'"]
            terminationGracePeriodSeconds: 0
```
**CronJob - ConcurrencyPolicy**

```Yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cron-job-2
spec:
  schedule: "20,21,22 * * * *"
  **concurrencyPolicy: Replace**
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: Never
          containers:
          - name: container
            image: <image file>
            command: ["sh", "-c", "echo 'job start';sleep 140; echo 'job end'"]
            terminationGracePeriodSeconds: 0
```
<img width="265" alt="cronjobDetail2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/5a7f2b9b-6ff3-bc1b-b982-a027c289c0df.png">
concurencyPolicyという機能があってAllow、Forbid、Replaceの3つのOptionがある。
指定しないとallowがデフォルトになる。
**Allow**
上の図のように1分間隔にscheduleを指定すると1分間隔でJobが作成されてPodが生成される。
2分になったら前のPodの状態とは関係なく、新しいJobとPodを作成する。
**Forbid**
上の図のようにForbidは1分のときJobとPodを作成したが、2分になってもPodが終了されていない場合はJobを作成せずにスキップする。
Podが終了するとすぐに次のscheduleのJobが作られる。
**replace**
replaceは1分のときに作成されたJobとPodが2分になってもPodが実行中であれば、新しいPodを作って既存のJobとつなぐ。
この場合は2分になっても新しいJobは作成されないが、新しいPodが生成されて既存のJobと接続される。
2分のときに作成したPodがschedule通りに終了したら3分の時に新しいJobとPodを作成する。
これらのOptionを使ってCronJobはJobをさらに細かくコントロールができる。