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へ直接接続できる方法もある。
【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をさらに細かくコントロールができる。