このセクションでは、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]#