Kubernetes デプロイメントの完全な説明

Kubernetes デプロイメントの完全な説明

  • ITOps・DevOps
6分で読めます 更新日 May 20, 2021

ポイント: Kubernetesデプロイメントは、Podとレプリカセットを管理するための宣言的な更新を可能にし、ダウンタイムなしでアプリケーションのシームレスな更新を促進します。これにより、ユーザーはデプロイメントを効率的にスケール、ロールバック、および管理できます。

  • デプロイメント管理には、kubectl apply、scale、およびrolloutなどの重要なコマンドが含まれます。
  • ユーザーは、アプリケーションの安定性を保つために、デプロイメントを簡単に一時停止、再開、ロールバックできます。

Kubernetes デプロイメントは、Pods と ReplicaSets に宣言的な更新を提供するプロセスです。ユーザーがマニフェスト (YAML) ファイルで望ましい状態を宣言でき、コントローラーが現在の状態を宣言された状態に変更します。それでは、Kubernetes デプロイメントを作成して使用する方法を見ていきましょう。デプロイメントプロセスを簡素化し、管理、スケール、ロールバックを行うために Kubernetes デプロイメントを活用する方法を説明します。この記事の目的のために、Windows 環境で Windows Subsystem for Linux (WSL) を使用してローカルにデプロイされた Kubernetes クラスターを使用します。

Kubernetes デプロイメントの作成

まず、4 つのレプリカを持つシンプルな Nginx デプロイメントを作成します。他の Kubernetes 構成と同様に、デプロイメントファイルには以下が含まれます:

  • apiVersion (apps/v1)
  • Kind (Deployment)
  • メタデータと、レプリカとデプロイメントに関連する構成を定義する spec セクション

nginx-deployment.yaml

    apiVersion: apps/v1
kind: Deployment
metadata:
  # Define the Deployment Name
  name: nginx-deployment
  labels:
    app: webserver
spec:
  # Define the Number of Pods
  replicas: 4
  # Define the Selector
  selector:
    matchLabels:
      app: webserver
  template:
    metadata:
      labels:
        app: webserver
    spec:
      containers: # Container Details
      - name: nginx
        image: nginx:latest # Image
        ports:
        - containerPort: 80

次のコマンドを使用してデプロイメントを作成できます。コマンドを保存するために --record フラグを追加しました。

    kubectl apply -f nginx-deployment.yaml --record

結果:

Nginx デプロイメント

上記のデプロイメントファイルのメタデータおよび仕様セクションに次のエントリを定義しました。

  • デプロイメント名とラベル(app: webserver)。
  • レプリカ数(ポッド)、コントローラーがターゲットポッドを選択するセレクター。(ラベルはmatchLabelsフィールドを使用して必要なポッドを選択するために使用されます。)テンプレートセクションにはポッドの実際のテンプレートが含まれています。このセクションは、各ポッドが持つメタデータと仕様(コンテナ定義)を定義します。この場合、Nginxイメージとコンテナポートを80として定義しました。

しばらく後にKubernetesクラスターを確認すると、指定されたテンプレートでポッドがデプロイされているのがわかります。また、describeコマンドを使用してデプロイメントの詳細を取得できます。

    kubectl get all

結果:

kubect
    kubectl describe deployment nginx-deployment

結果:

デプロイメント結果

レプリカセットの公開

デプロイメントを作成したので、Nginxウェブサーバーが正しくデプロイされたかどうかを確認する必要があります。これを達成するための簡単な方法は、デプロイメントを公開するサービスオブジェクトを作成することです。ここで重要なのは、デプロイメントを公開する方法とパラメーターは、Kubernetesクラスターの設定によって異なる可能性があるということです。

    kubectl expose deployment nginx-deployment --type=LoadBalancer --name=nginx-web-server

結果:

ロードバランサー
    kubectl get services

結果:

サービス

次に、ローカルホストのポート80に移動して、デフォルトのNginxサーバーのランディングページが表示されるかどうかを確認します。

ようこそ

Kubernetes デプロイメントの詳細を確認

Kubernetes クラスターを管理する際の最初のステップは、成功したデプロイメントを確認することです。この目的のために、kubectl rollout status および kubectl get deployment コマンドを使用できます。

  • kubectl rollout status は、デプロイメントが成功したかどうかをユーザーに知らせます。
  • kubectl get deployment は、望ましいレプリカ数と更新されたレプリカ数、実行中のレプリカ数とその可用性を示します。前述のように、kubectl describe コマンドを使用してデプロイメントの完全な情報を得ることができます。
    kubectl rollout status deployment nginx-deployment
kubectl get deployment nginx-deployment

結果:

ロールアウトステータス

