Kubernetesデプロイメント戦略:アプリケーションに適したアプローチの選択

コンピューターに向かう人々

執筆者

Stephanie Susnjara

Staff Writer

IBM Think

Ian Smalley

Staff Editor

IBM Think

Kubernetesデプロイメント戦略

組織が選択するデプロイメント戦略によって、ソフトウェア・アプリケーションのロールアウトが成功するか失敗するかが決まります。Kubernetes環境では、この決定はアプリケーションの可用性、開発速度、運用コストに直接影響します。

スムーズなロールアウトと壊滅的なデプロイメントの違いは、多くの場合、特定のアプリのニーズとリスク許容度に応じた適切なアプローチの選択に帰結します。

Kubernetesの採用が拡大し続けるにつれ、 DevOpsチームにとってもビジネス成果にとっても同様に、戦略的なデプロイメントの選択がますます重要になってきています。

Cloud Native Computing Foundation(CNCF)の調査によると、組織の93%がKubernetesを使用、試験運用、または評価しています。1各Kubernetesデプロイメント戦略では、速度、安全性、リソース使用量の間でトレードオフが異なります。

Kubernetesデプロイメントとは

Kubernetesデプロイメントは、Kubernetesクラスター内のステートレス・アプリケーションのライフサイクルを管理する高レベルのリソースです。レプリカの数、コンテナ・イメージ、更新処理など、アプリケーションの意図された状態を定義するための宣言的な方法を提供します。

デプロイメントにより、個々のコンテナやポッドを管理するのではなく、アプリケーションを確実に実行し続けるために必要となる複雑なオーケストレーションを処理する管理レイヤーがチームに提供されます。

The DX Leaders

AI活用のグローバル・トレンドや日本の市場動向を踏まえたDX、生成AIの最新情報を毎月お届けします。登録の際はIBMプライバシー・ステートメントをご覧ください。

ご登録いただきありがとうございます。

ニュースレターは日本語で配信されます。すべてのニュースレターに登録解除リンクがあります。サブスクリプションの管理や解除はこちらから。詳しくはIBMプライバシー・ステートメントをご覧ください。

Kubernetesの概要

事実上のオープンソース・コンテナ・オーケストレーション・プラットフォームであるKubernetesは、組織がアプリケーションの展開について考える方法を根本的に変えました。クラウド移行中に企業が単純なモノリシック・アプリケーションから複雑な分散アーキテクチャに移行すると、従来の導入アプローチは非現実的かつコストのかかるものになりました。

Kubernetesは当初Googleによって開発された後に2015年にCNCFに寄贈され、ほとんどのフォーチュン500企業にとって不可欠なITインフラストラクチャーを支えています。Kubernetesはマシンのクラスター全体でのデプロイメント、スケーリング、管理を自動化し、チームがデプロイメントを高リスクかつ低頻度のイベントとして扱うのではなく、1日にアプリケーションを1日に複数回更新できるようにします。

Kubernetesの登場以前、アプリケーションは専用サーバーや仮想マシン(VM)上で動作するのが一般的で、スケーリングにはコストと時間がかかっていました。Dockerがコンテナを普及させた一方で、Kubernetesはコンテナ・オーケストレーションレイヤーを提供することで、コンテナを大規模に管理できる展開可能な最小単位であるポッドに編成しました。

これらのポッドは、クラスター内のワーカー・ノード上で稼働し、コントロール・プレーンが全体の運用を調整します。

このクラウドネイティブ・アーキテクチャにより、最新かつクラウド・ベースのコンテナ化されたアプリケーションに必要とされる高度なデプロイメント戦略が可能になります。段階的な展開から負荷分散による即時のトラフィック切り替えまで、各アプローチは異なるリスク・プロファイルと運用要件に対処します。Kubernetes Serviceは、ポッドのグループに対して安定したネットワークIDとDNSベースの検出を提供し、個々のインスタンスが更新または置き換えられた場合でも信頼性の高い通信パターンを実現します。

OpenShift

OpenShiftを使用してクラウドでコンテナを実行する方法をご覧ください

コンテナを使用すると、さまざまな環境間でアプリケーションを簡単に構築、実行、移動できます。このビデオでは、IBM Cloudを使用したOpenShiftでコンテナ化されたアプリケーションのチームによる効率的な管理を支援し、クラウド開発の迅速化と信頼性を高める方法を紹介します。

