K8sと略されるKubernetesは、コンテナ化されたアプリケーションとワークロードのデプロイメント、拡張、管理を自動化してオーケストレーションするためのオープン ソースのプラットフォームです。オンプレミス、クラウド、エッジなど、あらゆる環境でコンテナとして実行されているアプリケーションに、柔軟性、拡張性、信頼性、高可用性、移植性を備えたコンピューティング インフラストラクチャを提供します。
Kubernetesは、デプロイメント、ロード バランシング、水平方向の拡張、ロールアウトとロールバック、自己修復など、コンテナ化されたワークロードの大規模な管理に関連する最も一般的なタスクを自動化します。
アプリケーションの一部か大半かにかかわらず、多くの組織が既にKubernetesを本番環境で使用しており、現在評価中の組織もあります。その普及率により、Kubernetesはコンテナのオーケストレーションと管理のデファクト スタンダードとなっています。
Kubernetesの導入が急増している理由は、以下のとおりです。
従来のモノリス アプリケーションを、マイクロサービスと呼ばれる、より小さく疎結合されたパーツにリファクタリングすると、アプリケーションの新機能や更新プログラムをより迅速にリリースし、簡単に拡張できるため、ビジネスの俊敏性を向上させることができます。クラウドネイティブのマイクロサービス アーキテクチャを導入するには、基盤となるコンピューティング インフラストラクチャを進化させる必要があります。そのため、マイクロサービスを実行する最も効率的な方法の一つとして、物理システムや仮想マシンからコンテナへの移行が確認されています。
マイクロサービスやコンテナの数が増えると、コンテナの管理を自動化する必要も生じます。そこでKubernetesの出番です。
Kubernetesは、コンテナ化されたアプリケーションを大規模にオーケストレーションして実行します。ただし、アプリケーション コードを配布して実行するために、コンテナ化された形式にパッケージ化する手段は提供していません(コンテナ イメージにはアプリケーション コードと、必要なランタイム、ライブラリ、その他のソフトウェア依存関係が含まれています)。また、ポッドを実行するために、Kubernetesでは、各ノードにコンテナ ランタイムをインストールする必要があります。Kubernetesは当初、コンテナ ランタイムとしてDocker Engineを使用していましたが、Kubernetes 1.24時点で、コンテナ ランタイムはコンテナ ランタイム インターフェイス(CRI)に準拠している必要があり、Docker Engineは準拠していません。よく使用される2つのCRI準拠のコンテナ ランタイムが、CRI-Oとcontainerd(元々はDockerプロジェクト)です。
アプリケーションをコンテナにパッケージ化するには、Dockerのようなツールが必要です。Dockerは、コンテナ化されたアプリケーションを構築、共有、実行するための最も一般的なツールの一つです。オンプレミスや、Kubernetes環境などのクラウドで実行してデプロイできる、移植可能なコンテナ イメージへのアプリケーションのパッケージ化を合理化して自動化します。Dockerでパッケージ化されたコンテナは、containerdおよびCRI-Oランタイムでネイティブに実行できます。
Kubernetesプラットフォームはノードで構成されており、それらのノードが結合されてクラスタになります。クラスタ内で、それらのノードはプールされたコンピューティング リソースを共有します。各クラスタは、Kubernetesのアーキテクチャでデプロイ可能な最小単位であるポッドを管理します。ポッドには、1つ以上のアプリケーション コンテナが含まれています。ポッドがグループ化されてサービスを構成します。Kubernetesクラスタ内のアプリケーションには、いくつかの方法を使用して外部からアクセスすることができ、Ingressコントローラは最も一般的で効率的な方法の一つです。
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(アプリケーション レイヤ)プロトコルを介して、Kubernetesで実行されているアプリケーションを外部に公開するために使用できます。IngressゲートウェイとIngressコントローラは、Ingressオブジェクトを制御し、ユーザーとアプリケーション間の通信(ユーザーとサービスまたは南北の接続性)を管理するように設計されたツールです。
設計上、Ingressオブジェクトは、カスタマイズされたリクエスト処理ポリシーのサポートが制限されています。例えば、セキュリティ ポリシーを定義して添付することはできません。その結果、多くのベンダーは、進化する顧客の要件を満たす方法として、カスタム リソース定義(CRD)を使用してIngressコントローラの機能を拡張しています。
一例として、NGINX Ingress Controllerは、カスタム リソース(VirtualServer、VirtualServerRoute、TransportServer、Policy)を定義して、KubernetesクラスタのエッジでAPIゲートウェイ、ロード バランサ、Ingress機能のパフォーマンス、レジリエンス、アップタイム、セキュリティ、可観測性を向上させます。
NGINXは、ロード バランシング、認証、認可、アクセス制御、暗号化、可観測性、およびトラフィック分割(サーキット ブレーカー、A/Bテスト、ブルーグリーン デプロイメントおよびカナリア デプロイメント)サービスを提供し、通信が高速で、信頼でき、安全であることを保証します。また、頻繁なアプリケーション リリースをサポートするために、NGINXカスタム リソースによって、マルチテナント開発チームとDevOpsチーム全体でセルフサービス ガバナンスが実現します。
Gateway APIは、Kubernetesのサービス ネットワーキングを改善して標準化するオープン ソース プロジェクトです。Kubernetesコミュニティによって管理されるGateway API仕様は、Kubernetes Ingress APIから進化し、本番環境におけるIngressリソースの制限を解決します。これには、リクエスト処理のための詳細に設定されたポリシーを定義したり、複数のチームやロールにわたる構成の制御を委任したりする機能が含まれます。
NGINXのGateway APIの実装については、当社のブログ「NGINX Gateway Fabricについて知っておくべき5つのこと」をご覧ください。
サービス メッシュは、Kubernetesクラスタ内のサービス間の通信(サービス間または東西の接続)を制御するインフラストラクチャ レイヤです。最も一般的なサービス メッシュのユース ケースには、K8sクラスタ内のサービス間で行われる通信のmTLS認証/暗号化と可観測性が含まれます。
NGINX Gateway Fabricは、Ingressコントローラおよびサービス メッシュのユース ケースを1つのツールで効果的に組み合わせるように設計されています。NGINX Gateway Fabricを使用した統合アプリケーション デリバリの詳細については、当社のブログ「NGINX Gateway Fabric Version 1.0の発表」をご覧ください。
Kubernetesのセキュリティは、インフラストラクチャ(オンプレミスおよびクラウド コンピューティング リソース、ネットワーク通信、管理プレーン)と、Kubernetesクラスタ内で実行されているアプリケーションを保護するための多層的なアプローチです。
インフラストラクチャを保護するには、クラウドおよびオンプレミスの実装を保護するための一般的なセキュリティの推奨事項、チュートリアル、ベスト プラクティスに従ってください。
アプリケーションの安全性を高めるために、エッジとKubernetesクラスタ内に強力なセキュリティ管理を実装して、クラスタ間およびクラスタ内でのすべての通信に対して、認証、認可、アクセス制御、暗号化、監視、可視化、およびオプションでWeb Application Firewallとサービス拒否対策を提供してください。
Kubernetesの保護については、当社のブログ「トラフィック管理ツールを使用してKubernetesを保護する6つの方法」をご覧ください。
Kubernetesの導入が始まった当初は、DIY(Do-It-Yourself)アプローチが主流でしたが、多くの組織にとって構築と運用は複雑で困難です。このため、本番環境へのデプロイメントでは、クラウド管理型Kubernetesプラットフォームや事前にパッケージ化されたKubernetesディストリビューションが採用されています。これらは、さまざまな技術要素を統合してメンテナンス ライフサイクルを簡素化し、ハイブリッドおよびマルチクラウド環境に導入できます。
管理型Kubernetesプラットフォームと事前にパッケージ化されたKubernetesプラットフォームの例をご紹介します。
クラウド管理型Kubernetes:
事前にパッケージ化されたKubernetesディストリビューション:
NGINXのKubernetesネイティブの接続およびセキュリティ スタックは、オンプレミス、クラウド、エッジで実行されているKubernetesアプリケーションの複雑性の低減、アップタイムの向上、大規模での詳細なリアルタイムの可視化により、カスタマ エクスペリエンスを向上させるのに役立ちます。
Connectivity Stack for Kubernetes - ハイブリッドおよびマルチクラウド環境全体でKubernetesアプリケーションを最適化、拡張、保護します。
まずは、NGINX App Protect WAF/DoSを備えたNGINX Ingress Controllerの30日間無料のトライアル版をぜひお申し込みください。