Service

Kubernetes で Pod 群への安定したネットワークアクセスを提供する抽象化リソース

Kubernetesネットワーク

Service とは

Service は Kubernetes のリソースで、動的に変化する Pod 群に対して安定した IP アドレスと DNS 名を提供する。Pod は作成・削除のたびに IP が変わるが、Service は固定の ClusterIP を持ち、ラベルセレクタで対象の Pod にトラフィックを振り分ける。

Service の種類

タイプ アクセス範囲 用途
ClusterIP クラスター内部のみ マイクロサービス間の通信
NodePort ノードの IP + ポート 開発・テスト
LoadBalancer 外部ロードバランサー 本番の外部公開
ExternalName 外部 DNS 名へのエイリアス 外部サービスへの参照

ClusterIP (デフォルト)

apiVersion: v1
kind: Service
metadata:
  name: order-service
spec:
  type: ClusterIP
  selector:
    app: order-service  # このラベルを持つ Pod にトラフィックを振り分け
  ports:
    - port: 80          # Service のポート
      targetPort: 3000  # Pod のポート

クラスター内の他の Pod から http://order-service でアクセスできる。Kubernetes の内部 DNS が order-service.default.svc.cluster.local を解決する。

LoadBalancer (外部公開)

apiVersion: v1
kind: Service
metadata:
  name: api-gateway
spec:
  type: LoadBalancer
  selector:
    app: api-gateway
  ports:
    - port: 443
      targetPort: 8080

EKS では AWS の NLB (Network Load Balancer) が自動的に作成される。

Service の仕組み

[クライアント]Service (ClusterIP: 10.0.0.1:80)
                    ↓ kube-proxy がトラフィックを振り分け
                [Pod A (10.0.1.1:3000)]
                [Pod B (10.0.1.2:3000)]
                [Pod C (10.0.1.3:3000)]

kube-proxy が iptables または IPVS ルールを設定し、Service の IP へのトラフィックを Pod に振り分ける。Pod が追加・削除されると、エンドポイントが自動的に更新される。

Headless Service

spec:
  clusterIP: None  # Headless Service

ClusterIP を持たず、DNS が個々の Pod の IP を直接返す。StatefulSet (DB クラスター) で特定の Pod に直接アクセスする場合に使う。

Ingress との関係

Service はレイヤー 4 (TCP/UDP) のロードバランシングを提供する。レイヤー 7 (HTTP) のルーティング (パスベース、ホストベース) が必要な場合は Ingress を使い、Ingress が Service にトラフィックを振り分ける。

[外部][Ingress] → /api → [api-service][Pod]
                   → /web → [web-service][Pod]

Service については関連書籍でも詳しく扱われている。

関連用語