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 については関連書籍でも詳しく扱われている。