Kubernetes において、サービス (Service) は、一連の Pod 上で実行されるアプリケーションをネットワークサービスとして公開する抽象化オブジェクトです。サービスはこれらの Pod に対して統一された DNS 名を提供し、Pod 間でのロードバランシングを可能にします。本トピックでは、Kubernetes サービスの仕組み、重要な検討事項、およびサービスタイプの選択に関する推奨事項について説明します。
利用規約
サービスタイプ
Cloud Controller Manager のバージョンが v2.5.0 以降の場合、コンソールから Classic Load Balancer (CLB) インスタンスを作成する機能はホワイトリスト制限付きとなります。この機能は従量課金方式のみをサポートします。コンソールから CLB タイプの Service を作成するには、クォータプラットフォームにて申請を行ってください。
名称 | 説明 | シナリオ | 課金 |
デフォルトのサービスタイプです。ClusterIP サービスは、クラスター内からのみアクセス可能な仮想 IP アドレスを割り当てます。 | サービスがクラスター内でのみ通信を行い、外部に公開する必要がない場合に使用します。 たとえば、クラスター内でデプロイされたフロントエンドアプリケーションの Pod が、同じクラスター内でデプロイされたバックエンドデータベースにアクセスする必要がある場合、バックエンドデータベースは ClusterIP サービスとして実行できます。 | 無料です。 | |
NodePort サービスは、クラスター内の各ノードでポートを開きます。これにより、 | 一時的または低トラフィックのアプリケーションの場合、外部ネットワークにポートを公開できます。 たとえば、テスト中に Web アプリケーションをデプロイおよびデバッグする際に NodePort サービスを使用できます。LoadBalancer サービスとは異なり、NodePort サービスはノード間のロードバランシングを提供しません。トラフィックは単一のノードに送信されるため、リソースのボトルネックを引き起こしやすくなります。 | このサービスタイプは無料です。パブリックネットワークへのアクセスを有効にするには、ノードに EIP をバインドできます。EIP の課金については、「課金の概要」をご参照ください。 | |
LoadBalancer サービスタイプは、NodePort サービスタイプを基盤とし、外部ロードバランサを追加したものです。これにより、外部トラフィックをクラスター内の複数の Pod に円滑に分散できます。Service は、クライアントがサービスにアクセスするために使用できる外部 IP アドレスを自動的に提供します。レイヤー 4(トランスポート層)の TCP および UDP トラフィック、およびレイヤー 7(アプリケーション層)の HTTP および HTTPS トラフィック管理をサポートします。 | パブリッククラウド上でアプリケーションを実行し、安定的かつ容易に管理可能な外部エントリポイントを必要とする場合に使用します。 たとえば、大量の外部トラフィックを処理し、高可用性を確保する必要がある本番環境向けのパブリックサービス(Web アプリケーションや API サービスなど)に、このサービスタイプを使用できます。 重要 Kubernetes クラスター内からサービスにアクセスする場合は、 一方、クラスター内から
したがって、クラスター内から LoadBalancer の IP アドレスにアクセスした場合の動作は、異なる環境や Kubernetes のバージョンによって大きく異なる可能性があります。場合によっては、IP アドレスに到達できない状態になることもあります。 例:Flannel + IPVS + externalTrafficPolicy=Local | Server Load Balancer インスタンスに対して課金されます。詳細については、 CLB の課金の概要および NLB の課金ルールをご参照ください。 | |
ヘッドレスサービス (Headless Service) | ヘッドレスサービスには仮想 IP アドレスがありません。このサービスに対する DNS クエリを実行すると、単一のサービス IP アドレスではなく、Pod の IP アドレスの一覧が返されます。これにより、特定の Pod を直接検出および接続できます。 | アプリケーションがエージェントやロードバランサを経由せず、特定のバックエンド Pod と直接通信する必要がある場合に使用します。 たとえば、ClickHouse のようなステートフルアプリケーションをデプロイする場合、ヘッドレスサービスを使用して、アプリケーションの Pod が各 ClickHouse Pod に直接アクセスできるようにできます。これにより、Pod がデータを均等に読み取ったり、選択的に書き込んだりすることが可能になり、データ処理効率が向上します。 | 無料です。 |
ExternalName | ExternalName サービスは、クラスター内の内部サービス名を外部ドメイン名にマッピングします。このマッピングにより、クラスター内の Pod がサービス名を使用して外部ドメインにアクセスできるようになります。 | クラスターがパブリックドメイン名で公開されているサービスにアクセスする必要がある場合に使用します。 たとえば、アプリケーションの Pod が外部データベースのドメインにアクセスする必要がある場合、ExternalName サービスを使用して、そのドメインを内部サービス名にマッピングできます。これにより、クラスター内からサービス名を使用して直接アクセスできます。 | 無料です。 |
サービスの仕組み
ClusterIP
作成および割り当て
ACK クラスターで ClusterIP サービスを作成すると、クラスターのコントロールプレーンが、クラスター内からのみアクセス可能な仮想 IP アドレス(ClusterIP)を割り当てます。
トラフィック転送
ClusterIP にアクセスすると、kube-proxy がトラフィックをキャプチャし、ラウンドロビン方式でバックエンドの Pod に転送します。
サービスディスカバリー
ClusterIP サービスを作成すると、CoreDNS が DNS レコードを登録します。これにより、サービス名による名前解決を通じてアクセスできるようになります。フォーマットは
service-name.namespace.svc.cluster.local:portであり、たとえばnginx.default.svc.cluster.local:80のようになります。Pod のラベルおよびエンドポイントの追跡
各サービスは、どの Pod がそのバックエンドに属するかを決定するラベルセレクターで定義されます。
クラスターのコントロールプレーンは、Pod の変更をリアルタイムで監視します。サービスのラベルセレクターに一致する Pod が追加、更新、または削除されると、コントロールプレーンがエンドポイントを更新します。
NodePort
作成および割り当て
NodePort サービスを作成すると、クラスターは各ノードでポート(NodePort)を開き、外部からのアクセスを許可します。
トラフィック転送
kube-proxy が NodePort をリッスンします。NodePort は、デフォルト範囲である 30000 ~ 32767 の中から自動的に選択されます。外部リクエストを ClusterIP にルーティングし、その後バックエンドの Pod に転送します。
外部アクセス
ノードの IP アドレスおよび静的な NodePort を
<NodeIP>:<NodePort>の形式で外部エンドポイントとして使用して、サービスにアクセスできます。
LoadBalancer
作成および割り当て
LoadBalancer サービスを作成すると、クラスターのコントロールプレーンがロードバランサーサービスと自動的に連携し、トラフィック処理用のロードバランサーインスタンスを作成します。詳細については、「既存の Server Load Balancer を使用した Service によるアプリケーションの公開」および「自動作成される Server Load Balancer を使用した Service によるアプリケーションの公開」をご参照ください。
トラフィック転送
外部トラフィックがロードバランサーインスタンスの外部 IP アドレスに到達すると、ノードのポートにルーティングされ、その後 kube-proxy によってバックエンドの Pod に転送されます。
ルーティングおよびヘルスチェックの構成
ロードバランサーは、リスニングポートを自動的に構成し、ヘルスチェックを実行して、トラフィックが健全な Pod にのみルーティングされるように保証します。
外部トラフィックポリシー
LoadBalancer サービスおよび NodePort サービスは、externalTrafficPolicy 構成をサポートしており、外部トラフィックがサービスにルーティングされる方法を制御できます。この設定は、Terway を使用するクラスターと Flannel を使用するクラスターで異なる動作を示します。
Container Service for Kubernetes (ACK) コンソール にログインします。クラスター ページで、対象のクラスター名をクリックします。基本情報 タブで、クラスターで使用されているコンテナーネットワークプラグインを確認できます。
Flannel ネットワークプラグイン
比較項目 | Local | Cluster |
ロードバランサーバックエンドへの添付動作 | バックエンドの Pod をホストするノードのみがロードバランサーバックエンドに添付されます。 | クラスター内のすべてのノードがロードバランサーバックエンドに添付されます。 |
ロードバランサーのクォータ使用量 | このモードでは、ロードバランサーのクォータ使用量が少なくなります。詳細については、「クォータ制限」をご参照ください。 | クラスター内のすべてのノードをロードバランサーバックエンドに添付すると、大量のクォータが消費されます。詳細については、「クォータ制限」をご参照ください。 |
クラスター内からのサービスへのアクセス | サービスのバックエンド Pod をホストするノードからのみアクセスできます。 | クラスター内の任意のノードからアクセスできます。 |
Pod のロードバランシング | デフォルトでは、Pod のロードバランシングは行われません。 Pod 間でトラフィックを分散するには、Service に | デフォルトで Pod のロードバランシングが行われます。 |
ソース IP の保持 | サポートされています。 | サポートされていません。 |
セッションの永続化 | サポートされています。 | サポートされていません。 |
シナリオ | クライアントのソース IP アドレスの保持が必要なアプリケーション(例:ログ収集)に適しています。 | 高可用性が重要であり、ソース IP アドレスの保持が不要なシナリオ(例:大規模な Web アプリケーションクラスター)に適しています。 |
Terway ネットワークプラグイン
比較項目 | Local | Cluster |
ロードバランサーバックエンドへの添付動作 | Pod が直接ロードバランサーバックエンドに添付されます。 | |
ロードバランサーのクォータ使用量 | アプリケーションの Pod のみが添付されるため、クォータの消費量が少なくなります。詳細については、「クォータ制限」をご参照ください。 | |
クラスター内からのサービスへのアクセス | クラスター内からサービスにアクセスする場合、トラフィックはノード上の kube-proxy を経由し、 | クラスター内の任意のノードからアクセスできます。 |
Pod のロードバランシング | デフォルトで Pod のロードバランシングが行われます。 | |
ソース IP の保持 | サポートされています。 | |
セッションの永続化 | サポートされています。 | |
注意事項
サービスのロードバランシング機能を使用する前に、以下の注意事項をご確認ください。詳細については、「サービスのロードバランシング構成に関する注意事項」をご参照ください。