SE(しがないエンジニア)のブログ

IT技術ネタ(クラウド・セキュリティ周り)が中心です!他雑記(お馬さん 他いろいろ)もあり。

Kubernetes(AKS)をやさしく学ぶ旅 その7

少し間が開きましたが・・・・。

その6 では Pod の少し詳細な部分に触れ、ReplicaSet をこれからハンズオンする、というところで完了しました。

www.btsn.xyz

今までに構築してきた環境をベースに ReplicaSet のハンズオンを行います。

ハンズオン Start!

まずは、ReplicaSet を「5」で指定(replicas: 5)したマニフェストファイルを準備して ReplicaSet を作成します。

xxx > kubectl create -f ReplicaSet/replicaset.yaml
replicaset.apps/photoview-rs created

その後、Pod 情報を確認してみると・・・・。

xxx > kubectl get pod --show-labels
NAME                 READY     STATUS    RESTARTS   AGE       LABELS
photoview-rs-2mhpk   1/1       Running   0          8m26s     app=photoview,env=prod
photoview-rs-ghn9h   1/1       Running   0          8m26s     app=photoview,env=prod
photoview-rs-hpps2   1/1       Running   0          8m26s     app=photoview,env=prod
photoview-rs-m4fnl   1/1       Running   0          8m26s     app=photoview,env=prod
photoview-rs-sz5vb   1/1       Running   0          8m26s     app=photoview,env=prod

この上で詳細情報(describe)を確認してみると・・・・。

xxx > kubectl describe rs photoview-rs
(略)
Replicas:     5 current / 5 desired
(略)

正常に5つの ReplicaSet が作成されているようです!ちなみに、マニフェストファイルの「replicas: n」を変更すればそれに応じた ReplicaSet になります。ここで一度、ReplicaSet は削除してしまいますので、Pod もまとめて削除されます。

xxx > kubectl delete -f ReplicaSet/replicaset.yaml
replicaset.apps "photoview-rs" deleted

xxx > kubectl get pod
NAME                 READY     STATUS        RESTARTS   AGE
photoview-rs-2mhpk   0/1       Terminating   0          15m
photoview-rs-m4fnl   0/1       Terminating   0          15m

xxx > kubectl get pod
No resources found.

*一度目の確認時にはまだ残っていたようです

クラスター内の制御はどう行っているの?

ReplicaSet のハンズオンを行ってみましたが、実際クラスター内で Pod を指定した数だけ起動するのはどのように行っているのでしょうか?これを制御しているのが「コントローラー」です。クラスターにおいて Pod が設定した数値になっているかを確認しそうでない場合は自動で修復を試みます。ちなみに、ReplicaSet は指定された数の Pod を起動するリソースではなく指定された数の Pod を起動した状態を維持するリソースです。(ここも本来はハンズオンがあるのですが割愛)

Pod に障害があった場合はどのような挙動になるの?

実際に ReplicaSet で Pod に障害が発生した場合はどうなるのでしょうか?挙動を確認してみます。

xxx > kubectl get pod -o wide
NAME                     READY     STATUS    RESTARTS   AGE       IP           NODE                       NOMINATED NODE   READINESS GATES
nginx-pod                1/1       Running   0          2m25s     10.244.2.4   aks-nodepool1-11226562-1              
nginx-replicaset-8vchz   1/1       Running   0          77s       10.244.1.6   aks-nodepool1-11226562-2              
nginx-replicaset-jzthk   1/1       Running   0          77s       10.244.1.5   aks-nodepool1-11226562-2              
nginx-replicaset-lgmjf   1/1       Running   0          77s       10.244.0.8   aks-nodepool1-11226562-0              
nginx-replicaset-mzfrw   1/1       Running   0          77s       10.244.2.5   aks-nodepool1-11226562-1              

ここで、意図的にPod「nginx-replicaset-8vchz」を削除してみます。

xxx > kubectl delete pod nginx-replicaset-8vchz
pod "nginx-replicaset-8vchz" deleted

xxx > kubectl get pod -o wide
NAME                     READY     STATUS    RESTARTS   AGE       IP           NODE                       NOMINATED NODE   READINESS GATES
nginx-pod                1/1       Running   0          4m59s     10.244.2.4   aks-nodepool1-11226562-1              
nginx-replicaset-9k9q9   1/1       Running   0          17s       10.244.1.7   aks-nodepool1-11226562-2              
nginx-replicaset-jzthk   1/1       Running   0          3m51s     10.244.1.5   aks-nodepool1-11226562-2              
nginx-replicaset-lgmjf   1/1       Running   0          3m51s     10.244.0.8   aks-nodepool1-11226562-0              
nginx-replicaset-mzfrw   1/1       Running   0          3m51s     10.244.2.5   aks-nodepool1-11226562-1              

