Kubernetes NodePort vs LoadBalancer vs Ingress? いつ、何を使用しますか?


最近、NodePorts、LoadBalancers、およびIngressの違いを尋ねられました。 これらはすべて、外部トラフィックをクラスターに取り込むさまざまな方法です。 それらがどのように異なるのか、それぞれをいつ使用するのかを見てみましょう。


注: 推奨事項は、 Google Kubernetes Engineに基づいています 別のクラウド、自分のサーバー、ミニキューブなどで作業している場合、違いがあります。 技術的な詳細には触れません。 詳細については、 公式ドキュメントを参照してください。


Clusterip


ClusterIPはデフォルトのKubernetesサービスです。 クラスター内の他のアプリケーションがアクセスできるクラスター内のサービスを提供します。 外部アクセスなし。


ClusterIPサービスのYAMLは次のとおりです。


apiVersion: v1 kind: Service metadata: name: my-internal-service selector: app: my-app spec: type: ClusterIP ports: - name: http port: 80 targetPort: 80 protocol: TCP 

インターネットからアクセスできない場合、ClusterIPサービスについて説明したのはなぜですか? 方法があります:Kubernetesプロキシを使用する!



Kubernetesプロキシサーバーを起動します。


 $ kubectl proxy --port=8080 

次のスキームを使用して、Kubernetes APIをナビゲートしてこのサービスにアクセスできます。


http:// localhost:8080 / api / v1 / proxy / namespaces / / services / <SERVICE-NAME>:<PORT-NAME> /

このアドレスを使用して、上記のサービスにアクセスします。


http:// localhost:8080 / api / v1 / proxy / namespaces / default / services / my-internal-service:http /


いつ使用しますか?


Kubernetesプロキシを使用してサービスにアクセスするには、いくつかのシナリオがあります。
他の目的のためにラップトップからサービスをデバッグしたり、サービスに直接接続したりする
内部トラフィックの解決、内部パネルの表示など。


この方法では認証されたユーザーとしてkubectlを実行する必要があるため、インターネット上のサービスへのアクセスや本番サービスへのアクセスを提供するために使用するべきではありません。


NodePort


NodePortサービスは、外部トラフィックをサービスに誘導する最も基本的な方法です。 NodePortは、その名前が示すとおり、すべてのノード(仮想マシン)に対して指定されたポートを開き、このポートへのトラフィックはサービスにリダイレクトされます。



NodePortサービスのYAMLは次のようになります。


 apiVersion: v1 kind: Service metadata: name: my-nodeport-service selector: app: my-app spec: type: NodePort ports: - name: http port: 80 targetPort: 80 nodePort: 30036 protocol: TCP 

本質的に、NodePortサービスには通常のClusterIPサービスとは2つの違いがあります。 最初はNodePortタイプです。 nodePortと呼ばれる追加のポートがあり、ノードで開くポートを示します。 このポートを指定しない場合、ランダムが選択されます。 ほとんどの場合、Kubernetesにポート自体を選択させます。 thockinが言うように、ポートの選択はそれほど単純ではありません。


いつ使用しますか?


この方法には多くの欠点があります。
港には1つのサービスしかありません
ポート30000〜32767のみが使用可能です。
ホスト/仮想マシンのIPアドレスが変更された場合、それを把握する必要があります


これらの理由から、本番環境でこの方法を使用してサービスへのアクセスを直接提供することはお勧めしません。 しかし、サービスの継続的な可用性があなたにとって無関心であり、コストのレベルがそうでない場合、この方法はあなたのためです。 このようなアプリケーションの良い例は、デモまたは一時的なギャグです。


ロードバランサー


LoadBalancerサービスは、インターネットでサービスを提供する標準的な方法です。 GKEで、彼はIPアドレスを提供するNetwork Load Balancerをデプロイします。 このIPアドレスは、すべてのトラフィックをサービスに転送します。



いつ使用しますか?


サービスを直接開く場合、これがデフォルトの方法です。 指定されたポートのすべてのトラフィックは、サービスに向けられます。 フィルタリングなし、ルーティングなしなど これは、HTTP、TCP、UDP、Websocket、gRPCなどのようなタイプのトラフィックをサービスに向けることができることを意味します。


! ただし、欠点が1つあります。 LoadBalancerを使用して展開する各サービスには独自のIPアドレスが必要です。これにはかなりの費用がかかります。


イングレス


上記の例とは異なり、Ingress自体はサービスではありません。 複数のサービスに直面し、「インテリジェントルーター」またはクラスターエントリポイントとして機能します。


豊富な機能を備えたさまざまなタイプのIngressコントローラーがあります。


GKEコントローラーは、デフォルトでHTTP(S)ロードバランサーを起動します。 同時に、パスとサブドメインに基づくバックエンドサービスへのルーティングが利用可能になります。 たとえば、foo.yourdomain.comにすべてをfooサービスに送信し、パスyourdomain.com/bar/にbarサービスへのすべての添付ファイルを送信します。



L7 HTTPロードバランサーを使用したGKE上のIngressオブジェクトのYAML 次のとおりです。


 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: my-ingress spec: backend: serviceName: other servicePort: 8080 rules: - host: foo.mydomain.com http: paths: - backend: serviceName: foo servicePort: 8080 - host: mydomain.com http: paths: - path: /bar/* backend: serviceName: bar servicePort: 8080 

いつ使用しますか?


一方では、イングレスはサービスを公開する最良の方法の1つです。 一方、最も難しいものの一つ。 多くのIngressコントローラーがあります: Google Cloud Load BalancerNginxContourIstioなど。 cert-managerなど、サービス用のSSL証明書を自動的に提供するIngressコントローラー用のプラグインがあります。


Ingressは、すべてのサービスが共通のL7プロトコル(通常はHTTP)を使用する場合、複数のサービスを同じIPアドレスに公開するのに適しています。 組み込みのGCP統合を使用すると、1つのロードバランサーに対してのみ料金を支払います。 また、Ingressはスマートなので、多くの機能をすぐに使用できます(たとえば、SSL、認証、ルーティングなど)。


図をありがとう、 アフメットアルプバルカン


これは技術的に最も正確な図ではありませんが、NodePortの動作をよく示しています。


オリジナル: Kubernetes NodePort vs LoadBalancer vs Ingress? 何を使うべきですか?



Source: https://habr.com/ru/post/J358824/


All Articles