デプロイメント中に作成された ReplicaSets に関する情報を取得するために、kubectl get ReplicaSet コマンドを使用できます。デフォルトでは、Kubernetes は ReplicaSet 名に pod-template-hash 値を自動的に追加します。ただし、ReplicaSet の名前を変更しないでください。そうすると、デプロイメントが壊れます。

    kubectl get replicaset

結果:

レプリカセット

kubectl get pod コマンドを使用して、セレクターを定義しながらデプロイメントに関連するポッドに関する情報のみを取得できます。この場合、セレクターとして「app:webserver」ラベルを使用します。

    kubectl get pod --selector=app=webserver

結果:

ウェブサーバー

Kubernetesデプロイメントの管理

デプロイメントを作成し、その情報を取得する方法がわかりました。次のステージはデプロイメントの管理です。デプロイメントがシンプルなReplicaSetと異なる点は、デプロイメントがユーザーにポッド(ポッドテンプレート)を更新することを可能にし、基盤となるアプリケーションに中断を引き起こさない点です。

デプロイメントのローリングアップデートの実行

デプロイメント内のNginxサーバーのバージョンを特定のサーバーバージョンにターゲットに変更する必要があると仮定しましょう。これを行うには、次のいずれかの方法を使用できます:

  • kubectl set imageコマンドを使用
  • デプロイメントの設定ファイルを変更

set imageコマンドの使用

set imageコマンドは、テンプレートのコンテナ名と必要なイメージ名を使用してポッドを更新するために使用できます。

    kubectl set image deployment nginx-deployment nginx=nginx:1.19.10

結果:

イメージデプロイメント

get rollout statusコマンドを直ちに実行すれば、ローリングプロセスが得られます。

    kubectl rollout status deployment nginx-deployment

結果:

ロールアウトステータスデプロイメント

デプロイメント設定ファイルの変更

edit deploymentコマンドを使用して設定ファイルを編集できます。関連するセクション(コンテナイメージ)に移動し、必要な変更を行います。新しい設定を保存する瞬間にKubernetesはポッドの更新プロセスを開始します。

    kubectl edit deployment nginx-deployment

デプロイメント編集ビュー(nginx-deployment):

デプロイメント編集ビュー

デプロイメント戦略

Kubernetesは「Recreate」と「RollingUpdate」の2つのデプロイメント戦略を使用してポッドを再作成します。これらの戦略は.spec.strategy.typeフィールドで定義できます。RollingUpdate戦略はデフォルトのデプロイメント戦略です。

  • Recreate は、新しいポッドを作成する前にすべての既存のポッドを削除します。
  • RollingUpdate は、ローリングアップデート方式でポッドを再作成します。さらに、アプリケーションの可用性を中断することなく、ポッドを段階的に削除および再作成します。この戦略は、ローリングアップデートプロセスを制御するためにmaxUnavailableおよびmaxSurgeの値を利用します。
    • maxUnavailable は、更新プロセスで利用できない最大のポッド数を定義します。
    • maxSurge は、作成できる最大のポッド数を定義します。

私たちのデプロイメントでは、明示的に戦略を定義していないため、KubernetesはデフォルトのRollingUpdate戦略を使用します。describeコマンドを使用して、デプロイメントの現在の戦略を確認できます。

    kubectl describe deployment nginx-deployment | grep Strategy

結果:

グレップ戦略

上記の出力から、RollingUpdate戦略のデフォルト設定はmax unavailableが25%、max surgeが25%であることがわかります。私たちの設定では4つのレプリカを作成しています。上記の設定に基づく更新プロセスでは、1つのポッドが破壊される一方で、1つのポッドが作成されます(4の25%は1です)。describeコマンドを使用してデプロイメントのイベントを表示し、更新プロセスの理解を深めることができます。

    kubectl describe deployment nginx-deployment

結果:

イベント

現在のReplicaSetを見ると、4つのポッドがあり、古いReplicaSetにはポッドが存在しないことがわかります。

    kubectl get replicasets

結果:

レプリカセット

デプロイメントの一時停止と再開

Kubernetesデプロイメントは、デプロイメントを一時停止および再開する機能を提供します。これにより、ユーザーは新しいReplicaSetのローリングをトリガーすることなく、変更を加えたり問題に対処したりできます。デプロイメントを一時停止するには、「rollout pause deploy」コマンドを使用できます。

    kubectl rollout pause deploy nginx-deployment

結果:

デプロイメントを一時停止

今、デプロイメントの一時停止状態でNginxイメージを更新すると、コントローラーは変更を受け入れますが、新しいReplicaSetのローリングをトリガーすることはありません。ローリングステータスを見ると、保留中の変更が表示されます。

    kubectl set image deployment nginx-deployment nginx=nginx:1.20 --record
kubectl rollout status deployment nginx-deployment

結果:

