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が自動で作成されたことを確認できる。