デプロイメント


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

Deployment とは

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

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

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

使用パターン

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

Deployment を作成する

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

作成されると、Deployment により、指定された数の Pod が実行され、いつでも利用できるようになります。また、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

この例では、

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

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

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

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

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

Deployment を更新する

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

デフォルトでは、Deployment は更新をトリガーすると、ポッドを停止して、ポッドの数を徐々にゼロまでスケールダウンしてから、ポッドをドレインして破棄します。その後で、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 がポッドの作成やスケーリングなどのタスクを実行中であることを示します。

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

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

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

次のステップ