インフラ作業支援ラボInfra Support Lab ← ガイド一覧← 戻る

Kubernetes Serviceの接続確認手順|EndpointSlice・selector・portの調べ方

Kubernetes Serviceの構成を作成・変更する前や通信経路を確認するときに、selector、Podのlabels、EndpointSlice、port・targetPort、readinessを順番に点検する運用ガイドです。障害時も設定変更より事実確認を先に行います。

この記事の目的

Serviceが正しいPodを選択できているか、転送先ポートとReady条件が一致しているかを確認します。

まず確認すること

kubectl get svcとkubectl get endpointslicesでService定義と転送先の有無を確認します。

本番作業前:Serviceのselectorや公開タイプを変更すると利用者の通信先が変わることがあります。安易にNodePort/LoadBalancerへ変更しないでください。 app・APP・POD_NAMEなどは説明用です。作業前にcontext・namespace・対象オブジェクトを照合してください。

1. Serviceが接続先を決める仕組み

要素役割注意点
ServiceClusterIP等の仮想的なアクセス先type・port・selectorの確認
selectorラベルが一致するPodを選ぶPodのmetadata.labelsと一致させる
EndpointSlice転送先Pod等のアドレス・ポートと条件すべてがReadyとは限らない
targetPortPod側の転送先ポート数字と名前付きportの解決先を確認
Ingress/Gatewayクラスター外のHTTP等の入口コントローラー・証明書・ルート等が別途必要

Serviceのportとコンテナの実待受ポートは異なることがあります。targetPortの名前を使う場合はPod内のコンテナport名と対応する必要があります。

2. 参照コマンドで対象を確認

kubectl config current-context kubectl get svc -n app kubectl describe svc my-service -n app kubectl get pods -n app --show-labels # Service名と紐づくEndpointSliceの一覧 kubectl get endpointslices -n app -l kubernetes.io/service-name=my-service

ここでmy-serviceとappは説明用です。selectorのないServiceや外部接続先を手動定義する構成もあるため、EndpointSliceが自動生成されると決めつけないでください。

3. selectorとPod labelsの一致を調べる

# Service定義(セキュリティ情報に注意) kubectl get svc my-service -n app -o yaml # ラベル付きでPodを一覧 kubectl get pods -n app --show-labels # EndpointSlice詳細と条件 kubectl describe endpointslice ENDPOINTSLICE_NAME -n app

Serviceのselectorがapp: apiなら、Podのラベルにも同じキーと値が必要です。一致するPodがあってもReady条件や削除中状態によって、実際の転送候補にならない場合があります。

4. port・targetPort・readinessを点検

現象最初に調べること
EndpointSliceが空selector・Podラベル・Ready・Serviceの設計
EndpointSliceはあるが通信不可targetPort・アプリのlisten・NetworkPolicy・CNI
Pod Runningだが応答しないReadiness・コンテナの起動完了・アプリログ
Ingress経由だけ失敗Ingress/Gatewayルール・バックエンド・TLS・コントローラー
Service DNSで解決できないnamespace指定のFQDN・CoreDNS・DNSポリシー

PodがRunningであってもReadyであるとは限りません。Serviceの転送候補はPodのReady条件やEndpointSliceのconditionsを確認して判断します。

5. 接続結果別の具体的な調査・修正

次のエラー・状態は想定例であり実環境での実測ではありません。変更前はcontext、Namespace、ServiceとPodの管理元、利用中クライアント、従来のService定義を記録してください。

# 参照のみ:Service選択条件と転送先を比較 kubectl get svc my-service -n app -o yaml kubectl get pods -n app --show-labels kubectl get endpointslices -n app -l kubernetes.io/service-name=my-service kubectl get networkpolicy -n app
結果・想定状態判断と具体的な次の行動
Service selectorとPod labelsが不一致正しい所有Deployment・Podテンプレートを特定。管理元のラベルまたはService定義の差分をレビューし、承認後に整合させる。意図しないPodへ転送しないよう変更前後の転送先を比較
EndpointSliceが空・対象endpointがReadyでないPod Ready/Readinessの失敗理由、Pod削除中か、selector無しServiceの手動EndpointSlice構成かを確認。publishNotReadyAddressesの有無にも注意
Readyなendpointがあるが接続拒否Service portとtargetPort(名前付きport含む)、コンテナの実listen、アプリログを確認。Serviceのポートを無条件に変更しない
Pod直接通信は成功、Service経由だけ失敗DNS名/namespace、NetworkPolicy、kube-proxyまたはCNI、Service実装の調査を続ける。権限のある管理者がクラスター内から再試験
port-forwardは成功、通常通信は失敗ローカル転送はServiceの実通信経路・ネットワークポリシーを再現しないため、通常経路の正常性は未証明と判定

変更する場合:GitOps/CI等の管理元から修正定義と旧定義を確保し、影響先を承認後、kubectl apply --dry-run=server -f service-corrected.yamlとkubectl diff -f service-corrected.yamlで事前検証します。反映も切り戻しも変更管理下で行い、誤配信や一時的な通信断に注意します。既存の通信先が不明なら変更を保留してください。

完了判定:EndpointSliceの条件だけでなく、クラスター内のService FQDNからの実疎通・アプリ応答・Ingress/Gateway経由の必要な経路を確認。未解決ならDNS、ポリシー、CNI・Serviceの管理担当者へEventsと変更差分を引き継ぎます。Kubernetes公式 — Serviceの調査。

6. ローカル検証とポート転送の注意

kubectl port-forwardを使うと、API経由でローカルマシンへポートを転送してサービスを確認できます。ただし、クラスター内の通常のService経路・NetworkPolicyをそのまま再現する検証ではありません。

# 許可された検証環境のみ:ローカルの127.0.0.1に転送 kubectl port-forward -n app --address 127.0.0.1 service/my-service 18080:80 # 別の端末から確認 curl -I http://127.0.0.1:18080/
注意:port-forwardはローカルへの接続口を作ります。必要な権限とデータの機密性を確認し、0.0.0.0への公開は不用意に行わないでください。

7. 設定変更後に確認すべきこと

Podの再作成や変更が必要ならDeployment更新の監査手順を参照。通信障害を一律に「NetworkPolicyのせい」と判断しないことが重要です。

公式・一次資料

対象と実行前チェックを継続する

読み取り操作、設定変更、削除操作を分け、作業後の状態と業務影響を確認します。

柱ガイドへ戻る