1. マスタークラスタネットワークマスター クラスターのネットワークは、一般的な負荷分散クラスターのネットワークと同じように、比較的単純です。複数ノードの apiserver の IP とポート (6443) は、負荷分散の IP とポートを使用します。この負荷分散 IP とポートは、マスター/ノード ノードが参加するときに使用され、マスター ノードのクラスター ネットワークが形成されます。 - マスターノード間のネットワーク: 複数のマスターノードがある場合は、データの一貫性を維持するために、分散キー値ストアである etcd を使用する必要があります。 etcd は通常、高可用性とフォールト トレランスを実現するために Raft プロトコルを使用します。各ノードが相互に通信できる必要があるため、信頼性の高いネットワーク接続を構成する必要があります。
- マスター ノードとノード ノード間のネットワーク: マスター ノードとノード ノードは、kube-apiserver コンポーネントを介して通信する必要があります。 kube-apiserver はマスターノード上で実行されるコンポーネントです。外部クライアントと内部コンポーネントが k8s クラスターのリソースとステータスにアクセスするための RESTful API インターフェイスを提供します。ノードは kubelet と kube-proxy という 2 つのコンポーネントを実行します。これらのコンポーネントは、ノードと Pod の情報を kube-apiserver に定期的に報告するか、kube-apiserver から指示を受信する必要があります。したがって、安全で安定したネットワーク接続を構成する必要があります。
- マスター ノードと外部クライアント間のネットワーク: 外部クライアントは、kubectl コマンドライン ツールまたはその他の方法を介してマスター ノード上の kube-apiserver にアクセスし、k8s クラスターを管理および操作できます。セキュリティとアクセシビリティを確保するには、適切なネットワーク アドレスとポートを設定し、TLS/SSL を使用して通信を暗号化する必要があります。
2. ノードクラスタネットワークK8s クラスターがサービスを外部に公開する方法は主に次のとおりです。 - NodePort: クラスター内の各ノードの固定ポートにサービスを公開します。クライアントは、ノードの IP アドレスとポートを通じてサービスにアクセスできます。
- LoadBalancer: クラウド プラットフォームのロード バランサを使用して、サービスをパブリック ネットワークに公開します。クライアントはパブリック IP アドレスとポートを通じてサービスにアクセスできます。
- Ingress: Ingress コントローラーを使用して、サービスをパブリック ネットワークに公開し、統合されたドメイン名アクセスを提供します。
1. ノードポートNodePort は、Kubernetes が提供する最もシンプルなサービス公開方法です。サービス タイプが NodePort の場合、Kubernetes はサービスに固定ポートを割り当て、クラスター内の各ノードの同じポートにマップします。クライアントは、クラスター内の任意のノードの IP アドレスとポートを通じてサービスにアクセスできます。 NodePort の設定は非常に簡単です。サービス仕様でタイプを NodePort に設定し、ポート番号を指定するだけです。たとえば、次の YAML は NodePort サービスを定義します。 apiVersion: v1 kind: Service metadata: name: nginx spec: type: NodePort ports: - port: 80 targetPort: 80 nodePort: 30000 サービスは、クラスター内のすべてのノードのポート 30000 で公開されます。クライアントは、クラスター内の任意のノードの IP アドレスとポート 30000 を介してサービスにアクセスできます。 NodePort の利点は、シンプルで使いやすく、クラスター外部にサービスを迅速に公開できることです。ただし、NodePort にはいくつかの欠点もあります。 Kubernetes NodePort サービスは各ノード上のポートを公開し、クラスター IP アドレスを割り当てます。外部クライアントは <NodeIP>:<NodePort> を介してサービスにアクセスできます。 NodePort タイプのサービスは、Web サービスなど、クラスターの外部からアクセスする必要があるサービスに適しています。 NodePort タイプのサービスには、次のような利点があります。 - 設定は簡単で、type: NodePort を指定するだけです。
- 展開は高速で、追加のコンポーネントは必要ありません。
- HTTP、TCP、UDP など、あらゆるタイプのサービスに使用できます。
NodePort タイプのサービスには、次のような欠点もあります。 - ポート範囲は制限されており、30000~32767 の間のポートのみ使用できます。
- 各ポートは 1 つのサービスのみ提供でき、同時に複数のサービスを提供することはできません。
- 外部トラフィックがクラスターに入ることを許可するには、ファイアウォールを手動で開く必要があります。
2. ロードバランサーLoadBalancer は、Kubernetes が提供する、より高度なサービス公開方法です。サービス タイプが LoadBalancer の場合、Kubernetes はクラウド プラットフォーム上にロード バランサーを作成し (通常は対応するロード バランシング製品の購入費用がかかります)、ロード バランサーをサービスにバインドします。クライアントは、ロード バランサーのパブリック IP アドレスとポートを介してサービスにアクセスできます。 LoadBalancer サービスには次の利点があります。 - 高可用性により、サービスが常に利用可能であることを保証できます。
- 複数のサービスに負荷分散を提供し、サービスのパフォーマンスを向上させることができます。
- 任意のポートを使用してサービスを公開できます。
- サービスは SSL/TLS で保護できます。
LoadBalancer タイプのサービスには、次のような欠点もあります。 - 構成は複雑であり、ロード バランサーのタイプと構成を指定する必要があります。
- 展開には追加の時間とリソースが必要です。
- ロードバランサーの種類によっては追加料金が発生する場合があります。
3. イングレスIngress は、Kubernetes によって提供される、より柔軟なサービス公開方法です。 Ingress コントローラーは、複数のサービスを 1 つのドメイン名に統合し、ルーティング ルールを提供して、クライアントが統合されたドメイン名を通じてさまざまなサービスにアクセスできるようにします。 選択する具体的な方法は、実際のニーズに基づいて決定する必要があります。サービスを迅速に展開する必要がある場合は、NodePort が適しています。サービスをパブリック ネットワークに公開する必要がある場合は、LoadBalancer または Ingress の方が適しています。 次のような利点があります。 - 柔軟性とパワー: Ingress は、リクエスト パス、ホスト名、HTTP メソッドなどに基づいて、トラフィックをさまざまなサービスにルーティングできます。また、Ingress は、負荷分散、SSL/TLS 保護、キャッシュなどの機能も提供できます。
- 使いやすさ: ngress は簡単に構成でき、YAML ファイルを使用して Ingress ルールを定義できます。
- スケーラビリティ: Ingress は複数の Ingress コントローラを使用して、負荷分散と高可用性を実現できます。
Ingress の欠点: - パフォーマンスのオーバーヘッド: Ingress コントローラーはクラスター内で実行する必要があり、特定のリソースを消費します。
- 複雑さ: Ingress 構成は複雑になる可能性があり、ある程度の学習コストが必要になります。
3. 関連する問題1. すでにサービスがある場合、なぜ Ingress が必要なのでしょうか? Kubernetes Service と Ingress はどちらも、Kubernetes サービスを外部に公開するために使用されるリソース オブジェクトです。それらの主な違いは次のとおりです。 - サービスは Kubernetes の中核概念であり、一連の Pod を論理ユニットに抽象化し、統合されたアクセス ポータルを提供するために使用されます。サービスには、ClusterIP、NodePort、LoadBalancer、ExternalName の 4 つのタイプがあります。このうち、ClusterIP タイプのサービスはクラスター内でのみ使用可能、NodePort タイプのサービスはクラスターの内外両方で使用可能、LoadBalancer タイプのサービスはクラスターの外で使用可能、ExternalName タイプのサービスは外部のホスト名またはドメイン名を指します。
- Ingress は Kubernetes の拡張リソース オブジェクトであり、Service に対してより柔軟で強力なルーティング機能を提供するために使用されます。 Ingress は、リクエスト パス、ホスト名、HTTP メソッドなどに基づいて、トラフィックをさまざまなサービスにルーティングできます。また、Ingress は、負荷分散、SSL/TLS 保護、キャッシュなどの機能も提供できます。
したがって、Service と Ingress を併用することで、より柔軟で強力なサービス ルーティング機能を実現できます。たとえば、Service を使用して一連の Pod を論理ユニットに抽象化し、Ingress を使用して Service にルーティング機能と負荷分散機能を提供できます。 2. Ingress の代わりに nginx を使用できますか? Ingress と外部 Nginx の主な違いは次のとおりです。 - デプロイ場所: Ingress は Kubernetes のリソース オブジェクトであり、Kubernetes クラスターにデプロイする必要があります。外部 Nginx は、Kubernetes クラスターの外部または Kubernetes クラスター内にデプロイできます。
- 管理方法: Ingress は Kubernetes コントローラーによって管理され、Kubernetes API を使用して Ingress を管理できます。外部 Nginx は、外部ツールまたはコマンドを通じて管理する必要があります。
- 機能: Ingress は、負荷分散、SSL/TLS 保護、キャッシュなどのより豊富な機能を提供します。外部 Nginx はプラグインで拡張できますが、Ingress ほど機能が豊富ではない場合があります。
Ingress は Kubernetes のより完全なソリューションであり、より豊富な機能とより柔軟な構成を提供します。 Kubernetes クラスターのすべての機能を使用する必要がある場合は、Ingress を使用する方が適しています。 Ingress の代わりに外部 Nginx を使用するシナリオをいくつか示します。 - すでに Nginx サーバーが存在しており、Ingress をデプロイしたくない。
- 特定のプラグインや構成など、外部 Nginx の特定の機能を使用する必要があります。
- Kubernetes サービスを外部ネットワークに公開する必要がありますが、Ingress のすべての機能を使用する必要はありません。
3. NodePort と Ingress- NodePort は、すべてのノードでポートを開き、トラフィックをサービスに転送する、シンプルで使いやすい外部アクセス方法です。追加の IP アドレスやロード バランサーを必要としないのが利点ですが、ポート範囲が限られている (30000 ~ 32767)、安全でない (攻撃されやすい)、レイヤー 7 プロトコルをサポートしていない (ドメイン名やパスに基づいてルーティングできない)、ノードの数によってパフォーマンスが制限されるなどの欠点があります。
- Ingress は、複数のサービスの前にあるパスまたはドメイン名に基づいてトラフィックをサービスにルーティングする、強力で柔軟な外部アクセス方法です。その利点は、複数のサービスを公開できること、HTTP/HTTPS プロトコルをサポートしていること、高パフォーマンスと高可用性を実現できること、さまざまなプラグインと機能 (SSL/TLS 終了、認証、書き換え、電流制限など) を統合できることです。しかし、その欠点は、複雑で理解しにくいことであり、追加のコントローラーとプラグイン、およびクラウド環境または物理デバイスによって提供されるロードバランサーが必要になります。
アプリケーションを展開する手順k8s ノード クラスター ノードにデプロイされた Java アプリケーションに外部アクセス サービスを提供するには、k8s Service と Ingress の 2 つのリソース オブジェクトを使用する必要があります。サービスは、Pod のグループに対する論理アクセス方法を定義する抽象化であり、Pod 間および Pod と外部ネットワーク間の負荷分散とサービス検出を実現できます。 Ingress は、クラスター内のサービスに外部リクエストをルーティングする方法を定義する一連のルールです。ドメイン名、パス、SSL/TLS などの高度な機能を実装できます。これは次の手順で実現できます。 - まず、ノード上に Deployment オブジェクトを作成し、Java アプリケーションの Pod の数、仕様、イメージなどの情報を定義し、各 Pod に IP アドレスを割り当てる必要があります。
- 次に、ノード上にサービス オブジェクトを作成し、ポート、プロトコル、セレクターなどの情報など、Java アプリケーションのアクセス方法を定義し、サービスに仮想 IP アドレスを割り当てる必要があります。
- 次に、ノード上に Ingress オブジェクトを作成し、ドメイン名、パス、証明書などの Java アプリケーションの外部アクセス ルールを定義し、Ingress にパブリック IP アドレスまたはドメイン名を割り当てる必要があります。
- 最後に、Ingress オブジェクトのルールに従って外部リクエストを対応するサービスに転送するために、nginx-ingress、traefik などの Ingress Controller コンポーネントをノードにインストールする必要があります。
|