Kubernetes (K8s とも略される) は、コンテナ化されたapplicationsとワークロードの展開、スケーリング、管理を自動化およびオーケストレーションするためのオープンソース プラットフォームです。 オンプレミス、クラウド、エッジなど、あらゆる環境でコンテナとして実行されるアプリ向けに、柔軟性、スケーラビリティ、信頼性、高可用性、移植性が組み込まれたコンピューティング インフラストラクチャを提供します。
Kubernetes は、デプロイメント、負荷分散、水平スケーリング、ロールアウトとロールバック、自己修復など、大規模なコンテナ化されたワークロードの管理に関連する最も一般的なタスクを自動化します。
多くの組織では、すでに Kubernetes を本番環境で使用しています (アプリの一部または大部分)。また、Kubernetes を評価している組織もあります。 Kubernetes は人気が高く、コンテナのオーケストレーションと管理の事実上の標準となっています。
Kubernetes の導入が急速に進んでいるのは、次のようなメリットがあるためです。
従来のモノリスapplicationsを、マイクロサービスと呼ばれる、より小さく疎結合された部分にリファクタリングすると、新しいアプリ機能や更新をより迅速にリリースし、より簡単に拡張できるため、ビジネスの俊敏性が向上します。 クラウドネイティブのマイクロサービス アーキテクチャの採用により、基盤となるコンピューティング インフラストラクチャを進化させる必要性が高まります。そのため、物理システムと仮想マシンからコンテナーへの移行は、マイクロサービスを実行する最も効率的な方法の 1 つであると考えられます。
マイクロサービスとコンテナの数が増えるにつれて、コンテナ管理を自動化する必要性も高まります。 ここで Kubernetes が役立ちます。
Kubernetes は、コンテナ化されたアプリを大規模にオーケストレーションして実行しますが、applicationコードをコンテナ化された形式でパッケージ化して配布および実行する手段は提供しません (コンテナ イメージには、アプリ コードと必要なランタイム、ライブラリ、およびその他のソフトウェア依存関係が含まれます)。 ポッドを実行するには、Kubernetes ではすべてのノードにコンテナ ランタイムがインストールされている必要があります。 Kubernetes はもともとコンテナ ランタイムとして Docker Engine を使用していました。 ただし、Kubernetes 1.24 以降では、コンテナ ランタイムは Container Runtime Interface (CRI) に準拠する必要がありますが、Docker Engine はこれに準拠していません。 人気のある CRI 準拠のコンテナ ランタイムとして、CRI-O と containerd (元々は Docker プロジェクト) の 2 つがあります。
アプリをコンテナにパッケージ化するには、コンテナ化されたアプリを構築、共有、実行するための最も人気のあるツールの 1 つであるDockerなどのツールが必要です。 アプリをポータブル コンテナー イメージにパッケージ化する作業を効率化および自動化し、Kubernetes 環境を含むオンプレミス、クラウドで実行および展開できるようにします。 Docker パッケージ化されたコンテナは、containerd および CRI-O ランタイムでネイティブに実行できます。
Kubernetes プラットフォームは、プールされたコンピューティング リソースを共有するクラスターに結合されたノードで構成されています。 各クラスターは、Kubernetes アーキテクチャでデプロイ可能な最小単位であるポッドを管理します。 ポッドには 1 つ以上のアプリ コンテナーが含まれます。 ポッドはグループ化されてサービスを構成します。 Kubernetes クラスター内のアプリには、いくつかの方法を使用して外部からアクセスできますが、 Ingress コントローラーは最も人気があり効率的な方法の 1 つです。
Kubernetes 環境のコンポーネントを詳しく見てみましょう。
Kubernetes ポッドは、Kubernetes にデプロイできる最小の実行可能単位です。 ポッドは、アプリ コンテナー イメージ (従来のアプリの物理サーバーや仮想マシンのような) の「仮想ホスト」であり、同じコンピューティング、ストレージ、およびネットワーク リソースを共有する 1 つ以上のコンテナーをカプセル化します (したがって、比較的緊密に結合されていると考えることができます)。 ポッドは Kubernetes ノードにデプロイされ、実行されます。
Kubernetes ノードは、コンピューティング インフラストラクチャの最小単位です。 ノードは、ポッドを展開、実行、拡張、管理するためにプロセッサ、メモリ、ストレージ、ネットワーク リソースを割り当てる仮想マシンまたは物理サーバーです。 ノードは結合されてクラスターを形成します。
Kubernetes クラスターは、プールされたコンピューティング リソースがポッド間で共有されるノードのグループです。 クラスターには 2 種類のノードがあります。
通常、Kubernetes クラスターには、高可用性とフォールト トレランスを実現するために、各タイプのノードが複数存在します。
Kubernetes デプロイメントは、クラスター内のポッドのレプリカ (またはインスタンス) のセットとしてアプリを実行する方法を記述します。 デプロイメントでは以下を定義します。
Kubernetes は、クラスター内で実行されるコンテナ化されたアプリにネットワーク接続を提供するために、デュアル IPv4/IPv6 スタックをサポートしています。 Kubernetes クラスター内のアプリとの通信とクラスター内のサービス間の通信は、両方ともレイヤー 4 (IP アドレス、ポート) とレイヤー 7 (ホスト名、ユニバーサル リソース識別子 [URI]) で管理され、ルーティング、負荷分散、セキュリティ、監視、可視性の機能が含まれます。
Kubernetes ネットワーク モデルでは、各ポッドには、クラスターのプライベート アドレス プールから動的に割り当てられる一意の IP アドレスがあります。 同じクラスター内のすべてのノードで実行されているすべてのポッドは同じ IP ネットワークに属し、そのネットワークを介して相互に通信できます。 ポッド内の複数のコンテナは、ループバック インターフェイスを介して相互に通信します。
Kubernetes サービスは、クラスター内の 1 つ以上のポッドとして実行されているアプリまたはマイクロサービスをネットワーク上でアクセス可能にします (「公開」します)。 Kubernetes サービスは、Web サービスなどの同じ機能を実行する指定されたポッドの論理グループとしてアプリを表します。 同じセレクター (またはラベル) がサービス内のすべてのポッドに適用され、サービス内のメンバーシップがマークされます。 Kubernetes は、新しいポッドがデプロイされたり、実行中のポッドが終了したりするときに、ラベルを使用してサービスのポッドのセットを追跡します。
Kubernetes サービスは、定義された接続ポリシーに従ってクラスター内で相互に通信でき、Ingress コントローラーなどを使用してクラスターの外部からアクセスできるようにすることもできます。
Kubernetes Ingress API の一部である Ingress オブジェクトを使用すると、HTTP などのレイヤー 7 (application層) プロトコルを通じて Kubernetes で実行されているapplicationsを外部に公開できます。 Ingress ゲートウェイと Ingress コントローラは、Ingress オブジェクトを制御し、ユーザーとapplications間の通信 (ユーザーとサービス間または North-South 接続) を管理するために設計されたツールです。
設計上、Ingress オブジェクトではカスタマイズされたリクエスト処理ポリシーのサポートが制限されています。たとえば、セキュリティ ポリシーを定義してアタッチすることはできません。 その結果、多くのベンダーは、進化する顧客要件を満たす方法として、カスタム リソース定義 (CRD) を使用して Ingress コントローラーの機能を拡張しています。
たとえば、 NGINX Ingress Controller は、Kubernetes クラスターのエッジにある API ゲートウェイ、ロード バランサ、および Ingress 機能のパフォーマンス、回復力、稼働時間、セキュリティ、および可観測性を強化するために、カスタム リソース (VirtualServer、VirtualServerRoute、TransportServer、および Policy) を定義します。
NGINX は、ロードバランシング、認証、承認、アクセス制御、暗号化、可観測性、トラフィック分割 (サーキットブレーカー、A/B テスト、ブルーグリーンおよびカナリア デプロイメント) サービスを提供し、通信の高速性、信頼性、安全性を確保します。 頻繁なアプリリリースをサポートするために、NGINX カスタム リソースは、マルチテナント開発および DevOps チーム全体でセルフサービス ガバナンスも可能にします。
Gateway API は、Kubernetes のサービス ネットワーキングを改善および標準化することを目的としたオープン ソース プロジェクトです。 Kubernetes コミュニティによって管理される Gateway API 仕様は、Kubernetes Ingress API から進化したもので、リクエスト処理のためのきめ細かいポリシーを定義したり、複数のチームやロールにわたって構成の制御を委任したりする機能など、運用環境における Ingress リソースの制限を解決します。
NGINX の Gateway API 実装の詳細については、弊社のブログの「NGINX Gateway Fabric について知っておくべき 5 つのこと」をご覧ください。
サービス メッシュは、Kubernetes クラスター内のサービス間の通信 (サービス間または東西接続) を制御するインフラストラクチャ レイヤーです。 最も一般的なサービス メッシュの使用例には、mTLS 認証/暗号化と、K8s クラスター内のサービス間で発生する通信の可観測性が含まれます。
NGINX Gateway Fabricによる統合アプリ配信の詳細については、弊社ブログの「NGINX Gateway Fabric バージョン 1.0 の発表」をご覧ください。NGINX Gateway Fabric は、 Ingress コントローラーとサービス メッシュのユースケースを 1 つのツールで効果的に組み合わせるように設計されています。
Kubernetes セキュリティは、インフラストラクチャ (オンプレミスおよびクラウド コンピューティング リソース、ネットワーク通信、管理プレーン) と Kubernetes クラスター内で実行されているapplicationsを保護するための階層化アプローチです。
インフラストラクチャを保護するには、クラウドおよびオンプレミスの実装を保護するための一般的なセキュリティ推奨事項、チュートリアル、およびベスト プラクティスに従ってください。
applicationsのセキュリティを確保するには、エッジと Kubernetes クラスター内に強力なセキュリティ制御を実装して、クラスターとの間のすべての通信とクラスター内の通信に対して、認証、承認、アクセス制御、暗号化、監視、可視性、およびオプションの Webapplicationファイアウォールとサービス拒否保護を提供します。
Kubernetes のセキュリティ保護の詳細については、弊社のブログ「トラフィック管理ツールを使用して Kubernetes を保護する 6 つの方法」をご覧ください。
Kubernetes 導入の初期には、Do-It-Yourself (DIY) アプローチが主流でしたが、多くの組織にとって、これは構築と運用が複雑で困難でした。 このため、組織は実稼働環境への展開において、さまざまなテクノロジー コンポーネントを統合し、メンテナンス ライフサイクルを簡素化し、ハイブリッド環境やマルチクラウド環境に展開できる、クラウド管理の Kubernetes プラットフォームとパッケージ化された Kubernetes ディストリビューションを採用しています。
管理され、事前にパッケージ化された Kubernetes プラットフォームの例をいくつか以下に示します。
クラウド管理型 Kubernetes:
事前にパッケージ化された Kubernetes ディストリビューション:
NGINX の Kubernetes ネイティブ接続およびセキュリティ スタックは、オンプレミス、クラウド、エッジで実行される Kubernetesapplicationsの複雑さを軽減し、稼働時間を増やし、大規模な詳細なリアルタイムの可視性を実現することで、顧客エクスペリエンスの向上に役立ちます。
Kubernetes 用接続スタック– ハイブリッドのマルチクラウド環境全体で Kubernetes アプリを最適化、拡張、保護します。
NGINX App Protect WAF および DoS を備えた NGINX Ingress Controller の30 日間無料トライアルをリクエストして開始してください。