Chuyển đến nội dung chính

レッスン 7: サービスとエンドポイントスライス

Kubernetes Services によるサービスの検出と負荷分散。 ClusterIP、NodePort、LoadBalancer、外部名。 EndpointSlices は、Endpoints API (非推奨の K8s 1.33) に代わる新しい標準です。 Kubernetes のヘッドレス サービスと DNS。

🎯 レッスンの目的

Kubernetes でサービスが必要な理由、サービスの種類、および各種類をいつ使用するかを理解します。EndpointSlices は、Endpoints API、DNS ベースのサービス検出を CoreDNS に置き換える新しい標準です。

1.サービスが必要な理由

Pod には 動的 IP が割り当てられます。Pod が再作成されるたびに (クラッシュ、更新、スケーリング後)、新しい IP が取得されます。サービス A がサービス B を呼び出したい場合、サービス A は B の IP をハードコーディングできません。

Service は、一連の Pod に安定した endpoint__HTMLTAG_12___ (IP および DNS 名) を提供します。サービスへのトラフィックは正常なポッドに負荷分散されます。

2.サービスの種類_

Kubernetes Service Types - ClusterIP, NodePort, LoadBalancer, ExternalName

2.1 ClusterIP (デフォルト)

クラスター内の内部 IP を使用してサービスを公開します。クラスター内からのみアクセス可能です。

___コードブロック_0___

2.2 ノードポート_

ノードの IP と静的ポート (30000 ~ 32767) を介してクラスターの外にサービスを公開します。

___コードブロック_1___

アクセス: http://<any-node-ip>:31000

2.3 ロードバランサー

_外部ロード バランサーを作成します (クラウド プロバイダー: AWS ELB、GCP CLB、Azure LB)。クラウド上の本番環境で使用されます。

___コードブロック_2___

最新の代替案: ゲートウェイ API を使用します (モジュール 4 を参照) — より表現力が高く、ベンダー ロックインはありません。

2.4 外部名

_サービスをクラスター外の DNS 名にマップします。負荷分散は行わず、CNAME のみを使用します。

___コードブロック_3___

3. DNS によるサービス検出

CoreDNS は各サービスの DNS レコードを作成します。形式:

___コードブロック_4___ ___コードブロック_5___

4. EndpointSlices — 新しい標準 K8s 1.33+

以前、Kubernetes は__HTMLTAG_48___Endpoints リソースを使用してポッドの IP リストを保存していました。問題: ポッドの数が多い (数千) と、Endpoints オブジェクトが非常に大きくなり、更新時にネットワーク オーバーヘッドが発生します。

EndpointSlices はスライスに分割され (デフォルトではスライスあたり最大 100 エンドポイント)、スケーラビリティが大幅に向上します。

  • エンドポイント API: 非推奨の K8 1.33___HTMLTAG_58__HTMLTAG_59___
  • EndpointSlices: 現在の標準、K8s 1.21
  • 以降に導入
___コードブロック_6___ ___コードブロック_7___

5.ヘッドレス サービス

ヘッドレス サービス (clusterIP: なし) には ClusterIP がありません。 DNS クエリは、ロード バランシングを行わずに、Pod の IP を直接返します。 StatefulSet が各 Pod に安定した DNS 名を持つために使用されます。

___コードブロック_8___ ___コードブロック_9___

6.セッション アフィニティ

デフォルトでは、各リクエストはランダムなポッドに対してラウンドロビンで行われます。スティッキーセッションが必要な場合:

___コードブロック_10___

7. kube-proxy とサービスの実装

kube-proxy は各ノードで実行され、iptables/nftables ルールを作成することでサービスの負荷分散を実装します。

  • iptables モード: レガシー、最も人気のある
  • nftables モード: 2026 推奨 (IPVS 非推奨 K8s 1.35)

パケットが ClusterIP に到着すると、iptables/nftables ルールはランダムな IP ポッド (DNAT) にリダイレクトします。

8.サービスのベスト プラクティス

  • 内部サービスには常に__HTMLTAG_93___ClusterIPを使用してください
  • 外部公開用の LoadBalancer タイプの代わりにゲートウェイ API を使用
  • サービスに明確な名前を付け、一貫したラベルを使用
  • 番号の代わりにポート名として targetPort__HTMLTAG_104___ を使用します (ポッド内のポートを変更するときの柔軟性)
  • エンドポイントスライスを監視して接続の問題をデバッグ__HTMLTAG_107___

概要

  • Service = 動的ポッドの安定したエンドポイント__HTMLTAG_113___
  • _ClusterIP: 内部;ノードポート: 開発/テスト; LoadBalancer: クラウド運用 (ただし API ゲートウェイを優先)
  • EndpointSlices は Endpoints API (非推奨の K8s 1.33) を置き換えます
  • ヘッドレス サービス: DNS は、StatefulSet に使用されるポッド IP を直接返します
  • CoreDNS: svc-name.namespace.svc.cluster.local