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ファイルの例です。
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を起動します。
$ minikube start
ReplicaSetとしてのPodの起動
YAMLファイルが準備できたら、kubectl apply
コマンドを使用してReplicaSetを作成します。このコマンドは構成をクラスタに適用します。以下はhelloworld
ReplicaSetを起動する方法です。
$ kubectl apply -f replicaset.yaml
Podが起動したことを確認します。
$ 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をリスト表示して作成を確認できます。
$ kubectl get replicaset
NAME DESIRED CURRENT READY AGE
helloworld 2 2 2 3m12s
このコマンドにより、新たに作成したhelloworld
ReplicaSetを含む全てのReplicaSetのリストが返されます。
ReplicaSetのスケールアップ
Kubernetesでは、アプリケーションのスケーリングが容易に行えます。helloworld
ReplicaSetのレプリカ数を増やすために、kubectl scale
コマンドを使用できます。
$ 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に置き換えてください。
$ 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を作成して所望のレプリカ数を維持するはずです。
$ 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が削除されます。
$ kubectl delete -f replicaset.yaml
このコマンドを実行すると、helloworld
ReplicaSetによって管理されていた全てのPodが停止され、削除されます。定期的なクリーンアップを実施することで、Kubernetes環境を次の実験やデプロイのために常に準備状態に保つことができます。