Kubernetes Workloadsリソース： ReplicaSet について

[「Kubernetes完全ガイド」](https://www.amazon.co.jp/Kubernetes%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-impress-top-gear-%E9%9D%92%E5%B1%B1/dp/4295004804) を元に、Workloadsリソースの動作確認を行った結果をまとめます。

##実行環境 / 参考情報
Kubernetes / kubectl version : 1.5.2
CentOS 7.4

※[構築手順1](https://qiita.com/m-eno/items/6caae931ea727f55f5c0)、[構築手順2](https://qiita.com/m-eno/items/4fa92ce812ce2a655d6c)
※[Kubernetes Workloadsリソースについて](https://qiita.com/m-eno/items/e2264789d21853eaa978)


##ReplicaSet
Podのレプリカを作成、維持するリソース
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251519/dfd0757b-ac90-7049-851f-56d563f469d3.png)
出典：[「Kubernetes完全ガイド」](https://www.amazon.co.jp/Kubernetes%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-impress-top-gear-%E9%9D%92%E5%B1%B1/dp/4295004804)


###ReplicaSetの作成
```Json-doc:sample-rs.yaml
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
  name: sample-rs
spec:
  replicas: 3
  selector:
    matchLabels:
      app: sample-app
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
        - name: nginx-container
          image: nginx:1.12
          ports:
            - containerPort: 80
```
作成すると指定したレプリカ数（例：3つ）分、Podが起動

```      
[root@master ~]# kubectl apply -f sample-rs.yaml
replicaset "sample-rs" created

[root@master ~]# kubectl get pods
NAME              READY     STATUS    RESTARTS   AGE
sample-rs-1n0r5   1/1       Running   0          47s
sample-rs-2kgsb   1/1       Running   0          47s
sample-rs-2q7z4   1/1       Running   0          47s

[root@master ~]# kubectl get replicasets
NAME        DESIRED   CURRENT   READY     AGE
sample-rs   3         3         3         1m
```

各レプリカは、耐障害性の観点でmaster / workerノードに分散されている事が確認出来る

```
[root@master ~]# kubectl get pods -o wide
NAME              READY     STATUS    RESTARTS   AGE       IP             NODE
sample-rs-1n0r5   1/1       Running   0          21m       172.17.0.2     worker
sample-rs-2kgsb   1/1       Running   0          21m       172.17.0.130   master
sample-rs-2q7z4   1/1       Running   0          21m       172.17.0.3     worker
```

###Podの停止と自己修復
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251519/39ff385b-6ae3-c3ff-ad8e-b2172d99d68d.png)
出典：[「Kubernetes完全ガイド」](https://www.amazon.co.jp/Kubernetes%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-impress-top-gear-%E9%9D%92%E5%B1%B1/dp/4295004804)

```
[root@master ~]# kubectl get pods -o wide
NAME              READY     STATUS    RESTARTS   AGE       IP             NODE
sample-rs-2kgsb   1/1       Running   0          28m       172.17.0.130   master
sample-rs-2q7z4   1/1       Running   0          28m       172.17.0.3     worker
sample-rs-pz8fv   1/1       Running   0          25s       172.17.0.131   master
```
Podを1台停止すると、ReplicaSetによりPodが新規に作成される

```
[root@master ~]# kubectl delete pod sample-rs-pz8fv
pod "sample-rs-pz8fv" deleted

[root@master ~]# kubectl get pods -o wide
NAME              READY     STATUS    RESTARTS   AGE       IP             NODE
sample-rs-2kgsb   1/1       Running   0          28m       172.17.0.130   master
sample-rs-2q7z4   1/1       Running   0          28m       172.17.0.3     worker
sample-rs-d91nh   1/1       Running   0          2s        172.17.0.2     worker
```

###ReplicaSetのラベル
ReplicaSetは、Podのラベル名を監視してレプリカ数を維持
[上の例](https://qiita.com/m-eno/items/5357671c6cbcc6ec5d5c#replicaset%E3%81%AE%E4%BD%9C%E6%88%90)ではspec.selector.matchLabels.appに、Podの監視対象のラベル名を指定　→　実際にコンテナに付与されるラベル名（例：spec.template.metadata.labels）と合わせないとエラーとなる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/251519/130a9ee9-641b-f951-1500-f0b04013b427.png)
出典：[「Kubernetes完全ガイド」](https://www.amazon.co.jp/Kubernetes%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-impress-top-gear-%E9%9D%92%E5%B1%B1/dp/4295004804)

また、別のPod（ReplicaSet以外）で同じラベル名のものを立てた場合、ReplicaSetにより、新規に作成された同一ラベル名のPodが削除されてしまう。

ラベル名は固有なものを維持するようにする