Workloadsリソースとは
クラスタ上にコンテナを起動するために利用するリソース
Pod
Workloadsリソースの最小単位。
同じPodに含まれるコンテナ同士はネットワーク的に隔離されていないので、IPアドレスを共有している。
つまり、同じPodにあるコンテナ同士は、同一IPを持つことになるので、localhostで通信が可能になります。
※基本的には1つのPodに1つのコンテナを内包することになります。
apiVersion: v1
kind: Pod # リソースの種類
metadata:
name: sample-pod # Podの名前
spec:
containers: # containerの定義
- name: nginx-container # container名
image: nginx:1.12 # containerのimage
ReplicaSet
複数のPodのレプリカをセットで作成する機能で、レプリカ数が不足している場合はTemplateからPodを作成して、レプリカ数が過剰な場合はラベルに一致するPodのうち1つを削除します。
apiVersion: apps/v1
kind: Replicaset # リソースの種類
metadata:
name: sample-rs # Replicasetの名前
spec:
replicas: 3 # レプリカ数
selector:
matchLabels:
app: sample-app # 起動するPod名
template: # 複製すべきPodの定義
metadata:
labels:
app: sample-app #Pod名
spec:
containers: # containerの定義
- name: nginx-container # container名
image: nginx:1.12 # containerのimage
ports:
- containerPort: 80 # containerのPort
Deployment
Replicasetを管理することで、ローリングアップデートやロールバックを実現するリソース。
DeploymentがReplicasetを管理し、ReplicaSetがPodを管理する3層の親子関係になります。
※kubernetesで最も推奨されているコンテナの起動方法
・関係性
Deployment >> Replicaset >> Pod
apiVersion: apps/v1
kind: Deployment # リソースの種類
metadata:
name: sample-deployment # Deploymentの名前
spec:
replicas: 3 # レプリカ数
selector:
matchLabels:
app: sample-app # 起動するPod名
template: # 複製すべきPodの定義
metadata:
labels:
app: sample-app #Pod名
spec:
containers: # containerの定義
- name: nginx-container # container名
image: nginx:1.12 # containerのimage
ports:
- containerPort: 80 # containerのPort
DaemonSet
DaemonSetは、ReplicaSetの特殊な形のリソースになります。Replicasetは、各Nodeに均等に配置されるものではないが、DaemonSetは各Nodeに確実に1つずつPodを配置します。
そのため、レプリカ数の指定はできなく、1つのNodeに2つのPodを配置することもできません。
但し、Podを配置したくないNodeに配置できなくするこをは可能です。
ログの収集など、全Node上で必ず動作させたいプロセスのために利用することが多い。
apiVersion: apps/v1
kind: DaemonSet # リソースの種類
metadata:
name: sample-ds # DaemonSetの名前
spec:
selector:
matchLabels:
app: sample-app # 起動するPod名
template: # 起動するPodの定義
metadata:
labels:
app: sample-app #Pod名
spec:
containers: # containerの定義
- name: nginx-container # container名
image: nginx:1.12 # containerのimage
Job
コンテナを利用して一度限りの処理を実行させるためのリソース。
起動するPodが停止することを前提にして作られているため、バッチなどの処理の場合にJobを使用します。
apiVersion: batch/v1
kind: Job # リソースの種類
metadata:
name: sample-job # Jobの名前
spec:
completions: 1 # 正常終了する回数
parallelism: 1 # Jobで同時にPodを実行できる並列数
backoffLimit: 10 # 失敗したJobのリトライ回数
template: # 起動するPodの定義
spec:
containers: # containerの定義
- name: sleep-container # container名
image: cenos:6 # containerのimage
command: ["sleep"] # sleepコマンドの実行
args: ["60"] # 60秒間
restartPolicy: Never # PodがErrorになった際にはJobが新しいPodを作成
CronJob
Jobを管理するリソースで、CronjobがJobを管理し、JobがPodを管理するような親子関係になります。
・関係性
CronJob >> Job >> Pod
apiVersion: batch/v1beta1
kind: CronJob # リソースの種類
metadata:
name: sample-cronjob # cronJobの名前
spec:
schedule: "*/1 * * * *" # 1分毎に実行
concurrencyPolicy: Allow # Jobの並列実行Policyで制限を行わない
startingDeadlineSeconds: 30 # CronJob で何かしら実行されなかった時にいつまで実行可能かの期限
successfulJobsHistoryLimit: 5 # 正常終了したJobの履歴保有数
failedJobsHistoryLimit: 3 # 異常終了したJobの履歴保有数
suspend: false # CronJobのスケジューリングの対象とする
JobTemplate:
spec:
completions: 1 # 正常終了する回数
parallelism: 1 # Jobで同時にPodを実行できる並列数
backoffLimit: 1 # 失敗したJobのリトライ回数
template: # 起動するPodの定義
spec:
containers: # containerの定義
- name: sleep-container # container名
image: cenos:6 # containerのimage
command:
- "sh"
- "-c"
args:
- "sleep 40; date + '%N' | cut -c 9 | egrep '[1|3|5|7|9]'" # 約50%の確率で成功するコマンド
restartPolicy: Never # PodがErrorになった際にはJobが新しいPodを作成