[K8s] デプロイメントの生成とスケール機能

## 概要

本投稿はK8sのデプロイメント機能の生成とスケール機能の動作確認を行った際の個人メモです。

## 前提条件

* MacOSにminikube、kubectlがインストールされていること。
* K8sクラスタが既に起動していること

```
$ minikube start
```

## デプロイメントとは

デプロイメントの主な役割は、ポッドの稼働数を管理することです。
従来のインフラ構成の代表例として、LBと複数サーバを起動しアプリケーションの処理を分担させるといった例が挙げられますが、K8sではポッドが従来のシステムのサーバの役割を担っています。
デプロイメントは要求を満たすポッド数を起動させ、障害などでポッドの稼働数が減少した場合には、処理を維持するといったポッドの管理を行う役割を持っています。
デプロイメントは単独で動作するのではなく、`レプリカセット`と連携してポッドの制御を行います。

### マニフェスト

デプロイメントを生成するマニフェストの例は以下の通りです。
`replicas`で定義された値の数だけポッドが起動します。

```deployment.yml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: web-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx:1.16
```

### デプロイメントの生成

`apply`を使用しデプロイを行います。

```
$ kubectl apply -f deployment.yml
```

ステータスを確認すると、3つのポッドが起動していることが確認できます。

```
$ kubectl get pods -o wide
NAME                          READY     STATUS    RESTARTS   AGE       IP           NODE       NOMINATED NODE
web-deploy-4093352598-8h090   1/1       Running   0          49s       172.17.0.4   minikube   <none>
web-deploy-4093352598-bh50c   1/1       Running   0          49s       172.17.0.6   minikube   <none>
web-deploy-4093352598-sxvay   1/1       Running   0          49s       172.17.0.5   minikube   <none>
```

### スケール機能

スケール機能とは、ポッド数を増減させることで処理能力を調整する機能です。
CPU使用率と連動して動的に数を増減させる`オートスケール`も可能ですが、ここでは手動でポッドの数を増やします。
方法は以下の2通りがあります。

* マニフェストの定義を変更

上記で作成したファイルの`replicas`の数を10に変更後、再度デプロイを行います。
ポッドが10に増加していることがわかります。

```
$ kubectl apply -f deployment.yml
$ kubectl get pods -o wide
NAME                          READY     STATUS    RESTARTS   AGE       IP            NODE       NOMINATED NODE
web-deploy-4093352598-084qp   1/1       Running   0          21s       172.17.0.10   minikube   <none>
web-deploy-4093352598-0ym88   1/1       Running   0          21s       172.17.0.8    minikube   <none>
web-deploy-4093352598-8h090   1/1       Running   0          8m        172.17.0.4    minikube   <none>
web-deploy-4093352598-aj764   1/1       Running   0          21s       172.17.0.12   minikube   <none>
web-deploy-4093352598-bh50c   1/1       Running   0          8m        172.17.0.6    minikube   <none>
web-deploy-4093352598-bujki   1/1       Running   0          21s       172.17.0.9    minikube   <none>
web-deploy-4093352598-gbnn4   1/1       Running   0          21s       172.17.0.11   minikube   <none>
web-deploy-4093352598-lv7t8   1/1       Running   0          21s       172.17.0.13   minikube   <none>
web-deploy-4093352598-sxvay   1/1       Running   0          8m        172.17.0.5    minikube   <none>
web-deploy-4093352598-tfl05   1/1       Running   0          21s       172.17.0.7    minikube   <none>
```

* コマンドによる増加

`kubectl scale`コマンドで増加させることも可能です。

```
$ kubectl get deployment
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
web-deploy   3         3         3            3           11m
$ kubectl scale --replicas=10 deployment.extensions/web-deploy
deployment.extensions/web-deploy scaled
$ kubectl get pods -o wide
NAME                          READY     STATUS    RESTARTS   AGE       IP            NODE       NOMINATED NODE
web-deploy-4093352598-1zqm5   1/1       Running   0          10s       172.17.0.8    minikube   <none>
web-deploy-4093352598-8h090   1/1       Running   0          12m       172.17.0.4    minikube   <none>
web-deploy-4093352598-bh50c   1/1       Running   0          12m       172.17.0.6    minikube   <none>
web-deploy-4093352598-eujyz   1/1       Running   0          10s       172.17.0.13   minikube   <none>
web-deploy-4093352598-hmp9a   1/1       Running   0          10s       172.17.0.7    minikube   <none>
web-deploy-4093352598-j4cup   1/1       Running   0          10s       172.17.0.11   minikube   <none>
web-deploy-4093352598-lom8m   1/1       Running   0          10s       172.17.0.9    minikube   <none>
web-deploy-4093352598-sxvay   1/1       Running   0          12m       172.17.0.5    minikube   <none>
web-deploy-4093352598-wlhvg   1/1       Running   0          10s       172.17.0.12   minikube   <none>
web-deploy-4093352598-xzyr7   1/1       Running   0          10s       172.17.0.10   minikube   <none>
```

---