Deployment

このページでは、Kubernetes Deployment オブジェクトと Google Kubernetes Engine でのその使用方法について説明します。

Deployment とは

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

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

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

使用パターン

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

Deployment を作成する

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

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

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

この例では、

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

要約すると、ポッド テンプレートには、この Deployment によって作成されるポッドに関する次の手順が含まれています。

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

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

Deployment を更新する

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

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

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

Deployment を使用すると、少なくとも指定した数より 1 つ少ないレプリカが動作しており、使用できないポッドは多くても 1 つであることを保証できます。同様に、Deployment を使用すると、少なくとも指定した数より 1 つ多いレプリカが動作しており、必要な数より多く動作しているポッドが多くても 1 つであることを保証できます。

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

Deployment を管理する

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

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

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

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

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

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

kubectl rollout status コマンドを使用して、Deployment の進捗状況を監視したり、ステータスをチェックしたりできます。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Kubernetes Engine のドキュメント