Kubernetesデプロイメントの仕組み

Kubernetesのデプロイメントにより、自己修復機能で意図した数のポッドを維持し、更新に対応し、コンテナを交換することで、アプリケーションのライフサイクルを自動的に管理できます。

アプリケーションを更新する場合、チームはYAMLファイルで新しいバージョンの外観を定義します。Kubernetesは、クラスター全体で意図した状態を達成するために必要とされる複雑なオーケストレーションを処理し、以前のバージョンからの移行を管理しながら新しいポッドを作成します。

チームは、Kubernetesクラスターのコマンドライン・インターフェースであるkubectlを介してデプロイメントを行います。これらは、仕様セクションでデプロイメントのAPIバージョン、メタデータ、および定義された状態を指定するYAML構成ファイル(例:deployment.yamlなど)を適用します。

これらの宣言型構成ファイルにより、さまざまな環境でのバージョン管理と反復可能なデプロイメントが可能になります。導入コントローラーは、これらの仕様に基づいて導入ライフサイクルを継続的に監視および管理します。

Kubernetesデプロイメントに不可欠な5つのコンポーネント

Kubernetesの自動化プロセスは、連携して動作する次の5つの重要なコンポーネントに依存しています。これらは、Kubernetesネットワークによってポッド間の通信を可能にします。

  1. ポッド・テンプレートの仕様:ポッド・テンプレートの仕様は、コンテナ・イメージ、リソース要件、環境変数、ボリューム・マウント、コンテナ・ポート、ネットワーク構成など、ポッドを作成するための青写真を定義します。このテンプレートは、すべてのアプリケーション・インスタンスの一貫性を確保します。

  2. レプリカ・カウント:レプリカ・カウントは同時に実行するインスタンスの数を指定します。ユーザーは、CPU使用率、メモリー消費量、カスタム・ビジネス・メトリクスなどのKubernetes監視メトリクスに基づいて、Horizontal Pod Autoscalerを通じてこの設定を手動または自動で調整できます。チームは、kubectl rolloutコマンドを使用するか、kubectl getを使用してロールアウト・ステータスを確認することで、デプロイメント・ステータスを監視し、更新中に適切な数のポッドが実行されていることを確認できます。

  3. セレクター・ラベル:セレクター・ラベルは、ラベルベースの照合を通じて、デプロイメントとそのマネージド・ポッド間の接続を確立します。これらのセレクターは、デプロイメントが対応するポッドを確実に管理できるようにすることで、複雑な環境での構成の競合を防ぎます。

  4. 戦略設定の更新:戦略設定の更新により、新しいバージョンのアプリケーションの展開方法が管理されます。これには、更新中に利用できないポッドの最大数、ブルー・グリーン・シナリオのサージ容量、自動障害復旧のためのロールバック・トリガーの設定が含まれています。

  5. リソース管理設定:リソース管理設定では、コンテナでのCPUおよびメモリーの要求と制限を定義し、リソースの競合を防ぎながらクラスター全体で最適なリソース割り当てを確保します。これはマルチテナント環境で重要です。

Kubernetesデプロイメントのユースケース

組織はさまざまな状況でKubernetesデプロイメントを使用しており、それぞれにおいて自動化されたライフサイクル管理と柔軟な更新ストラテジーのメリットを享受しています。

  • WebアプリケーションとAPI
  • マイクロサービス
  • バッチ処理のワークロード
  • マルチ環境ワークフロー
  • CI/CDパイプライン

WebアプリケーションとAPI

WebアプリケーションとAPIは、トラフィックの需要に応じて拡張しながら、更新中も可用性を維持します。Eコマース・プラットフォームやコンテンツ管理システムは、ユーザーに中断させることなく機能を更新できる性能によって特にメリットを受けます。

データ処理やビジネス・ロジックを処理するバックエンド・サービスは、Kubernetes Ingressコントローラーがサービス・インスタンス間のトラフィック・ルーティングと負荷分散を管理することで、フロントエンド・アプリケーションとは独立してデプロイできます。

マイクロサービス

マイクロサービス・アーキテクチャーは、システム全体に影響を与えることなく、数百の独立したサービス間の更新を調整します。この機能により、チームはシステム全体の安定性を維持しながら、さまざまなスケジュールで個々のコンポーネントをデプロイできます。

