Kubernetes基礎(9)：Replication / ReplicaSet Controller

##Controller Overview
![スクリーンショット 2020-07-03 16.37.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/8b78abaf-8fa2-872a-bac2-9e4c70efe4bd.png)
***
**Auto Healing**
Nodeの上にPodがあり、Podが突然ダウンしたり、PodがスケジューリングされているNodeがダウンした場合はPodで動いていたサービスに障害が発生する。
Controllerはこのような状況を検出し、Podを他のNodeに新たに作ってくれる。

**Auto Scaling**
Podのリソースが限界状態になった時、Controllerはこの状態を把握してPodをもう1つ作ってくれて、負荷を分散させてPodがダウンしないようにしてサービスの性能に障害なく、安定したサービスを運用できるようにしてくれる。

**Software Update**
複数のPodのバージョンアップするとき、Controllerを介して一度に簡単にできる。
アップグレードするときに問題が発生した場合、ロールバックをすることができる機能も提供する。

**Job**
一時的な作業をする場合はControllerが必要な時間のみPodを作って、そのタスクを実行して、タスク終了後は削除をする。
必要な時間だけリソースが使用されて、作業が終わった後はリソースが返されるため、効率的なリソース活用が可能となる。

***KubernetesのControllerはサービスを管理し、効率よく運用できるように色んな機能を提供しています。***

##Replication Controller, ReplicaSet
![スクリーンショット 2020-07-03 16.38.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/fe4ebfbc-59a1-a0f4-43a1-565ffceeb7dc.png)
Replication ControllerはDeplicatedになって、現在はReplicaSetを提供している。
上の図のように、Replication、ReplicaSetの機能としてTemplate、Replicas、Selectorがある。
共通機能ではTemplate、Replicasがあり、SelectorはReplicaSetのみの機能である。
まだReplicationを多く使っているが、ReplicationからReplicaSetに変更も可能である。
###1. Template
![スクリーンショット 2020-07-03 17.01.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/deaa92bb-17a6-36c7-0e7d-b60a90309847.png)
ControllerとPodは、ServiceとPodのようにLabelとセSelectorを使って接続する。
Controllerを作成するときにTemplateとしてPodの内容を設定しておくと、Podがダウンした時、ControllerがTemplateを基に再生成してくれる。
こういう特徴を利用してPodのアップグレードを簡単にできる。
Templateを更新し、既存の接続されているPodをダウンロードさせるとControllerはアップグレードされたTemplateでPodを再作成するからだ。

【yaml】
TemplateにPodを定義するとき、Controllerと接続するためにLabelを定義して置かないとPodとの接続ができない。
###2. Replicas
![スクリーンショット 2020-07-03 17.02.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/3fb605d9-8d06-cceb-b72b-ddf913828e2e.png)
replicasに設定されている数だけPodが管理され、Podが削除されると、1つのPodを作成してくれる。
数値が増加すると、増加されただけPodがScale Outされる。

TemplateとReplicasの機能を使って、PodとControllerを別々に作成せずに一度に複数のPodを作成することができる。
TemplateにPodを定義して置いて、Replicasに数を指定し、Podは作成せずにControllerのみ作成するとControllerが指定されている数だけTemplateの内容を基にPodを作ってくれる。
実際にコントローラを使用する場合、コントローラのみ設定して使います。
###3. Selector
![スクリーンショット 2020-07-03 17.02.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/122573e3-c255-127b-f127-9e05618e8f28.png)
Replication ControllerのSelectorは、keyとvalueが同じPodを接続してくれる。
keyとvalueが1つでも異なると接続できない。
ReplicaSetのSelectorには二つ追加された属性があり、MatchLabelsと呼ぶkeyとvalueの両方が一致する時、接続してくれるReplication Controllerと同じ機能がある。
もう1つは、MatchExpressionと呼ばれる機能があり、keyとvalueを細かくコントロールできる。
たとえばkey：ver、operator：Existsに設定すると、値が違いますがLabelのキーがverであるすべてのPodを選択することになる。
![スクリーンショット 2020-07-03 17.03.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/073221bf-4fd0-a7c5-153c-f2793e79b394.png)
yamlファイルを見るとSelectorにmatchLabelsとmatchExpressionsがあってmatchLabelsはkeyのvalueを設定している。
![スクリーンショット 2020-07-03 17.02.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/7fd259aa-b6c9-8cf0-b301-c98b98056172.png)
「matchExpressions」は下記のようにもっと詳細な設定ができる。
operatorには、いくつかのオプションがあります。
**Exists**
keyと一致するPodを接続してくれる。
**DoseNotExist**
keyと一致しないPodを接続してくれる。
**In**
keyに1つ以上のvalueを設定することができ、keyとvalueに対応するPodを接続してくれる。
**NotIn**
keyに1つ以上のvalueを設定することができるがkeyに一致してvalueとは一致しないPodを接続してくれる。
ReplicaSetは、さまざまなPodを接続してくれるオプションを提供している。