Kubernetes において、サービスは、一連の Pod 上で実行されているアプリケーションをネットワークサービスとして公開する抽象化です。Pod に対して安定した DNS 名と負荷分散を提供します。本トピックでは、Kubernetes サービスの仕組み、重要な考慮事項、およびサービスタイプの選択に関する推奨事項について説明します。
基本概念
サービスタイプ
Cloud Controller Manager のバージョンが v2.5.0 以降の場合、コンソールで CLB インスタンスを使用してサービスを作成する機能は、従量課金のみをサポートするホワイトリスト機能となります。コンソールで CLB タイプのサービスを作成するには、クォータセンターページでリクエストを送信してください。
名前 | 説明 | 利用シーン | 課金 |
デフォルトのサービスタイプです。ClusterIP サービスには、クラスター内からのみ到達可能な仮想 IP アドレスが割り当てられます。 | 同一クラスター内でのみ通信が必要なサービスに最適です。 たとえば、フロントエンドアプリケーションの Pod が同じクラスター内のバックエンドデータベースにアクセスする必要がある場合、データベースを ClusterIP サービスとして公開できます。 | 無料です。 | |
NodePort サービスは、クラスター内のすべてのノードで特定のポートを開きます。 | 開発、テスト、またはその他の低トラフィックのアプリケーション向けにサービスをインターネットに公開するのに適しています。 たとえば、NodePort サービスを使用して、テスト環境で Web アプリケーションをデプロイおよびデバッグできます。LoadBalancer サービスとは異なり、ノード間の負荷分散は提供しません。トラフィックは 1 つのノードにのみ送信されるため、リソースのボトルネックになりやすいです。 | 無料です。パブリックインターネットアクセスを有効にするには、ノードに EIP を関連付ける必要があります。EIP の課金の詳細については、「課金概要」をご参照ください。 | |
LoadBalancer サービスは NodePort タイプを拡張したもので、外部ロードバランサーをプロビジョニングして、クラスター内の Pod 全体にトラフィックを分散します。このサービスは、クライアントがアクセスに使用できる外部 IP アドレスを自動的に提供します。レイヤー 4 (TCP/UDP) とレイヤー 7 (HTTP/HTTPS) の両方のトラフィック管理をサポートしています。 | パブリッククラウドで実行され、安定した管理しやすい外部エントリポイントを必要とするアプリケーションに最適です。 たとえば、Web アプリケーションや API サービスなど、インターネットからのアクセスが必要で、高可用性で大量の外部トラフィックを処理する必要がある本番環境のパブリックサービスが該当します。 重要 クラスター内通信には、常に 対照的に、同一クラスター内から
そのため、クラスター内から LoadBalancer の IP にアクセスすると、環境や Kubernetes のバージョンによって動作が大きく異なるか、失敗することさえあります。 シナリオ例:Flannel + IPVS + externalTrafficPolicy=Local | ロードバランシングインスタンスの料金については、以下をご参照ください。 | |
ヘッドレスサービス | ヘッドレスサービスには仮想 IP アドレスがありません。サービス名に対する DNS クエリは、単一のサービス IP ではなく、Pod の IP アドレスのリストを返します。これにより、特定の Pod を直接検出し、接続することができます。 | プロキシやロードバランサーを介さずに、特定のバックエンド Pod と直接通信する必要があるアプリケーションに最適です。 たとえば、ClickHouse データベースサービスのようなステートフルアプリケーションをデプロイする場合、ヘッドレスサービスを使用できます。これにより、アプリケーション Pod は各 ClickHouse 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 は、デフォルトの範囲 30000-32767 から自動的に選択される NodePort をリッスンします。外部リクエストを ClusterIP にルーティングし、それがバックエンド Pod に転送されます。
外部アクセス
<NodeIP>:<NodePort>の形式で、ノードの IP アドレスと静的ポート (NodePort) を使用して、外部からサービスにアクセスできます。
LoadBalancer
作成と割り当て
LoadBalancer サービスを作成すると、コントロールプレーンは自動的にロードバランシングサービスと対話し、トラフィックを処理するためのロードバランサーインスタンスを作成します。詳細については、「既存の Server Load Balancer インスタンスを使用してアプリケーションを公開する」および「自動プロビジョニングされた LoadBalancer サービスでアプリケーションを公開する」をご参照ください。
トラフィック転送
外部トラフィックがロードバランサーインスタンスの外部 IP に到達すると、ノード上のポートにルーティングされます。その後、kube-proxy がトラフィックをバックエンド Pod に転送します。
ルートとヘルスチェック設定
ロードバランサーは、リスナーポートを自動的に設定し、ヘルスチェックを実行して、トラフィックが正常な Pod にのみルーティングされるようにします。
外部トラフィックポリシー
LoadBalancer および NodePort サービスには、外部トラフィックのルーティング方法を制御する externalTrafficPolicy 設定があります。この設定の動作は、Terway-Eniip と Flannel ネットワークプラグインを使用するクラスターで異なります。
ACK コンソールにログインします。[クラスター] ページで、クラスターの名前をクリックします。[基本情報] タブで、クラスターが使用している CNI ネットワークプラグインを確認できます。
Flannel ネットワークプラグイン
項目 | Local | Cluster |
バックエンドサーバーのアタッチ | バックエンド Pod をホストするノードのみが、ロードバランサーのバックエンドサーバーとして追加されます。 | クラスター内のすべてのノードが、ロードバランサーのバックエンドサーバーとして追加されます。 |
ロードバランサーのクォータ | 消費するロードバランサーのクォータリソースが少なくなります。詳細については、「クォータ制限」をご参照ください。 | すべてのクラスターノードがバックエンドとしてアタッチされるため、多数のロードバランサーのクォータリソースを消費します。詳細については、「クォータ制限」をご参照ください。 |
サービスへのクラスター内アクセス | サービスのバックエンド Pod をホストするノードのみがアクセスできます。 | クラスター内のどのノードからでもサービスにアクセスできます。 |
Pod の負荷分散 | Pod 間の負荷分散はデフォルトで無効になっています。 負荷分散を有効にするには、サービスにアノテーション | Pod 間の負荷分散はデフォルトで有効になっています。 |
ソース IP の保持 | サポートされています。 | サポートされていません。 |
セッション永続化 | サポートされています。 | サポートされていません。 |
利用シーン | ソース IP に基づくロギングなど、元のクライアント IP アドレスを保持する必要があるアプリケーション。 | 高いサービス可用性が要求され、ソース IP の保持が問題にならない場合 (大規模な Web アプリケーションクラスターなど)。 |
Terway-Eniip ネットワークプラグイン
項目 | Local | Cluster |
バックエンドサーバーのアタッチ | Pod は、ロードバランサーにバックエンドサーバーとして直接追加されます。 | |
ロードバランサーのクォータ | アプリケーション Pod のみがアタッチされるため、消費するロードバランサーのクォータリソースが少なくなります。詳細については、「クォータ制限」をご参照ください。 | |
サービスへのクラスター内アクセス | クラスター内からサービスにアクセスする場合、トラフィックはノード上の kube-proxy を通過し、 | クラスター内のどのノードからでもサービスにアクセスできます。 |
Pod の負荷分散 | Pod 間の負荷分散はデフォルトで有効になっています。 | |
ソース IP の保持 | サポートされています。 | |
セッション永続化 | サポートされています。 | |
注意事項
サービスの負荷分散機能を使用する前に、関連する考慮事項を確認してください。詳細については、「サービスの負荷分散を設定する際の考慮事項」をご参照ください。