Kubernetes クラスター ネットワーク: k8s がサービスを外部に公開する方法

Kubernetes クラスター ネットワーク: k8s がサービスを外部に公開する方法

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 コンポーネントをノードにインストールする必要があります。

<<:  配信とネットワークの原則について話しましょう

>>:  単一のクラウドプロバイダーに過度に依存することの危険性

推薦する

Baiduの外部リンクツールを参考にして外部リンクを作ることについての私の個人的な意見

インターネット上にはすでに百度の外部リンク検索ツールに関する議論の投稿が多数あり、同社はそれらの古い...

感情的なデザインがユーザーにより良い体験を提供する方法についての簡単な議論

先月のTaobao UEDミルクティーパーティーで共有されたトピック。それをテキストにしてみんなと共...

ファーウェイクラウドが栄恵通金の金融技術構築を支援

2017年はインターネット金融にとって素晴らしい年でした。クラウドコンピューティング、ビッグデータ、...

WeChat:2年で15言語、100カ国以上で3億人のユーザーを獲得

出典:人民日報 著者:張易軒 周飛亜外国製品は入ってこられず、国内製品は出てこられない。中国のインタ...

タオバオ運営:最も効果的なタオバオプロモーション方法

現在、多くの販売者が、注文数が少なすぎるという問題を抱えています。この問題を解決する最も直接的かつ簡...

【6つの主要な基準】ウェブサイトのキーワードランキングの優位性を判断する

この段階では、ウェブサイトの最適化はユーザー開発とコンテンツ開発に関するものです。コンテンツ開発には...

Citrix: 協力エコシステムを拡大し、デジタルの未来をインテリジェントに強化

10月31日、「スマートチャイナが未来を拓く」2019 Citrixサミットが北京で成功裏に開催され...

従来の電子商取引ウェブサイトは、マーケティングを効果的に活用するにはどうすればよいでしょうか?

レバレッジマーケティングに関しては、従来の電子商取引ウェブサイトで作業する多くのマーケターがそれを非...

SEO検索エンジン最適化の3つのカテゴリと8つのテクニックを簡単に分析した記事

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています今年1月3...

クラウドへの移行は今後も深まり、企業のIT支出は今年1.3兆ドルを超える見込み

ガートナーは、2025 年までに、パブリック クラウド コンピューティング分野の有効市場セグメントに...

企業ウェブサイトの SEO 最適化の重要性に関する分析

私たち一人一人は、自分たちの生活が世界を揺るがすような変化を経験していると感じているようです。コンピ...

ユーザーの注目を減らすための手順 eコマースアプリのデザインから学んだ9つの成功のヒント

【はじめに】 買い手であっても売り手であっても、最も重要な点は、製品設計によってまず行動を起こせるか...

Baidu 2ページ目関連検索SEOerがこの機能を使用する方法

国慶節の休暇後、百度は検索結果に新たな調整を加えた。検索結果の2ページ目には関連する検索語が3つ表示...

中小企業がネットワークマーケティングブランドを実現するための2つの勝利のポイント

中小企業がネットワークマーケティングブランドを実現するための2つの勝利のポイントはじめに: 企業が究...

ウェブサイトのトラフィックを増やすための 5 つのヒント

はじめに: ウェブサイトの顧客を増やしたい場合は、ウェブサイトをシンプルに保ち、価値あるコンテンツを...