セレクターなしのKubernetes Service
セレクターが欠落しているServiceを検出します。セレクターがないとPodにトラフィックが自動ルーティングされません。セレクターなしServiceが意図的な場合について理解します。
Networking
詳細な説明
Serviceセレクターの検証
Kubernetes Serviceはspec.selectorを使用してトラフィックを受け取るPodを決定します。セレクターがないと、Serviceは自動的にEndpointsを作成しません。これは通常ミスです。
セレクターが欠落した例
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
ports:
- port: 80
targetPort: 8080
バリデーターが検出する問題
- 警告: セレクターが定義されていません。ServiceがどのPodにもマッチしません。
- 情報: metadataにラベルが定義されていません。
セレクターなしServiceが意図的な場合
セレクターなしのServiceに正当なケースがあります:
- 外部Service: 外部IPにルーティングするためのEndpointsを手動作成
- ExternalName Service: 外部サービス用のDNS CNAME
- StatefulSet用ヘッドレスService: 自身のEndpointsを管理するStatefulSetと組み合わせる場合
正しいService設定
apiVersion: v1
kind: Service
metadata:
name: my-service
labels:
app: myapp
spec:
selector:
app: myapp
ports:
- name: http
port: 80
targetPort: 8080
protocol: TCP
type: ClusterIP
Serviceポートのベストプラクティス
- 各ポートに必ず
nameを含める(複数ポートの場合は必須) protocolを明示的に指定(デフォルトはTCP)- 可能な場合はコンテナポート名に一致する名前付き
targetPortを使用 - 外部アクセスには
type: LoadBalancerまたはIngressリソースを使用
ユースケース
Serviceは存在するがPodにトラフィックが到達しない接続性の問題をデバッグする。セレクターの欠落や不正は、Serviceルーティング障害の最も一般的な原因の1つ。