Deployment

このページでは、Kubernetes Deployment オブジェクトについて、および Google Kubernetes Engine(GKE)でのそれらの使用方法について説明します。

Deployment とは

Deployment とは、個々に ID を持たない、複数の同じ Pod のセットのことをいいます。Deployment はアプリケーションの複数のレプリカを実行し、失敗した、または応答しなくなったインスタンスを自動的に置き換えます。このように、Deployment は、アプリケーションの 1 つ以上のインスタンスがユーザーのリクエストに対応できるようにするのに役立ちます。Deployment は Kubernetes Deployment コントローラによって管理されます。

Deployment では、Pod の仕様を含む Pod テンプレートを使用します。Pod の仕様によって、Pod の外観、そのコンテナ内でどのアプリケーションを実行するか、Pod でどのボリュームをマウントするか、Pod のラベルなどが決まります。

Deployment の Pod テンプレートが変更されるたびに、新しい Pod が 1 つずつ自動的に作成されます。

使用パターン

Deployment は、複数のレプリカにマウントされた ReadOnlyMany ボリュームや ReadWriteMany ボリュームを使用するステートレス アプリケーションに適していますが、ReadWriteOnce ボリュームを使用するワークロードには適していません。ReadWriteOnce ボリュームを使用するステートフル アプリケーションには、StatefulSet を使用します。StatefulSet は、Compute Engine の永続ディスクなどの永続ストレージにデータを保存するステートフル アプリケーションやクラスタ化されたアプリケーションをデプロイするように設計されています。StatefulSet は、Kafka、MySQL、Redis、ZooKeeper などの一意で永続的な ID と固有のホスト名が必要なアプリケーションのデプロイに適しています。

Deployment を作成する

Deployment を作成するには、kubectl runkubectl apply、または kubectl create コマンドを使用します。

作成されると、Deployment により、指定された数の Pod が実行され、いつでも利用できることが保証されます。また、Deployment は、失敗した Pod やノードから削除された Pod を自動的に交換します。

YAML 形式の Deployment マニフェスト ファイルの例を以下に示します。

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

この例では、

  • metadata: name フィールドで指定された、nginx という名前の Deployment が作成されます。
  • Deployment によって、複製 Pod が 3 つ作成されます。replicas フィールドで指定されています。
  • Pod テンプレート、つまり、spec: template フィールドは、その Pod に app: nginx というラベルを付けるように指定します。
  • Pod テンプレートの仕様で、Pod が 1 つのコンテナ nginx を実行し、そのコンテナがバージョン 1.7.9 の nginx Docker Hub イメージを実行するように指定しています。template: spec フィールドで指定されています。
  • Deployment では、Pod 用にポート 80 を開きます。

Deployment 仕様の詳細については、Kubernetes API のドキュメントをご覧ください。

要約すると、Pod テンプレートには、この Deployment によって作成される Pod に関する次の指示が含まれます。

  • 各 Pod に app: nginx というラベルを付ける。
  • 1 つのコンテナを作成し、nginx という名前を付ける。
  • バージョン 1.7.9nginx イメージを実行します。
  • ポート 80 を開いてトラフィックを送受信する。

Deployment の作成の詳細については、Deployment を作成するをご覧ください。

Deployment を更新する

Deployment を更新するには、Deployment の Pod テンプレート仕様を変更します。仕様フィールドを変更すると、自動的に更新ロールアウトがトリガーされます。kubectl、Kubernetes API、または Google Cloud Console 内の GKE ワークロードのメニューを使用できます。

デフォルトでは、Deployment が更新をトリガーすると、Deployment は Pod を停止し、Pod の数を徐々にゼロまでスケールダウンし、さらに Pod をドレインして破棄します。その後で、Deployment は、更新された Pod テンプレートを使用して新しい Pod を作成します。

十分な数の新しい Pod が実行されるまで、古い Pod は削除されません。また、十分な数の古い Pod が削除されるまで、新しい Pod は作成されません。Pod がどの順序で作成または削除されるかを確認するには、kubectl describe deployments を実行します。

Deployment を使用すると、特定数より少なくとも 1 つ少ないレプリカを動作させ、多くても 1 つの Pod を使用不可にすることができます。同様に、Deployment を使用すると、特定数より多くても 1 つ多いレプリカを動作させ、特定数より多くても 1 つ多い Pod を動作させることができます。

kubectl rollout undo コマンドを使用すると、更新をロールバックできます。また、kubectl rollout pause を使用して、一時的に Deployment を停止することもできます。

Deployment を管理する

Deployment の一般的な管理タスクのリストを以下に示します。

ステータスとライフサイクル

Deployment は、ライフサイクルの 3 つの状態(進行中、完了、または失敗)のいずれかになります。

進行中状態は、Deployment が Pod の作成やスケーリングなどのタスクを実行中であることを示します。

完了状態は、Deployment がタスクを正常に完了し、そのすべての Pod が最新の仕様で動作中かつ利用可能であり、動作中の古い Pod が存在しないことを示します。

失敗状態は、Deployment がタスクの完了を妨げている 1 つ以上の問題を検出したことを示します。原因としては、割り当てや権限の不足、イメージの pull エラー、制限範囲、ランタイム エラーなどが考えられます。Deployment が失敗した原因を調査するには、kubectl get deployment [DEPLOYMENT+NAME] -o yaml を実行して、status: conditions フィールド内のメッセージを確認します。

kubectl rollout status コマンドを使用して、Deployment の進捗状況の監視や、ステータスの確認を行うことができます。

次のステップ