すると、「nginx-replicaset-8vchz」は消え「nginx-replicaset-9k9q9」が作成されます。ちなみに、IPアドレスも変わっております。終了した Pod に関しては再起動ではなく別途作成されることに注意しましょう。また、Kubernetes ではコンテナーアプリケーションを運用する際にステートフルなアプリケーションの場合、Pod の状態を保証できないため、その際は StatefulSet を利用する必要があります。(ステートフル=クライアントのセッションを保持するもの)

Node に障害があった場合はどうなるのか?

Pod ではなく Node の障害の場合はどうなるのでしょうか?クラスターを構成するマシンが落ちた想定で進めてみます。

xxx > kubectl get node
NAME                       STATUS    ROLES     AGE       VERSION
aks-nodepool1-11226562-0   Ready     agent     62m       v1.15.4
aks-nodepool1-11226562-1   Ready     agent     60m       v1.15.4
aks-nodepool1-11226562-2   Ready     agent     61m       v1.15.4

xxx > az vm stop --name aks-nodepool1-11226562-0 -g MC_AKSCluster_AKSCluster_japaneast
About to power off the specified VM...
It will continue to be billed. To deallocate a VM, run: az vm deallocate.

xxx > kubectl get node
NAME                       STATUS     ROLES     AGE       VERSION
aks-nodepool1-11226562-0   NotReady   agent     64m       v1.15.4
aks-nodepool1-11226562-1   Ready      agent     62m       v1.15.4
aks-nodepool1-11226562-2   Ready      agent     64m       v1.15.4

xxx > kubectl get pod -o wide
NAME                     READY     STATUS              RESTARTS   AGE       IP           NODE                       NOMINATED NODE   READINESS GATES
(略)
nginx-replicaset-lgmjf   1/1       Terminating         0          19m       10.244.0.8   aks-nodepool1-11226562-0              
(略)

タイムラグがありますが、「STATUS」列は「Terminating」になります。試しに「-0」だけでなく「-2」も落としてみました。

xxx > az vm stop --name aks-nodepool1-11226562-2 -g MC_AKSCluster_AKSCluster_japaneast
About to power off the specified VM...
It will continue to be billed. To deallocate a VM, run: az vm deallocate.

xxx > kubectl get node
NAME                       STATUS     ROLES     AGE       VERSION
aks-nodepool1-11226562-0   NotReady   agent     68m       v1.15.4
aks-nodepool1-11226562-1   Ready      agent     66m       v1.15.4
aks-nodepool1-11226562-2   NotReady   agent     68m       v1.15.4

xxx > kubectl get pod -o wide
NAME                     READY     STATUS        RESTARTS   AGE       IP            NODE                       NOMINATED NODE   READINESS GATES
nginx-pod                1/1       Running       0          26m       10.244.2.4    aks-nodepool1-11226562-1              
nginx-replicaset-5vffm   1/1       Running       0          18s       10.244.2.12   aks-nodepool1-11226562-1              
nginx-replicaset-9k9q9   1/1       Terminating   0          21m       10.244.1.7    aks-nodepool1-11226562-2              
nginx-replicaset-fv8np   1/1       Running       0          5m43s     10.244.2.8    aks-nodepool1-11226562-1              
nginx-replicaset-jzthk   1/1       Terminating   0          25m       10.244.1.5    aks-nodepool1-11226562-2              
nginx-replicaset-lgmjf   1/1       Terminating   0          25m       10.244.0.8    aks-nodepool1-11226562-0              
nginx-replicaset-mzfrw   1/1       Running       0          25m       10.244.2.5    aks-nodepool1-11226562-1              
nginx-replicaset-s57gt   1/1       Running       0          18s       10.244.2.14   aks-nodepool1-11226562-1              

*途中、「-0」をカバーして「STATUS」列が「ContainerCreating」のものも表示されました。

結果として、全てが「-1」に寄る形になっております。(負荷かかりそうですね。。)

ちなみに、「-0」と「-2」を Start として戻しても Pod が立ち上げた2台に配置されるわけではありませんでした。

ひとまず、ここで Pod は削除します。

負荷に応じて Pod の数を変える(ハンズオンなし)

Kubernetes はスケーラビリティが高いというところがメリットですが、2種類のスケーラビリティのキーワードを学びます。

 

・スケールアウト(水平スケール)

➡簡易的な説明として「台数を増やすこと」

・スケールアップ(垂直スケール)

➡簡易的な説明として「リソースを増強すること」

 

Pod で考える水平スケールとしては前述でマニフェストファイルを書き換えましたが、コマンドの発行でも可能です。「kubectl scale --replicas=n ~~」でOKです。

ちなみに、Kubernetes は、CPU使用率やそれ以外の各種メトリックを使用して、Pod の数をスケールすることが可能です。機能としては Horizontal Pod Autoscaler です。

qiita.com

ちなみに、当機能は ReplicaSet だけでなくその他の Deployment や StatefulSet 等にも利用が可能です。マニフェストに記述して実現します。

 

とまぁ、ハンズオン含め長くなってしまいましたが、前回の その6 と今回の その7 にてPod の詳細と ReplicaSet の動き等は完了とします!