Kubernetes Replicaによるスケールアップ

システムの冗長化にはReplicaというリソースを使用する。Replicaには、Specで定義したレプリカ数を自動配置して維持し、Podが停止した場合に自動復旧する機能がある。

YAMLファイルを利用したReplicaの実行

ここでもYAMLファイルに設定を記述する必要がある。

replicaset.yaml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: helloworld
  labels:
    app: helloworld
spec:
  replicas: 5
  selector:
    matchLabels:
      app: helloworld
  template:
    metadata:
      labels:
        app: helloworld
    spec:
      containers:
        - name: helloworld
          image: gcr.io/google-samples/hello-app:1.0

このYAMLファイルのreplicas部分に指定した値に従ってPodが複製される。今回のファイルでは5になっているため、5個のPodが作成される。

このYAMLファイルを使用してPodをReplicaSetとして起動するには、次のコマンドを実行する。

kubectl apply -f replicaset.yaml

実行結果:

% kubectl apply -f replicaset.yaml
replicaset.apps/helloworld created

ReplicaSetが作成されたか確認するため、次のコマンドを実行する。

kubectl get replicaset

実行結果:

% kubectl get replicaset
NAME         DESIRED   CURRENT   READY   AGE
helloworld   5         5         5       27s
% kubectl get pod
NAME               READY   STATUS    RESTARTS   AGE
helloworld-22r5b   1/1     Running   0          45s
helloworld-9bkcr   1/1     Running   0          45s
helloworld-ft2b7   1/1     Running   0          45s
helloworld-ndsph   1/1     Running   0          45s
helloworld-zrsw4   1/1     Running   0          45s

ReplicaSetが作成されたことを確認でき、5個のPodが作成されたと表示されるため、Pod一覧を見ると確かにPodが作成されていることを確認できる。また、これらのPodはすべてhelloworld-[hash]のような名前で作成されていることも確認できる。

起動中のPod数を増やす

このように作成した起動中のPod数を増やすことも可能である。これはkubectl scaleコマンドに--replicasオプションを追加して実行できる。

kubectl scale --replicas=[Pod数] replicaset/[replicaset名]

例として10個に増やしてみる。

% kubectl scale --replicas=10 replicaset/helloworld
replicaset.apps/helloworld scaled

もう一度ReplicaSet一覧を確認する。

% kubectl get replicaset
NAME         DESIRED   CURRENT   READY   AGE
helloworld   10        10        10      5m11s

Podも確認してみよう。

% kubectl get pod
NAME               READY   STATUS    RESTARTS   AGE
helloworld-22r5b   1/1     Running   0          5m36s
helloworld-26x7g   1/1     Running   0          76s
helloworld-9bkcr   1/1     Running   0          5m36s
helloworld-ft2b7   1/1     Running   0          5m36s
helloworld-ldfpk   1/1     Running   0          76s
helloworld-ndsph   1/1     Running   0          5m36s
helloworld-sjg5c   1/1     Running   0          76s
helloworld-smdhb   1/1     Running   0          76s
helloworld-xgl6m   1/1     Running   0          76s
helloworld-zrsw4   1/1     Running   0          5m36s

実行結果を見ると、Pod数が10個に増えたことを確認できる。

Podが停止したとき

次に、起動したPodの一つを強制的に停止してみる。このときの動作としては、10個あるうち1個のPodが停止したとReplicaSetが判断し、Podを再作成する。このとき停止前とは異なるハッシュが割り当てられ、1個のPodが別のハッシュで新しく作成される。

テストとして、以下のようにhelloworld-22r5bを停止してみる。

% kubectl delete pod helloworld-22r5b
pod "helloworld-22r5b" deleted

Podの状態を確認する。

% kubectl get pod
NAME               READY   STATUS    RESTARTS   AGE
helloworld-26x7g   1/1     Running   0          6m9s
helloworld-9bkcr   1/1     Running   0          10m
helloworld-ft2b7   1/1     Running   0          10m
helloworld-ldfpk   1/1     Running   0          6m9s
helloworld-ndsph   1/1     Running   0          10m
helloworld-sjg5c   1/1     Running   0          6m9s
helloworld-smdhb   1/1     Running   0          6m9s
helloworld-xgl6m   1/1     Running   0          6m9s
helloworld-xmxbx   1/1     Running   0          16s <<<<< 新規作成
helloworld-zrsw4   1/1     Running   0          10m

この場合、停止したhelloworld-22r5bの代わりにhelloworld-xmxbxが自動で作成されたことを確認できる。