スケーリングのための Deployment

KubernetesBeginner
オンラインで実践に進む

はじめに

これまでの実験では、単一の Pod を作成しました。Pod は基本的な構成要素ですが、手作業で管理するのは大変です。Pod が停止した場合は、手動で再起動しなければなりません。Pod の数を増やしたい場合も、手動で追加の Pod を作成する必要があります。

そこで登場するのが Deployment です。

Deployment は、ReplicaSet と Pod を代わりに管理してくれる、より上位のコントローラーです。必要なレプリカ数と使用する Pod テンプレートを宣言すると、Kubernetes は実際の状態がその宣言どおりになるように維持します。

ここで重要なのは、個々の Pod を管理することから、繰り返し実行できるワークロードを管理することへの転換です。単一の Pod は 1 つのインスタンスにすぎないため、障害に弱い存在です。Deployment では、Pod を作成するためのパターンと、存在すべき Pod の目標数を定義します。このパターンによって、スケーリングとセルフヒーリングが可能になります。

この実験では、次のことを学びます。

  • 明確な目標(3 レプリカ)を持つ厳格な Manager(Deployment)を作成する。
  • Manager がワーカー(Pod)を作成する様子を確認する。
  • ワーカーを 1 つ「停止」させ、Manager の反応(セルフヒーリング)を確認する。
  • Manager にさらにワーカーを作成させる(スケーリング)。

Deployment の YAML を作成する

このステップでは、Manager の作業指示書を作成します。これは、実行するイメージと必要なコピー数(レプリカ数)を定義する YAML ファイルです。

通常の Pod マニフェストと比べて、構造が追加されていることに注目してください。Deployment には selector と template が含まれます。selector は、どの Pod がこの Deployment に属するかを Kubernetes に伝えます。template は、新しい Pod の作成方法を定義します。この 2 つの設定は一致していなければなりません。一致しない場合、Deployment は意図した Pod を正しく管理できません。

まず、プロジェクトディレクトリにいることを確認します。

cd ~/project

nano を使用して、deployment.yaml という名前の新しいファイルを作成します。

nano deployment.yaml

次の設定をファイルに貼り付けます。replicas: 3 の行に注意してください。この行でチームの人数を定義します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.14.2
          ports:
            - containerPort: 80

保存するには、Ctrl+X、Y、Enter の順に押します。

このファイルは Kubernetes に次の内容を指示します。「nginx-deployment という名前の Deployment を作成する。nginx:1.14.2 イメージを実行する Pod を常に 3 個維持する。これらの Pod を探すときは、app: nginx というラベルが付いた Pod を対象にする。」

適用して確認する

作業指示書を作成できたので、Manager を採用しましょう。設定をクラスターに適用します。

Deployment を作成すると、Kubernetes は通常、内部で ReplicaSet という別のオブジェクトも作成します。ReplicaSet は、要求された数の Pod を稼働させ続ける役割を直接担うコンポーネントです。現時点では、初心者が ReplicaSet を直接管理する必要はありません。ただし、コマンドの出力で ReplicaSet をよく見かけるため、存在を知っておくと役立ちます。

kubectl apply -f deployment.yaml

Kubernetes は次のメッセージを表示して、作成を確認します。deployment.apps/nginx-deployment created

Deployment(Manager)はすぐに 3 個の Pod の作成を開始します。Pod をすぐに確認するには、次のコマンドを実行します。

kubectl get pods

名前がすべて nginx-deployment- で始まる、異なる Pod が 3 個表示されます。

NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-66b6c48dd5-8j64w   1/1     Running   0          5s
nginx-deployment-66b6c48dd5-d95l2   1/1     Running   0          5s
nginx-deployment-66b6c48dd5-lzr5w   1/1     Running   0          5s

Deployment 自体の状態も確認できます。

kubectl get deployments

READY 3/3 と表示されれば、要求した 3 個のレプリカがすべて起動して稼働していることを確認できます。

セルフヒーリングをテストする

Kubernetes の最も強力な機能の 1 つが セルフヒーリング(Self-Healing) です。Deployment は、実際に存在する Pod 数が常に目標数(3 個)と一致するように維持します。Pod が 1 個なくなると、すぐに置き換えます。

これは、Kubernetes が実際の状態と目標状態を常に照合しているために機能します。Pod を 1 個削除しても、Deployment に保存されているレプリカの目標数は変わりません。そのため、システムは削除を状態のずれとして認識し、代わりの Pod を作成します。

Pod を 1 個手動で削除して、この動作をテストします。

まず、Pod の一覧をもう一度表示します。

kubectl get pods

Pod の いずれか 1 個 の完全な名前をコピーします(例:nginx-deployment-66b6c48dd5-8j64w)。

次に、その Pod を削除します。

kubectl delete pod <paste-pod-name-here>

Kubernetes は Pod が削除されたことを表示します。続けて、もう一度 kubectl get pods を実行します。

kubectl get pods

次のような変化を確認できます。

  1. 古い Pod が終了処理中になる(または表示されなくなる)。
  2. 名前が異なり、Age が非常に短い(例:2 秒)新しい Pod がすでに表示される。

Deployment はワーカーが 1 個不足したことを検知し、チームの人数を 3 個に保つため、すぐに新しいワーカーを作成しました。これにより、個々のサーバーやコンテナに障害が発生しても、アプリケーションをオンラインのまま維持できます。

スケールアップする

Web サイトの人気が高まったと想像してください。Web サーバー 3 台では足りず、5 台必要になりました。新しいファイルを手動で作成したり、急いで Pod を作成したりする必要があるでしょうか。

Deployment のスケーリングでは、現在稼働しているプロセスだけでなく、宣言された目標数を変更します。そのため、新しいサイズは一度の手動操作が終わった後も維持されます。コントローラーは、再度変更するまで、更新されたレプリカ数を正しい状態として扱い続けます。

いいえ。Manager に人数を増やすよう伝えるだけです。

kubectl scale コマンドを使用すると、稼働中にレプリカ数を変更できます。

レプリカ数を 3 から 5 に変更します。

kubectl scale deployment/nginx-deployment --replicas=5

次に、変更を確認します。

kubectl get pods

5 個の Pod が稼働していることを確認できます。新しい要求を満たすために、2 個の Pod が追加で起動しています。

スケールダウンすることもできます。トラフィックが減った場合は、Pod 数を減らしてリソースを節約できます。

kubectl scale deployment/nginx-deployment --replicas=2

もう一度 kubectl get pods を実行すると、Kubernetes が余分な Pod を終了させ、最終的に 2 個だけ残ることを確認できます。

このように動的にスケーリングできることが、企業が Kubernetes を好む理由です。

まとめ

この実験では、アプリケーションを稼働させ続けるインテリジェントな Manager である Deployment について学びました。

次の操作を成功させました。

  1. ワーカー Pod 3 個を持つ Deployment を作成した。
  2. Deployment が障害のある Pod を自動的に置き換えること(セルフヒーリング)を確認した。
  3. 1 つのコマンドでレプリカ数を増減させた(スケーリング)。

これで、スタンドアロンの Pod を作成することがほとんどない理由を理解できました。Deployment は信頼性と柔軟性を提供し、スケジューリングや再起動といった複雑な作業を代わりに管理してくれます。