kubernetes勉強メモ3(ReplicaSet)

# はじめに

kubernetesの勉強。

今回はworkloadsリソースの一つreplicasetについて

# Workloadsリソース

クラスタ上にコンテナを起動させるためのリソース。

全部で８種類のリソースがある。

1. Pod
2. **Replication Controller**
3. **Replicaset**
4. deployment
5. Daemonset
6. Statefulset
7. Job
8. Cronjob



## ReplicaSet

podの拡張概念。

replicas（複製数）だけpodをコピーする。

ノードの冗長化や耐障害性の影響を軽減することができる。

また、何らかの原因でpodが死んだ場合は複製数を維持するようにpodを生き返らせたり、nodeが死んで、podが死んでしまった場合も、別ノードにpodを生き返らせたりしてくれる。これらは「オートヒーリング」と呼ばれる。

### オートヒーリングを見てみる

オートヒーリングの機能を見てみる。そのためにまずはじめにreplicasetを作成する。

manifestファイルは以下の通り

```yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: sample-rs
spec:
  # 3個のpodを作成する
  replicas: 3
  selector:
    matchLabels:
      app: sample-app
  # 複製するpodの定義
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
        - name: nginx-container
          image: nginx:1.12
          ports:
            - containerPort: 80

```

で作成する。

```
$ kubectl apply -f rs.yaml
```
で、ちゃんとpodが三つ作成されているかを確認する。

```
$ kubectl get po
====== 実行結果 ======
NAME              READY   STATUS    RESTARTS   AGE
sample-rs-cdm2c   1/1     Running   0          10h
sample-rs-ck9j7   1/1     Running   0          10h
sample-rs-wwr7k   1/1     Running   0          10h
```

実行結果より三つのpodが生成されていることがわかる。

で本題の「オートヒールング」を確認するためにpodを削除してみる。

````bash
$ kubectl delete po sample-rs-cdm2c 
````

でちゃんとpodが新しく作成されているか確認してみる

```
$ kubectl get po
===== 実行結果 =====
NAME              READY   STATUS    RESTARTS   AGE
sample-rs-ck9j7   1/1     Running   0          10h
sample-rs-m8cbg   1/1     Running   0          40s
sample-rs-wwr7k   1/1     Running   0          10h

```

実行結果よりsample-rs-m8cbg 　といpodが新しく作成されていることがわかる。

replicasetは特定のラベルのついたpodを監視している。さっき見たみたいにレプリカ数が不足している場合は新たにpodが作成される。

それに対し、レプリカ数が過剰に存在している場合は該当するpodの内のpodをレプリカ数と同じ数になるように削除する。

レプリカ数はどのようにカウントされているかというと、、、

```yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: sample-rs
spec:
  replicas: 3
  # カウントされるpodのラベルを指定する
  # 今回はsample-appというラベルを指定
  selector:
    matchLabels:
      app: sample-app
  template:
  　# 作成されるpodはここで定義されている。
    metadata:
      labels:
        app: sample-app
    spec:
      ・・・・・・
```

上記のように`spec.selector`と`spec.template.metadata.lebels`は一致させる必要がある。一致していないとエラーが起きる。(レプリカ数を増やそうとpodを永遠に作られ続ける)

### replicaset外からpodを増やしてみる

逆にpodを増やしてみるとpodを削除してくれるのかを見てみる。

そこで、新たにreplicaset街からsample-appラベルを持ったpodを一つ作成してみます。

manifestファイルは以下の通り

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
  labels:
    app: sample-app
spec:
  containers:
    - name: nginx-container
      image: nginx:1.13
      ports:
      - containerPort: 80

```

`kubectl apply`コマンドでpodを作成する。

で、podがどうなっているかをみてみる。

```
$ kubectl get po 
===== 実行結果 =====
NAME                  READY   STATUS        RESTARTS   AGE
pod/sample-pod        0/1     Terminating   0          4s
pod/sample-rs-ck9j7   1/1     Running       0          10h
pod/sample-rs-m8cbg   1/1     Running       0          25m
pod/sample-rs-wwr7k   1/1     Running       0          10h

```

 となり、pod/sample-podが削除されていることがわかる。



### Podのスケーリング

replicasetの設定を変更してpodの数を変更してみる。

方法は以下の二つ。

- Manifestファイルを変更して, `kubectl apply -f [Manifestファイル名]`
- `kubectl scale`コマンドを使う。

今回はkubectl scale コマンドを使ってreplicasetのレプリカ数を6個に増やしてみる.

```bash
$ kubectl scale rs sample-rs --replicas 6
replicaset.extensions/sample-rs scaled
```

でちゃんとpodの数が6個になっているか確認してみる。

```
$ kubectl get po 
===== 実行結果 =====
NAME              READY   STATUS    RESTARTS   AGE
sample-rs-5sclp   1/1     Running   0          48s
sample-rs-ck9j7   1/1     Running   0          10h
sample-rs-m8cbg   1/1     Running   0          31m
sample-rs-qjk5j   1/1     Running   0          48s
sample-rs-v9v8v   1/1     Running   0          48s
sample-rs-wwr7k   1/1     Running   0          10h

```

実行結果よりちゃんと6個のpodが作成されていることがわかる。


# まとめ

- ReplicaSet
  - k8sのworkloadsリソースの一つ
  - podの拡張概念。レプリカ数だけpodを複製する
  - podの数がレプリカ数と同じになるように作成削除を行う。→「オートヒーリング」
- podのスケーリング
  - `kubectl scale`コマンドを使う
  - manifestファイルを変更して`kubectl apply`コマンドで適用

# 参考

- https://thinkit.co.jp/article/13610