Kubernetes にアプリケーションをデプロイする方法

公開: 2022-11-09

Kubernetes は、ホストまたはノードのクラスターでアプリケーション コンテナーをデプロイ、スケーリング、および操作するための最も一般的な自動化プラットフォームの 1 つです。

この記事では、Kubernetes の中心的なオブジェクトの 1 つであるデプロイについて説明します。 目標は、その動作と、その作成、更新、および削除の方法を理解することです。

展開とは何ですか?

Deployment は、Pod の起動に使用されるオブジェクトの 1 つです。 Kubernetes のベスト プラクティスでは、ステートレス アプリケーションのデプロイの使用が推奨されています。 デプロイメントがなければ、複数の Pod を手動で作成、更新、および削除する必要があり、これは退屈で多くの Pod にとって実行不可能です。

デプロイメントは、Pod を作成するだけでなく、Pod が最新で実行されていることを保証する YAML で単一のオブジェクトを宣言します。 Kubernetes へのデプロイを使用して、アプリケーションを簡単に自動スケーリングすることもできます。 したがって、デプロイメントは、Pod 内のアプリケーションのバージョンをスケーリング、デプロイ、およびロールバックするために使用されます。

デプロイメントはまた、実行したい Pod のコピーの数を Kubernetes に伝え、残りは Kubernetes が処理します。 関連するコントローラーは、デプロイメントの作成時に構成から ReplicaSet を作成します。 ReplicaSet に関連付けられたコントローラーは、ReplicaSet 構成から一連の Pod を作成します。

ReplicaSet を直接作成する代わりに配置を使用する利点は次のとおりです。

  • オブジェクトの履歴化: (「適用」または「編集」による) オブジェクトの各変更により、以前のバージョンのバックアップが作成されます。
  • ロールアウトとロールバックの管理:前のポイントに関連する構成に戻ることができます。

配置の作成

Kubernetes デプロイメントを作成するために使用できる方法は 2 つあります。

命令法

Kubernetes API を使用すると、構成ファイルや YAML 形式のマニフェストを必要とせずに、より直接的で命令的なアプローチが可能になります。 このアプローチでは、何をしてほしいかを言うだけでよく、期待される結果を達成するために何をしなければならないかを Kubernetes が責任を持って定義します。

命令型の方法を使用するには、次のコマンドを使用します。

 kubectl create deployment nginx-deployment --image nginx --port=80

宣言的方法

この方法では、すべてを宣言する必要があります。このコードを使用すると、Kubernetes は定義を読み取り、提示または宣言されたとおりに作成します。

宣言型デプロイメントを使用するには、YAML ファイルを作成する必要があります。

new_deployment.yamlという名前のデプロイ用 YAML ファイル:

 apiVersion: apps/v1 kind: Deployment metadata:  name: nginx-deployment spec:  #Specifies the number of Pod Copies  replicas: 3 #Selects the Pod to be managed by the deployment  selector:    #Matches the defined labels    matchLabels:      deploy: example  template:    metadata:      #Specifies the labels on the Pod.       labels:         deploy: example    spec:      containers:        - name: nginx          image: nginx:1.20.2

この YAML ファイルでは、Kubernetes API のバージョン、作成するオブジェクトのタイプ、デプロイの名前を定義した後、spec セクションがあります。 このセクションでは、最初にレプリカ キーを定義します。これは、デプロイがアクティブにしておく必要がある Pod インスタンスの数を示します。

セレクター ラベルを使用して、デプロイ内のポッドを識別します。 これには、これらのラベルに一致するすべての Pod がデプロイメントでグループ化されることを示す deploy ラベルを使用できます。

その後、デプロイ仕様内に Pod モデルを持つテンプレート オブジェクトが作成されます。 デプロイで Pod が作成されると、このテンプレートを使用して Pod が作成されます。 通常のポッドの仕様は、テンプレート キーの下にあります。

このデプロイでは、ラベル付きの Nginx イメージが Pod にデプロイされます。 また、この点にも注意が必要で、Pod は Kubernetes におけるスケーラビリティの単位であるため、複数のコンテナーを同じ Pod に配置する場合にどのようなパターンを使用するかを考える必要があります。

次に、 new_deployment.yaml Yaml ファイルを適用し、次のコマンドを使用します。

 kubectl apply -f new_deployment.yaml

数秒後、次を使用して展開ステータスを取得できます。

 kubectl get all
配備

展開の取得と更新

作成されたポッド、デプロイ、およびレプリカセットがあることに注意してください。 そのため、デプロイでは常に Replicaset が作成および管理されます。 これで、次のコマンドを使用してデプロイを記述できます。

 kubectl describe deployment nginx-deployment
説明

これで、デプロイメントの完全な説明ができました。 更新が RollingUpdate として定義されている場合にポッドを作成/再構築するために使用される戦略を強調しています。

RollingUpdate戦略では、アプリケーションの 1 つのバージョンを新しいバージョンに整然と移行できます。 これは、Kubernetes で使用されるデフォルトの戦略です。

これに加えて、次の戦略もあります。

  • 再作成:現在実行中の Pod インスタンスを終了し、新しいバージョンでそれらを「再作成」します。
  • 青/緑:この戦略は、2 つの別個の同一の環境を作成します。 ブルー環境では、アプリケーションはそのまま実行されますが、グリーン環境では、アプリケーションは将来の状態で実行されます。
  • カナリア:ユーザーのサブセットがアプリケーションまたはサービスの増分リリースに関与する展開戦略。

「ローリング更新」を選択した場合は、必要なレプリカの数に関する動作を構成できます。

  • maxSurgeを使用すると、現在構成されているレプリカの数に加えて、作成できる Pod の数を (パーセンテージまたは絶対値で) 示すことができます。
  • maxUnavailableを使用すると、設定されたレプリカの数に応じて、更新中に「使用不可」になるポッドの数を (パーセンテージまたは絶対値で) 示すことができます。

アプリケーションとオートスケーラーに応じて、これらの構成により、QoS を確保したり、展開を高速化したりできます。

次に、ポッドを 10 にスケーリングし、Nginx イメージ タグを最新のものに変更する必要があります。

 kubectl scale deployment nginx-deployment --replicas=10
スケール-1

5 つのコンテナーが作成されており、10 個の Pod のうち 5 個が使用可能であることに注意してください。

数秒後、次のコマンドを使用します。

 kubectl get all

ここでは、すべての Pod が作成され、コンテナーが実行されていることがわかります。

すべて-1

デプロイメントの削除

Kubernetes デプロイメントを削除するには、次のコマンドを使用できます。

 kubectl delete deploy nginx-deployment kubectl delete deploy new_deployment.yaml

Helm: デプロイを簡素化する

数十または数百の Kubernetes リソースを使用する複雑なアプリケーションをデプロイする場合、kubectl ツールは不適切になるため、Helm ツールが開発されました。 Helm は、kubectl 上に構築され、アプリケーションのデプロイを簡素化する Kubernetes 用のパッケージ マネージャーです。

Helm 語彙では、アプリケーションはリリースと呼ばれます。 これは、グラフ、つまりグローバル変数と Kubernetes リソースを記述するテンプレートを含む YAML 形式の構成ファイルのコレクションに関連付けられています。

結論

デプロイメントは、不可欠な Kubernetes オブジェクトです。 大きな力には大きな責任が伴うため、構成する際には注意が必要です。そうしないと、予期しない動作が発生する危険があります。 展開構成をさらに進めるには、Kubernetes のドキュメントを参照できます。

また、最高の Kubernetes チュートリアルをいくつか調べて、ゼロから学び、エキスパートになることもできます。