kubernetesのworkloadsリソースの概要

# Workloadsリソースとは
クラスタ上にコンテナを起動するために利用するリソース

## Pod
Workloadsリソースの最小単位。
同じPodに含まれるコンテナ同士はネットワーク的に隔離されていないので、IPアドレスを共有している。
つまり、同じPodにあるコンテナ同士は、同一IPを持つことになるので、localhostで通信が可能になります。
※基本的には1つのPodに1つのコンテナを内包することになります。

```yaml:sample-pod.yaml
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つを削除します。

```yaml:rs-sample.yaml
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

```yaml:sample-deployment.yaml
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上で必ず動作させたいプロセスのために利用することが多い。

```yaml:sample-ds.yaml
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を使用します。

```yaml:sample-job.yaml
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

```yaml:sample-cronjob.yaml
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を作成
```

次回は各<a href="https://qiita.com/k_r_5376/items/d2d4f76e830912adfeeb">kubernetesのDiscovery＆LBリソースの概要</a>です