Overview
 ## 1. DaemonSet

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へ直接接続できる方法もある。
## 1. DaemonSet

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
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
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

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
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
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

JobTemplateの設定通りにJobを作成する。
scheduleの設定通りに時間になったらJobを作成する。
上の図のFormatはよく使っているcron形式で、1分に1つのJobを作成する設定値である。
即ち1分間隔でJobが生成され、JobはPodを作ることになる。
※Suspendは、実行中のJobを一時停止させる機能
【yaml】
schdule와 concurrencyPolicy가 있으며 template은 Job을 만드는 내용을 지정한다
CronJob
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
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
 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をさらに細かくコントロールができる。
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をさらに細かくコントロールができる。