Helmチャートは、標準化された構成と依存関係管理により、複雑なマイクロサービスのデプロイメントの管理を簡素化します。

バッチ処理のワークロード

バッチ処理ワークロードにより、データ処理タスクにおける一貫したリソース割り当てと自動再開機能が担保されます。デプロイメントの抽象化により、障害を適切に処理する必要がある複雑な処理パイプラインの管理が簡素化されます。

マルチ環境ワークフロー

マルチ環境ワークフローは、環境固有の構成を適用しながら、開発、ステージング、本番環境間の一貫性を維持します。チームは、レプリカ数、リソース制限、または機能フラグが異なる環境全体で同じデプロイメント定義を使用し、名前空間内にアプリケーションを整理して、論理的な分離とリソースの分離を実現できます。

CI/CDパイプライン

CI/CDパイプラインはデプロイメントを使用して、コードのコミットから本番リリースまでの継続的なデプロイメントによるソフトウェア配信プロセス全体を自動化します。

デプロイメントは、GitHubなどの継続的インテグレーション・ツールやプラットフォームとシームレスに統合され、コードの変更、プル・リクエスト、またはスケジュールされたリリースに基づいて自動テスト、ビルド、デプロイメントが可能になります。

Kubernetesデプロイメント戦略の種類

デプロイメント戦略の基本は、ソフトウェア更新時のリスク管理です。以前、従来の方法では、保守期間をスケジュールし、システムをオフラインにする必要があり、安全ではあったものの、時間がかかりました。Kubernetesを使用すると、ダウンタイムなしでアプリケーションを更新し、より頻繁にデプロイすることで、調整の負担を軽減できます。

Kubernetesのデプロイメント戦略によって、更新リスクの対処方法は異なります。選択する方法は、アプリケーションの機能、チームが管理できる内容、ビジネスのニーズによって異なります。

Kubernetesデプロイ戦略の種類には、以下の例が含まれます。

  • デプロイメントの再作成
  • ローリング更新のデプロイメント
  • ブルー・グリーン・デプロイメント
  • カナリア・デプロイメント
  • シャドー・デプロイメント
  • A/Bテスト・デプロイメント

デプロイメントの再作成

デプロイメントを再作成すると、新しいインスタンスを開始する前に、既存のインスタンスをすべてシャットダウンできます。この機能により、短いダウンタイムが発生しますが、バージョン互換性の問題やリソースの競合は回避されます。

このアプローチは、アップタイムよりも運用の簡素化が重要なバッチ処理システム、レガシー・アプリケーション、および開発環境に適しています。予測可能な動作と引き換えに短いダウンタイムを許容できる場合、チームはデプロイメントを再作成することを選択します。

ローリング更新のデプロイメント

ローリング更新は、アプリケーションの可用性を維持しながら、インスタンスを段階的に置き換えます。このアプローチは、速度、リソース利用、リスクのバランスが取れているため、Kubernetesのデフォルト・ストラテジーです。

CMSは通常、ローリング・アップデートを使用して、ユーザーに中断させることなく継続的に機能を提供できるようにします。ただし、アプリケーションは混合バージョン環境を処理できるように設計する必要があります。異なるバージョンを同時に実行できない場合、ローリング更新で問題が発生します。

Kubernetesは、古いポッドを段階的に新しいインスタンスに置き換えることで、以前のバージョンがスムーズにフェーズ・アウトできるようにします。チームは、kubectlコマンドを介してこのプロセスを開始できます。

ブルー・グリーン・デプロイメント

ブルー・グリーン・デプロイメントでは、2つの完全な本番環境が維持され、それらの間ですべてのトラフィックを瞬時に切り替えます。このストラテジーでは即時のロールバックが可能ですが、デプロイメント中のインフラストラクチャーのコストも2倍になります。

決済処理システム、顧客データベース、認証サービス、および規制遵守アプリケーションでは、サービス中断のリスクと比較してインフラストラクチャーのコストが対処可能な場合に、ブルー・グリーン・デプロイメントを使用します。チームは、トラフィックを切り替える前に、新しい環境に対して完全な検証を実行できます。

カナリア・デプロイメント

