このセクションでは、Kubernetes クラスタ上に Pod のレプリカを作成し指定した数の Pod を維持し続けるリソースを作成する方法について紹介します。
Replicaset を使用することで、セルフヒーリングといった仕組みによって Node サーバーや Pod に障害が発生した場合でも指定した数の Pod を維持し続けることができ障害時の影響を低減できます。
サンプルのマニフェストファイルを新規作成し、以下コードを記述します。
[root@kube-master sample-replicaset]# vi sample-replica.yaml
spec の replicas : 3 はレプリカ数を3つと定義しています。spec の selector の matchLabels では app: sample-app ラベルを付与した Pod をレプリカ数のカウントにすることを定義しています。spec の template ではレプリカとして作成する Pod のテンプレートを定義し template の条件で Pod のレプリカが作成されます。
apiVersion: apps/v1 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
Master サーバーから 作成したマニフェストを実行し、Kubernetes クラスタ上にリソースを作成します。
[root@kube-master sample-replicaset]# kubectl apply -f sample-replica.yaml replicaset.apps/sample-rs created [root@kube-master sample-replicaset]#
Master サーバーから Kubernetes クラスタ上のレプリカの状態を確認します。
[root@kube-master sample-replicaset]# kubectl get replicasets -o wide NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR sample-rs 3 3 3 44m nginx-container nginx:1.12 app=sample-app [root@kube-master sample-replicaset]# [root@kube-master sample-replicaset]# kubectl get pods -l app=sample-app -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES sample-rs-c72x7 1/1 Running 0 3m26s 10.244.2.32 kube-work2 <none> <none> sample-rs-p84v2 1/1 Running 0 41s 10.244.1.113 kube-work1 <none> <none> sample-rs-zrk72 1/1 Running 0 3m26s 10.244.2.30 kube-work2 <none> <none> [root@kube-master sample-replicaset]#
Node サーバー停止時の動作
Node サーバー( kube-work2 )を停止します。
[root@kube-work2 ~]# shutdown -h now Connection to kube-work2 closed by remote host. Connection to kube-work2 closed. [yuji@localhost ~]$
Master サーバーから Kubernetes クラスタに参加しているノードの状態を確認します。停止後、約30秒で Node サーバー( kube-work2 )の STATUS が NotReady に変わります。
[root@kube-master sample-replicaset]# kubectl get nodes NAME STATUS ROLES AGE VERSION kube-master Ready master 35h v1.13.1 kube-work1 Ready <none> 35h v1.13.1 kube-work2 NotReady <none> 35h v1.13.1 [root@kube-master sample-replicaset]#
停止後、約30秒で Kubernetes クラスタ上のレプリカは以下の状態になります。レプリカの READYが 3 から 1 に減少します。
oot@kube-master sample-replicaset]# kubectl get replicasets -o wide NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR sample-rs 3 3 1 46m nginx-container nginx:1.12 app=sample-app [root@kube-master sample-replicaset]#
[root@kube-master sample-replicaset]# kubectl get pods -l app=sample-app -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES sample-rs-c72x7 1/1 Running 0 5m48s 10.244.2.32 kube-work2 <none> <none> sample-rs-p84v2 1/1 Running 0 3m3s 10.244.1.113 kube-work1 <none> <none> sample-rs-zrk72 1/1 Running 0 5m48s 10.244.2.30 kube-work2 <none> <none> [root@kube-master sample-replicaset]#
停止後、約5分40秒で Kubernetes クラスタ上のレプリカは以下の状態になります。停止した Node サーバー( kube-work2 )で作成されていた Pod リソースの状態が Terminating となり、 Node サーバー( kube-work1 )で レプリカ数分の Pod が起動します。また、 レプリカの READYが 1 から 3 に増加します。
[root@kube-master sample-replicaset]# kubectl get replicasets -o wide NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR sample-rs 3 3 3 52m nginx-container nginx:1.12 app=sample-app [root@kube-master sample-replicaset]# [root@kube-master sample-replicaset]# kubectl get pods -l app=sample-app -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES sample-rs-929b4 1/1 Running 0 9s 10.244.1.115 kube-work1 <none> <none> sample-rs-c72x7 1/1 Terminating 0 10m 10.244.2.32 kube-work2 <none> <none> sample-rs-gdmxq 1/1 Running 0 9s 10.244.1.114 kube-work1 <none> <none> sample-rs-p84v2 1/1 Running 0 8m14s 10.244.1.113 kube-work1 <none> <none> sample-rs-zrk72 1/1 Terminating 0 10m 10.244.2.30 kube-work2 <none> <none> [root@kube-master sample-replicaset]#
停止した Node サーバー( kube-work2 )を起動します。
起動後、Master サーバーから Kubernetes クラスタに参加しているノードの状態を確認すると、Node サーバー( kube-work2 )の STATUS が Ready に変わります。
[root@kube-master sample-replicaset]# kubectl get nodes NAME STATUS ROLES AGE VERSION kube-master Ready master 35h v1.13.1 kube-work1 Ready <none> 35h v1.13.1 kube-work2 Ready <none> 35h v1.13.1 [root@kube-master sample-replicaset]#
起動後、Kubernetes クラスタ上のレプリカの状態を確認すると、Terminating の状態になっていた Pod が Node サーバー( kube-work2 )から削除されます。
[root@kube-master sample-replicaset]# kubectl get replicasets -o wide NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR sample-rs 3 3 3 75m nginx-container nginx:1.12 app=sample-app [root@kube-master sample-replicaset]# [root@kube-master sample-replicaset]# kubectl get pods -l app=sample-app -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES sample-rs-929b4 1/1 Running 0 24m 10.244.1.115 kube-work1 <none> <none> sample-rs-gdmxq 1/1 Running 0 24m 10.244.1.114 kube-work1 <none> <none> sample-rs-p84v2 1/1 Running 0 32m 10.244.1.113 kube-work1 <none> <none> [root@kube-master sample-replicaset]#
Pod リソース停止時の動作
停止前に、Master サーバーから Kubernetes クラスタに参加しているノードの状態を確認します。 3つの Pod が Node サーバー( kube-work1 )で稼働していることがわかります。
[root@kube-master sample-replicaset]# kubectl get pods -l app=sample-app -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES sample-rs-929b4 1/1 Running 0 29m 10.244.1.115 kube-work1 <none> <none> sample-rs-gdmxq 1/1 Running 0 29m 10.244.1.114 kube-work1 <none> <none> sample-rs-p84v2 1/1 Running 0 37m 10.244.1.113 kube-work1 <none> <none> [root@kube-master sample-replicaset]#
1つの Pod リソースを削除します。
[root@kube-master sample-replicaset]# kubectl delete pod sample-rs-gdmxq pod "sample-rs-gdmxq" deleted [root@kube-master sample-replicaset]#
Pod 削除後に、Master サーバーから Kubernetes クラスタに参加しているノードの状態を確認します。 レプリカ数分の3つの Pod が稼働し、2つの Pod がNode サーバー( kube-work1 )で稼働し、1つの Pod が Nodeサーバー( kube-work2 )で稼働していることがわかります。
[root@kube-master sample-replicaset]# kubectl get pods -l app=sample-app -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES sample-rs-7469w 1/1 Running 0 4s 10.244.2.33 kube-work2 <none> <none> sample-rs-929b4 1/1 Running 0 29m 10.244.1.115 kube-work1 <none> <none> sample-rs-p84v2 1/1 Running 0 37m 10.244.1.113 kube-work1 <none> <none> [root@kube-master sample-replicaset]#
Master サーバーからレプリカ名を指定して、Kubernetes クラスタ上の レプリカを削除します。
[root@kube-master sample-replicaset]# kubectl delete rs sample-rs replicaset.extensions "sample-rs" deleted [root@kube-master sample-replicaset]#
Master サーバーから Kubernetes クラスタ上の Pod リソースが削除されていることを確認します。
[root@kube-master sample-replicaset]# kubectl get pods No resources found. [root@kube-master sample-replicaset]#