Service
Service は、Pod にアクセスするための安定したネットワークエンドポイントを提供します。Pod は一時的なもので頻繁に作成/削除される可能性があるため、Service は信頼性の高い通信のために一貫した DNS 名と IP アドレスを提供します。
Service が重要な理由:
Pod は作成と削除を繰り返すため、クライアントは Pod に直接接続することができません。Service は以下を実現します:
- 安定したネットワーキングの提供: Pod が変更されても IP と DNS 名は同じままです。
- 負荷分散の提供: 正常な Pod 間でリクエストを自動的に分散します
- サービスディスカバリの実現: 他のコンポーネントは名前で Service に到達できます
- Pod の抽象化の提供: クライアントは個 々の Pod の IP を知る必要がありません
- 自動更新の処理: Pod が作成または削除されるとエンドポイントを調整します
このラボでは、小売ストアの catalog コンポーネントの Service を作成し、Service が Pod 間の通信をどのように実現するかを探ります。
Service タイプ
Kubernetes は、さまざまなユースケースに対応する異なる Service タイプを提供します:
| タイプ | 目的 | アクセス |
|---|---|---|
| ClusterIP | クラスター内部通信 | クラスターのみ |
| NodePort | ノードポート経由の外部アクセス | 外部 |
| LoadBalancer | クラウドロードバランサー経由の外部アクセス | 外部 |
| ExternalName | 外部 DNS 名へのマッピング | 外部 |
LoadBalancer Service に関する専用のラボは、このワークショップの後半で利用できます。そこでは、クラウドロードバランサーを使用して Service を外部に公開する方法を学習します。
Service の作成
小売ストアの UI Service を見てみましょう:
apiVersion: v1
kind: Service
metadata:
name: ui
labels:
app.kubernetes.io/name: ui
app.kubernetes.io/instance: ui
app.kubernetes.io/component: service
app.kubernetes.io/created-by: eks-workshop
spec:
type: ClusterIP
ports:
- port: 80
targetPort: http
protocol: TCP
name: http
selector:
app.kubernetes.io/name: ui
app.kubernetes.io/instance: ui
app.kubernetes.io/component: service
kind: Service: Service リソースを作成します
metadata.name: Service の名前 (ui)
spec.type: Service タイプ (内部アクセス用の ClusterIP)
spec.ports: Service から Pod へのポートマッピング
spec.selector: どの Pod がトラフィックを受信するかを選択します
Service をデプロイします:
Service が Pod に接続する方法
Service は特定の Pod を直接認識しているわけではありません。代わりに、ラベルセレクターを使用して、トラフィックを受信すべき Pod を動的に検索します。これにより、柔軟で疎結合な関係が構築されます。
仕組みは次のとおりです:
- Pod はラベルを持っています - Pod を説明するキーと値のペア
- Service はセレクターを持っています - Pod ラベルに一致する基準
- Kubernetes が自動的に接続します - セレクターに一致する Pod がエンドポイントになります
UI Service でこれを実際に見てみましょう:
{"app.kubernetes.io/component": "service",
"app.kubernetes.io/instance": "ui",
"app.kubernetes.io/name": "ui"
}
次に、一致するラベルを持つ Pod を確認します:
{"app.kubernetes.io/component": "service",
"app.kubernetes.io/created-by": "eks-workshop",
"app.kubernetes.io/instance": "ui",
"app.kubernetes.io/name": "ui",
"pod-template-hash": "5989474687"
}
UI Pod が Service セレクターに一致するラベルを持っていることがわかります。これが、Service がどの Pod にトラフィックを送信すべきかを知る方法です。
この関係は動的です:
- 一致するラベルを持つ新しい Pod が起動すると、自動的に Service のエンドポイントになります
- Pod が削除されると、自動的に Service から削除されます
- Pod のラベル を変更すると、Service に追加または削除できます
このラベルベースのシステムは以下を意味します:
- Service は任意のワークロードコントローラーと連携します (Deployment、StatefulSet など)
- Pod は複数の Service に属することができます 異なるセレクターに一致する場合
- Service は自動的に適応します Pod がスケールアップまたはダウンするにつれて
Service の確認
Service のステータスを確認します:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ui ClusterIP 172.20.83.84 <none> 80/TCP 15m
Service のエンドポイント (実際の Pod IP) を表示します:
NAME ENDPOINTS AGE
ui 10.42.1.15:8080 15m
これは、どの Pod がトラフィックを受信するかを示しています
詳細な Service 情報を取得します:
Name: ui
Namespace: ui
Labels: app.kubernetes.io/component=service
app.kubernetes.io/created-by=eks-workshop
app.kubernetes.io/instance=ui
app.kubernetes.io/name=ui
Annotations: <none>
Selector: app.kubernetes.io/component=service,app.kubernetes.io/instance=ui,app.kubernetes.io/name=ui
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 172.16.88.252
IPs: 172.16.88.252
Port: http 80/TCP
TargetPort: http/TCP
Endpoints: 10.42.129.33:8080
Session Affinity: None
Internal Traffic Policy: Cluster
Events: <none>
サービスディスカバリ
Service は、DNS 名を通じた自動的なサービスディスカバリを実現します:
完全な DNS 名の形式:
<service-name>.<namespace>.svc.cluster.local