イメージセットデプロイメント

「rollout resume deploy」コマンドを実行することで、デプロイメントを再開できます。

    kubectl rollout resume deploy nginx-deployment
kubectl rollout status deployment nginx-deployment

結果:

デプロイメントを再開

デプロイメントのスケーリング

デプロイメントはReplicaSetsに依存してポッドを管理するため、ポッドの数を増減できます。このスケーリングは次のいずれかの方法で行うことができます:

  • 手動
  • 自動スケーリングルールを設定することによって

手動スケーリング

scaleコマンドを使用してレプリカパラメータでデプロイメントを望む数にスケールできます。たとえば、次のコマンドを使用して、デプロイメントを4ポッドから8ポッドにスケールアップします。

    kubectl scale deployment nginx-deployment --replicas=8
kubectl rollout status deployment nginx-deployment

結果:

デプロイメントをスケール

このデプロイメントに関連するポッドを見ると、現在8つのポッドがあるのがわかります。

    kubectl get pod --selector=app=webserver

結果:

セレクターアプリサーバー

自動スケーリング

デプロイメントのスケーリングのベストプラクティスは、自動スケーリングルールを設定することです。これにより、ポッドは事前定義された閾値に応じてスケールします。では、ノードのCPU負荷に応じてスケールする自動スケーリングルールを作成しましょう。

    kubectl autoscale deployment nginx-deployment --min=5 --max=10 --cpu-percent=70

結果:

オートスケールデプロイメント

上記の設定に従うと、CPU負荷が70%を超えると、デプロイメントは最大ポッド数(最大10ポッド)に達するまでスケールします。一方、負荷が減少すると、5ポッド(最小5ポッド)になるまで徐々にスケールバックします。

デプロイメントのロールバック

Kubernetesは、以前のリビジョンにデプロイメントをロールバックすることもサポートしています。これは、デプロイメントの変更を元に戻すことを可能にする重要な機能です。たとえば、重要な本番バグがクラスターにデプロイされた場合、バグが修正されるまでダウンタイムなしで、以前のリビジョンにデプロイメントをロールバックすることができます。設定を誤ったイメージで更新したと仮定しましょう。(この例ではcaddyウェブサーバーを使用します。)

    kubectl set image deployment nginx-deployment nginx=caddy:latest --record

結果:

Nginx Caddy

ここで、デプロイメントコントローラーの履歴機能が役立ちます。コントローラーはポッドテンプレートに対する変更を追跡し、履歴に保持します。コマンドにrecordフラグを指定すると、それは履歴に反映されます。

    kubectl rollout history deployment nginx-deployment

結果:

ロールアウト履歴デプロイメント

リビジョン番号を使用してデプロイメントコントローラーに以前のリビジョンにロールバックするよう指示できます。まず、ロールバックするリビジョンが正しいデプロイメントであるか確認しましょう。ここでは、3番目のリビジョンにロールバックしようとしています。historyコマンドで指定したリビジョンの詳細を取得するには、リビジョンを指定します。

    kubectl rollout history deployment nginx-deployment --revision=3

結果:

リビジョン

リビジョンを確認した後、「kubectl rollout undo」コマンドを「to-revision」パラメータと共に使用してデプロイメントをロールバックします。

    kubectl rollout undo deployment nginx-deployment --to-revision=3
kubectl rollout status deployment nginx-deployment

結果:

リビジョンにデプロイメント

以上です!これでデプロイメントを正常にロールバックしました。ロールバック後、現在の設定としてデプロイされたため、3番目のリビジョンは表示されなくなります。しかし、ロールバックされた新しいデプロイメントのために、より高いリビジョン番号の新しいレコードを見ることができます。

    kubectl rollout history deployment nginx-deployment

結果:

変更の原因

K8sデプロイメントの要約

この記事では、Kubernetesデプロイメントの機能の表面をほんの少し触れただけです。ユーザーは、デプロイメントを他のすべてのKubernetes機能と組み合わせることで、あらゆるニーズに適したより強力なコンテナ化アプリケーションを作成できます。

関連する読み物

これらの投稿は私自身の見解であり、BMCの立場、戦略、または意見を必ずしも表すものではありません。

ITOps・DevOpsの関連記事

BMCからのさらなる情報に興味がありますか?

ザ・ブリーフは、メインフレームとエンタープライズオーケストレーションに関する月刊メールです:研究、顧客ストーリー、製品ニュース、イベント。

このオファーに登録することで、あなたはBMCのプライバシーポリシーを読み、同意したことを確認します。

ザ・ブリーフに登録しました

ザ・ブリーフは、メインフレームとエンタープライズオーケストレーション—BMC AMIおよびControl-M—に関するアナリストの研究、顧客の展開、両者にわたるイベントを網羅しています。