カナリア・デプロイメントでは、パフォーマンスとエラー率を監視しながら、少量のトラフィックを新しいバージョンにルーティングします。チームは、全てのユーザーが最新バージョンを使用するまで、徐々にトラフィックを増加させています。

このストラテジーにより、チームはすべてのユーザーに影響を与えるのではなく、限定されたユーザー・ベースと連携して問題を特定できるようになります。トラフィックのサブセットを新しいバージョンに誘導することで、カナリア・デプロイメントはロールアウト・リスクの軽減に役立ちます。新しいインターフェースをテストするモバイル・アプリケーション、性能の改善を検証するSaaSプラットフォーム、チェックアウトの変更をテストする電子商取引サイトはすべて、このデプロイメント・ストラテジーを活用しています。

シャドー・デプロイメント

シャドー・デプロイメントは、本番トラフィックを現在のバージョン(ユーザーにサービスを提供)と新しいバージョン(テストのためにリクエストをサイレントで処理)の両方に複製します。ユーザーはシャドー・バージョンを利用することはありませんが、チームは実際のワークロードに対する完全な性能検証を実施できます。

シャドー・デプロイメントにより、システムはユーザーに影響を与えることなく、現実世界の条件下で新しい機能をテストできます。検索エンジンはランキング・アルゴリズムをテストするためにこのデプロイメントを使用し、推奨システムは機械学習(ML)モデルを検証するために活用し、不正検出システムは更新されたルールを評価するために使います。

A/Bテスト・デプロイメント

A/Bテスト・デプロイメントでは、さまざまなユーザー・セグメントをさまざまなアプリケーション構成にルーティングして、ビジネス・メトリクスとユーザーの行動を測定します。技術的な指標に重点を置いたカナリア・デプロイメントとは異なり、A/Bテストでは機能の有効性とユーザー・エクスペリエンスを評価します。

製品チームは、A/Bテストデプロイメントを使用して、新しいユーザー・インターフェースを検証し、料金体系をテストし、推奨アルゴリズムを評価します。

Kubernetesデプロイメントとポッド—StatefulSetおよびReplicaSet

デプロイメントが他のKubernetesのリソースとどのように適合するのか理解することは、各アプローチを使用するタイミングの明確化に役立ちます。

Kubernetesデプロイメントとポッドの比較

ポッドは個々のアプリケーション・インスタンスですが、直接的な管理はすぐに複雑になります。Kubernetesのデプロイメントは管理レイヤーを処理するため、チームはコンテナのオーケストレーションではなくアプリケーション・ロジックに集中できます。

KubernetesデプロイメントとReplicaSetの比較

ReplicaSetは、実行中のインスタンスの数が正しいことを保証するKubernetesオブジェクトです。Kubernetesのデプロイメントでは、アプリケーションの更新を容易にするバージョン管理、更新、ロールバック機能などのチェンジ・マネジメントが追加されます。

KubernetesデプロイメントとStatefulSetの比較

StatefulSetsは、ポッドの永続的なIDと順序付けられたオペレーションを維持するKubernetesオブジェクトです。Kubernetesデプロイメントは、ポッドを同一の交換可能なユニットとして扱うことができるステートレスなアプリケーションに適していますが、StatefulSetsは安定したIDと逐次スケーリングを必要とするステートフル・アプリケーションを処理します。

ベスト・プラクティスと考慮事項

Kubernetesのデプロイ戦略を成功させるには、以下のような、さまざまな環境やアプリケーション・タイプで信頼性が高く反復可能なデプロイメントをサポートする、堅実な運用プラクティスが必要です。

  • モニタリングとオブザーバビリティー
  • 正常性チェックと準備状況の検証
  • 自動テストの統合
  • ロールバックの計画と実行

監視とオブザーバビリティー

Kubernetesモニタリングにより、チームはアプリケーションのパフォーマンス、ビジネス・メトリクス、エラー率、およびユーザー・エクスペリエンスを可視化できるため、デプロイメント中に情報に基づいた選択を行い、問題を早期に検知できます。

高度なオブザーバビリティー・プラットフォームは、デプロイメント追跡とパフォーマンス監視を統合することでこのアプローチをさらに強化し、チームがデプロイメント・イベントをシステムの動作やユーザーへの影響と相関させることを可能にします。

