Kubernetesでは、サービスは、ネットワーク経由でポッドのグループを公開するのに役立つ抽象化です。 サービスは、サービスによって公開されるポッドのドメイン名を提供し、ポッド間の負荷分散を実装します。 このトピックでは、サービスの仕組みとLoadBalancerサービスの設定に関する注意事項について説明します。 このトピックでは、さまざまな種類のサービスを選択してアプリケーションを公開する方法についても説明します。
条件
サービスタイプ
機能 | 説明 | シナリオ | 課金 |
デフォルトのサービスタイプ。 ClusterIPサービスは、クラスタ内仮想IPアドレスを使用します。 | このタイプのサービスは、クラスター内でのみアプリケーションを公開する必要があるシナリオに適しています。 たとえば、フロントエンドアプリケーションのポッドが同じクラスター内のバックエンドデータベースにアクセスする必要がある場合、ClusterIPサービスを使用してクラスター内のデータベースを公開できます。 | 無料です。 | |
NodePortサービスはノードポートを公開します。 | このタイプのサービスは、アプリケーションを一時的にインターネットに公開する必要がある場合や、アプリケーションがポートで少量の外部トラフィックを受信する必要がある場合に適しています。 たとえば、テスト環境にwebアプリケーションを配置する場合は、NodePortサービスを使用してアプリケーションを公開できます。 LoadBalancerサービスと比較して、NodePortサービスはノード間の負荷分散を実装していません。 NodePortサービスを使用してアプリケーションにアクセスする場合、トラフィックはリクエストを送信するノードにのみ転送されます。 この場合、リソースのボトルネックがノードで発生しやすくなります。 | 無料です。 インターネットアクセスを有効にする場合は、elastic IPアドレス (EIP) をノードに関連付けます。 EIP課金の詳細については、「請求明細」をご参照ください。 | |
LoadBalancerサービスは、ロードバランサーで構成されたNodePortサービスに似ています。 このタイプのサービスは、トラフィックを複数のポッドに均等に分散できます。 LoadBalancerサービスは、バックエンドポッドを外部アクセスに公開するためのパブリックIPアドレスを自動的に提供します。 LoadBalancerサービスは、レイヤー4でTCPおよびUDPリクエストを処理し、レイヤー7でHTTPおよびHTTPSリクエストを管理できます。 | このタイプのサービスは、クラウドにデプロイされたアプリケーションに安定した管理しやすいイングレスを提供するシナリオに適しています。 たとえば、LoadBalancer Servicesを使用して、webアプリケーションやAPIサービスなど、本番環境に展開されているパブリックサービスをインターネットに公開できます。 これにより、サービスの高可用性が保証され、トラフィックスパイクに耐えることができます。 | Server Load Balancer (SLB) は、LoadBalancer Servicesで使用されるSLBインスタンスに対して料金を請求します。 詳細については、次をご参照ください: | |
ExternalName | ExternalNameサービスは、サービスを外部ドメイン名にマップするために使用されます。 これにより、クラスター内のポッドは、サービスを使用して外部ドメイン名にアクセスできます。 | このタイプのサービスは、クラスターがパブリックドメイン名にアクセスする必要があるシナリオに適しています。 たとえば、アプリケーションが外部データベースのドメイン名にアクセスする必要がある場合、ドメイン名をExternalNameサービスにマップできます。 これにより、アプリケーションのポッドは、クラスター内からExternalNameサービスを使用してドメイン名にアクセスできます。 | 無料です。 |
ヘッドレスサービス | ヘッドレスサービスには、固定の仮想IPアドレスがありません。 ヘッドレスサービスのバックエンドポッドにアクセスすると、サービスはDNSルックアップを実行し、IPアドレスのリストを返します。 その後、要件に基づいてリスト内の任意のIPアドレスに直接接続できます。 | このタイプのサービスは、プロキシやロードバランサーの代わりにDNSレコードを使用して個々のバックエンドポッドに直接アクセスする必要があるシナリオに適しています。 たとえば、ヘッドレスサービスを使用して、StatefulSetとして配置されるClickHouseアプリケーションを公開できます。 これにより、ClickHouseアプリケーションの各ポッドにアクセスできます。 これにより、ポッド間で読み取りと書き込みのバランスを取り、データ処理効率を向上させることができます。 | 無料です。 |
サービスのしくみ
ClusterIP
作成と割り当て
Container Service for Kubernetes (ACK) クラスターでClusterIPサービスを作成すると、クラスターのコントロールプレーンは、クラスターのサービスCIDRブロックからサービスに仮想IPアドレスを割り当てます。 仮想IPアドレスはクラスタIPアドレスです。 クラスターIPアドレスは、クラスター内からのみアクセスでき、ポッドCIDRブロックに属していません。
トラフィック転送
クラスター内からClusterIPサービスにアクセスすると、リクエストはkube-proxyによってキャプチャされます。 kube-proxyは、iptablesまたはIPVSルールに基づくラウンドロビンスケジューリングアルゴリズムを使用して、リクエストをバックエンドポッドに転送します。
サービス検出
ClusterIPサービスを作成すると、新しいDNSレコードがCoreDNSに追加されます。 DNSレコードを使用して、ClusterIPサービス名をそのクラスターIPアドレスに解決できます。 ClusterIPサービスにアクセスするには、
Service.Namespace.svc.cluster.local:port
形式 (nginx.de fault.svc.cluster.local:80
など) のエンドポイントにリクエストを送信します。ポッドラベルとエンドポイントの追跡
各サービスには、バックエンドポッドの選択に使用される一連のラベルセレクターがあります。
クラスターモニタポッドの制御プレーンは、クラスター内でリアルタイムに変化します。 新しいポッドがサービスのラベルセレクターと一致するか、ラベルセレクターと一致する既存のポッドが更新または削除されると、クラスターの制御プレーンによってサービスのエンドポイントが更新されます。
NodePort
作成と割り当て
NodePortサービスを作成すると、クラスターはクラスターIPアドレスをサービスに割り当て、サービスのノードポートを公開します。 ノードポートは、特定のポート範囲 (デフォルトでは30000 32767) から自動的に割り当てられます。 カスタムノードポートを指定することもできます。
トラフィック転送
kube-proxyは、クラスター内の各ノードでNodePortサービスに対して公開されているノードポートをリッスンします。 外部リクエストがノードのノードポートに到達すると、kube-proxyはリクエストをクラスターIPアドレスにルーティングしてからバックエンドポッドにルーティングします。
外部アクセス
NodePort Serviceにアクセスするには、
<NodeIP >:< NodePort>
形式で外部エンドポイントにリクエストを送信します。
LoadBalancer
作成と割り当て
SLBインスタンスを指定せずに
LoadBalancer
サービスを作成すると、クラスターのコントロールプレーンが自動的にサービスのSLBインスタンスを作成します。 詳細については、「既存のSLBインスタンスを使用してアプリケーションを公開する」および「自動作成されたSLBインスタンスを使用してアプリケーションを公開する」をご参照ください。トラフィック転送
外部リクエストがSLBインスタンスの外部IPアドレスに到達すると、SLBインスタンスは、負荷分散ポリシーに基づいて、ノード上のノードポートにリクエストをルーティングします。 次に、ノードのkube-proxyは、iptablesまたはIPVSルールに基づいて要求をバックエンドポッドに転送します。
ルーティングとヘルスチェックの設定
SLBインスタンスは、Service YAMLファイルで指定されたリスニングポートを自動的に使用し、ポートで受信したリクエストをServiceのラベルセレクターと一致するポッドに転送します。 さらに、SLBはSLBインスタンスのヘルスチェック設定を自動的に設定して、リクエストが正常なポッドにのみルーティングされるようにします。
外部トラフィックポリシー: ローカルとクラスター
externalTrafficPolicy
パラメーターを指定して、LoadBalancerまたはNodePortサービスの外部トラフィックポリシーを設定できます。 外部トラフィックポリシーは、外部リクエストをバックエンドポッドにルーティングする方法を指定します。 ローカルとクラスターの2つの外部トラフィックポリシーがサポートされています。 外部トラフィックポリシーの機能は、クラスターで使用されるネットワークプラグインによって異なります。 次のセクションでは、Terway-EniipまたはFlannelをネットワークプラグインとして使用する場合の外部トラフィックポリシーの機能について説明します。
ACKコンソールにログインします。 [クラスター] ページで、クラスターの名前をクリックします。 [基本情報] タブで、[クラスター情報] セクションでクラスターのネットワークプラグインを表示できます。
Flannel
クラスターがFlannelネットワークプラグインを使用している場合、ノードのNodePortサービスはトラフィックをバックエンドポッドに転送します。
ローカル: トラフィックは、リクエストの送信先ノードのポッドにのみルーティングされます。
クラスター: トラフィックは、クラスター内の他のノードのポッドにルーティングできます。
次の表に、ローカルポリシーとクラスタポリシーの違いを示します。
項目 | ローカル | クラスター |
バックエンドサーバー | バックエンドポッドがデプロイされているノードのみが、バックエンドサーバーとしてSLBインスタンスに追加されます。 | クラスター内のすべてのノードがバックエンドサーバーとしてSLBインスタンスに追加されます。 |
SLBリソースのクォータ | このポリシーは少量のSLBリソースを消費し、高いSLBリソースクォータを必要としません。 SLBリソースクォータの詳細については、「クォータ」をご参照ください。 | クラスター内のすべてのノードがバックエンドサーバーとしてSLBインスタンスに追加されるため、このポリシーでは高いSLBリソースクォータが必要です。 SLBリソースクォータの詳細については、「クォータ」をご参照ください。 |
SLBインスタンスのIPアドレスへのアクセス | バックエンドポッドがデプロイされているノードのみが、SLBインスタンスのIPアドレスにアクセスできます。 | クラスター内のすべてのノードがSLBインスタンスのIPアドレスにアクセスできます。 |
ポッド間の負荷分散 | デフォルトでは、ポッド間の負荷分散は無効になっています。 ポッド間の負荷分散を有効にするには、 | デフォルトでは、ポッド間の負荷分散が有効になっています。 |
ソースIPの保存 | 対応 | 非対応 |
セッション維持 | 対応 | 非対応 |
利用シナリオ | クライアントIPアドレスをログに記録する必要があるアプリケーションなど、クライアントIPアドレスを保持する必要があるアプリケーション。 | 大規模なwebアプリケーションクラスタなど、高可用性を必要とするがクライアントIPアドレスを保持する必要のないアプリケーション。 |
Terway-エニップ
クラスターがTerway-Eniipネットワークプラグインを使用している場合、使用されている外部トラフィックポリシーに関係なく、トラフィックはバックエンドポッドに直接転送されます。
次の表に、ローカルポリシーとクラスタポリシーの違いを示します。
項目 | ローカル | クラスター |
バックエンドサーバー | ポッドは、バックエンドサーバーとしてSLBインスタンスに追加できます。 | |
SLBリソースのクォータ | ビジネスポッドのみがSLBインスタンスに追加されます。 どちらのポリシーも少量のSLBリソースを消費し、高いSLBリソース割り当てを必要としません。 SLBリソースクォータの詳細については、「クォータ」をご参照ください。 | |
SLBインスタンスのIPアドレスへのアクセス | バックエンドポッドがデプロイされているノードのみが、SLBインスタンスのIPアドレスにアクセスできます。 | クラスター内のすべてのノードがSLBインスタンスのIPアドレスにアクセスできます。 |
ポッド間の負荷分散 | デフォルトでは、ポッド間の負荷分散が有効になっています。 | |
ソースIPの保存 | 対応 | |
セッション維持 | 対応 |
考慮事項
LoadBalancerサービスを設定する前に、関連する考慮事項を読んで理解することをお勧めします。 詳細については、「LoadBalancerサービスの設定に関する考慮事項」をご参照ください。