セレクターなしの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に正当なケースがあります:

  1. 外部Service: 外部IPにルーティングするためのEndpointsを手動作成
  2. ExternalName Service: 外部サービス用のDNS CNAME
  3. 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つ。

試してみる — K8s Manifest Validator

フルツールを開く