正常性チェックと準備状況の検証

適切に構成された正常性チェックにより、トラフィックを受信する前に新しいアプリケーション・インスタンスが完全に機能することが保証されます。このメカニズムにより、デプロイメントの失敗がユーザーに影響を与えることを防ぎ、問題が検出された際の自動ロールバックが可能になります。

Kubernetes Readiness Probeでは、アプリケーションが実行されていることだけでなく、データベース接続、外部サービスの依存関係、必要な初期化プロセスなど、運用トラフィックを処理する準備ができていることを検証する必要があります。

自動テストの統合

自動テストでは、単体テスト、統合テスト、エンドツーエンドの検証、性能テストなど、複数の段階での実施が必要です。この包括的なアプローチは、問題を早期に発見し、本番環境で問題が発生するリスクを軽減する上で役立ちます。

最新のデプロイメント・パイプラインは、テストとデプロイメント戦略を統合し、手動の承認プロセスではなく、テスト結果とパフォーマンス・メトリクスに基づき、複数環境を通じてビルドを自動的に促進します。

ロールバックの計画と実行

効果的なロールバック・ストラテジーには、デプロイメントの問題が発生する前に慎重な準備とテストが必要です。チームは、問題が発生したときに迅速な復旧を保証するため、デプロイメントを迅速に元に戻し、潜在的なデータ一貫性の課題を予測し、明確な通信プロトコルを確立する方法を理解しておく必要があります。

Kubernetesデプロイメント戦略の統合

多くの組織は、異なるデプロイメント戦略を相互に排他的な選択肢と見なすのではなく、複数のアプローチを併用することに大きな価値を見出しています。このハイブリッド・アプローチでは、各ストラテジーの強みを活かしながら、それらの制限に対処できます。

プラットフォーム・チームは多くの場合、ローリング更新をデフォルトとして標準化しています。重要なアプリケーションにはブルー・グリーン・デプロイメントを使用でき、高い可視性を要する場合はカナリア・デプロイメントが使用されます。

大規模な組織は、ユーザー向けサービスに対するブルー・グリーン、内部APIとマイクロサービスのローリング更新、バッチ処理コンポーネントに対するデプロイメントの再作成など、アプリケーション層全体でさまざまなストラテジーを実施します。

組織は多くの場合、単一のデプロイメント・パイプライン内でストラテジーを組み合わせます。たとえば、パフォーマンス検証のためのシャドー・デプロイメント、その後の段階的なユーザーへの露出のためのカナリア・ロールアウト、問題発生時に即座にロールバックできるブルーグリーン機能を組み合わせることができます。

まとめ

戦略的なデプロイメントの選択によって、チームが自信を持って成果を上げるのか、常に危機を管理するのかが決まります。複数のアプローチを巧みに活用できる組織は、成果をあげる能力を根本的に変革し、より高速なサイクルと信頼性の向上を実現します。このストラテジーは、現代のアプリケーション開発における各固有のシナリオに合わせてアプローチを調整することにより、運用の信頼性を強化します。

関連ソリューション
IBM Red Hat OpenShift

Red Hat OpenShift on IBM Cloudは、フルマネージドのOpenShiftコンテナ・プラットフォーム(OCP)です。

Red Hat OpenShiftの詳細はこちら
コンテナ・ソリューション

コンテナ・ソリューションは、セキュリティー、オープンソースのイノベーション、迅速なデプロイメントにより、コンテナ化されたワークロードを実行およびスケールアップします。

コンテナの詳細はこちら
クラウド・コンサルティング・サービス 

IBMのクラウド・コンサルティング・サービスで新しい機能にアクセスし、ビジネスの俊敏性を高めましょう。ハイブリッドクラウド戦略や専門家とのパートナーシップを通じて、ソリューションを共創し、デジタル・トランスフォーメーションを加速させ、パフォーマンスを最適化する方法をご覧ください。

クラウド・サービス
次のステップ

IBMのコンテナ・ソリューションでインフラストラクチャーをモダナイズします。IBMの包括的なコンテナ・プラットフォームを使用して、柔軟性、セキュリティー、効率性を備えたコンテナ化されたワークロードを環境全体で実行、拡張、管理します。

コンテナ・ソリューションの詳細はこちら 無料のIBM Cloudアカウントを作成
脚注