Traffine I/O

日本語

2022-06-20

Kubernetesのレプリカ

Kubernetesにおけるレプリカ

Kubernetesにおいて、レプリカは基本的にはPodのコピーです。複数のレプリカを作成することで、Kubernetesは指定された数の同一のPodが常に実行されることを保証します。これにより、アプリケーションの可用性が向上し、負荷分散と冗長性も容易に実現されます。

Podのレプリケーション

Kubernetesの世界では、Podの複製をレプリケーションと呼ぶことが一般的です。ReplicaSetの主な機能は、常に安定した一定数のレプリカPodが実行されるようにすることです。

自己修復能力

Kubernetesの注目すべき機能の一つは、その自己修復メカニズムです。ReplicaSetは、Podまたは一連のPodが常に稼働していることを保証します。Podが停止した場合、ReplicaSetは自動的に新しいPodを作成して、所望のレプリカ数を一定に保ちます。この自己修復プロセスにより、Kubernetes上で実行されるアプリケーションの信頼性と耐久性が向上します。

レプリカの自動配置とメンテナンス

Kubernetesは、ReplicaSetに基づいてレプリカの配置とメンテナンスを自動化します。これは、specで定義された仕様に基づいて行われます。実際の状態が所望の状態と一致しない場合、Kubernetesはその差を調整するために作業を行います。

Pod数の動的定義

Kubernetesのエコシステムはダイナミックかつ堅牢です。必要に応じてPodの数を拡大または縮小することができます。この機能は水平オートスケーリングと呼ばれ、実行中のPodの数を動的に調整することで、負荷の増減に対応します。

YAMLでのReplicaSetの定義

Kubernetesでは、ReplicaSetを含むオブジェクトの定義にYAMLを使用します。

HelloWorld ReplicaSetのYAML構成

KubernetesでReplicaSetを作成するための最初のステップは、YAMLファイルで構成を定義することです。この構成では、メタデータ(名前やラベルなど)、レプリカの所望数、ReplicaSetが構成要素を特定するセレクタ、およびPodに関する詳細が含まれます。

以下は、helloworld ReplicaSetを定義する簡単なYAMLファイルの例です。

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

Minikubeの起動

ReplicaSetをデプロイする前に、Minikubeが実行されていることを確認する必要があります。次のコマンドを使用してMinikubeを起動します。

bash
$ minikube start

ReplicaSetとしてのPodの起動

YAMLファイルが準備できたら、kubectl applyコマンドを使用してReplicaSetを作成します。このコマンドは構成をクラスタに適用します。以下はhelloworld ReplicaSetを起動する方法です。

bash
$ kubectl apply -f replicaset.yaml

Podが起動したことを確認します。

bash
$ kubectl get pods

NAME               READY   STATUS    RESTARTS   AGE
helloworld-4bf2r   1/1     Running   0          42s
helloworld-ssttm   1/1     Running   0          42s

helloworld ReplicaSetの2つのPodが作成されました。

ReplicaSetのリスト表示

ReplicaSetを起動した後は、現在の名前空間内の全てのReplicaSetをリスト表示して作成を確認できます。

bash
$ kubectl get replicaset

NAME         DESIRED   CURRENT   READY   AGE
helloworld   2         2         2       3m12s

このコマンドにより、新たに作成したhelloworld ReplicaSetを含む全てのReplicaSetのリストが返されます。

ReplicaSetのスケールアップ

Kubernetesでは、アプリケーションのスケーリングが容易に行えます。helloworld ReplicaSetのレプリカ数を増やすために、kubectl scaleコマンドを使用できます。

bash
$ kubectl scale --replicas=5 replicaset/helloworld

replicaset.apps/helloworld scaled

このコマンドにより、helloworld ReplicaSetのレプリカ数が5に更新されます。Kubernetesは、新しい所望の状態に一致するように追加のPodを作成します。

自己修復メカニズムのテスト

Kubernetesは、その設計に固有の堅牢な自己修復メカニズムで構築されています。KubernetesのReplicaSetの重要な機能の1つは、特定の数のレプリカPodが常に実行されていることを確保する能力です。ReplicaSet内のPodが停止したり削除された場合、ReplicaSetは自動的に新しいPodを作成して置き換えます。

Podの終了

これをテストするために、helloworld ReplicaSetから1つのPodを終了させ、何が起こるか観察します。kubectl delete podコマンドを使用して特定のPodを削除します。POD_IDの部分をhelloworld ReplicaSetのPodのIDに置き換えてください。

bash
$ kubectl delete pod POD_ID # In my case, POD_ID is helloworld-4bf2r for instance

pod "helloworld-4bf2r" deleted

新しいPodの自動生成の確認

これで、Podの状態を確認します。Kubernetesは、ReplicaSet内の1つのPodが欠落していることに気づくと、自動的に新しいPodを作成して所望のレプリカ数を維持するはずです。

bash
$ kubectl get pods

NAME               READY   STATUS    RESTARTS   AGE
helloworld-55kgl   1/1     Running   0          105s
helloworld-5kkdg   1/1     Running   0          105s
helloworld-drmmv   1/1     Running   0          9s
helloworld-n7sg9   1/1     Running   0          105s
helloworld-ssttm   1/1     Running   0          5m21s

このコマンドを実行すると、削除されたPodの代わりに新しいPodが作成されていることがわかります。これにより、Kubernetesの自己修復機能が示されます。これにより、サービスが障害に対して利用可能であり、耐障害性が確保されます。特に、高可用性と信頼性が重要な本番環境では、この機能が非常に重要です。

クリーンアップ

テストが完了したら、環境をクリーンアップしてリソースを解放し、整理された作業スペースを維持することが良いプラクティスです。

前に作成したhelloworld ReplicaSetを削除するために、kubectl deleteコマンドを使用し、-fフラグの後に構成ファイルの名前を指定します。これにより、ReplicaSetおよび関連する全てのPodが削除されます。

bash
$ kubectl delete -f replicaset.yaml

このコマンドを実行すると、helloworld ReplicaSetによって管理されていた全てのPodが停止され、削除されます。定期的なクリーンアップを実施することで、Kubernetes環境を次の実験やデプロイのために常に準備状態に保つことができます。

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!