このページでは、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.9
のnginx
イメージを実行します。 - ポート
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 を検査する
- Deployment をスケーリングする
HorizontalPodAutoscaler
オブジェクトを使用して Deployment を自動スケーリングする- Deployment を削除する
ステータスとライフサイクル
Deployment は、ライフサイクルの 3 つの状態(進行中、完了、または失敗)のいずれかになります。
進行中状態は、Deployment がポッドの作成やスケーリングなどのタスクを実行中であることを示します。
完了状態は、Deployment がタスクを正常に完了し、そのすべてのポッドが最新の仕様で動作中かつ利用可能であり、動作中の古いポッドが存在しないことを示します。
失敗状態は、Deployment がタスクの完了を妨げている 1 つ以上の問題を検出したことを示します。原因としては、割り当てや権限の不足、イメージの pull エラー、制限範囲、ランタイム エラーなどが考えられます。Deployment が失敗した原因を調査するには、kubectl get deployment [DEPLOYMENT+NAME] -o yaml
を実行して、status: conditions
フィールド内のメッセージを確認します。
kubectl rollout status
コマンドを使用して、Deployment の進捗状況のモニタリングや、ステータスの確認を行うことができます。