Kubernetes Service 대상과 포트 연결 점검

Service 선택자, 준비된 Pod와 애플리케이션의 실제 수신 포트를 함께 확인하세요.

설명

선택자를 사용하는 Service는 같은 네임스페이스에서 일치하는 Pod를 찾아 트래픽을 전달합니다. 선택자가 실제 Pod 라벨과 맞지 않거나 targetPort가 애플리케이션의 수신 포트와 다르면 연결에 실패할 수 있습니다.

containerPort 선언 자체가 애플리케이션을 해당 포트에서 실행시키지는 않습니다. 선택자 없이 별도 EndpointSlice를 관리하는 Service도 유효한 구성이므로 실제 연결 방식을 확인해야 합니다.

잠재적 영향

  • 준비된 대상이 없어 요청이 실패하거나 잘못된 포트로 전달될 수 있습니다.
  • Service는 존재하지만 애플리케이션이 응답하지 않아 장애 진단이 어려워질 수 있습니다.

해결 방법

  • Service 선택자와 같은 네임스페이스의 실제 Pod 라벨을 확인하세요. Deployment 등으로 생성한 Pod라면 template의 라벨을 점검하세요.
  • targetPort를 실제 수신 포트 번호나 선언된 포트 이름에 맞추세요. EndpointSlice의 대상과 준비 상태를 확인하고 실제 연결을 시험하세요.

예시

Pod 라벨 차이를 비교하는 기존 예시입니다. nginx의 기본 수신 포트는 80이며 containerPort: 9377만으로 바뀌지 않습니다. 9377에서 수신하도록 애플리케이션을 구성하거나 targetPort를 실제 포트에 맞춰야 합니다.

변경 전

yaml
apiVersion: v1
kind: Service
metadata:
  name: helloworld
spec:
  selector:
    app: helloworld
  ports:
    - port: 9377
      targetPort: 9377
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: different-label
spec:
  containers:
    - name: nginx
      image: nginx
      ports:
        - containerPort: 9377

선택자와 Pod 라벨이 달라 이 Pod는 대상이 되지 않습니다. 다른 일치하는 Pod가 있는지도 확인해야 합니다.

변경 후

yaml
apiVersion: v1
kind: Service
metadata:
  name: helloworld
spec:
  selector:
    app: helloworld
  ports:
    - port: 9377
      targetPort: 9377
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: helloworld
spec:
  containers:
    - name: nginx
      image: nginx
      ports:
        - containerPort: 9377

라벨을 맞춰 이 Pod를 선택할 수 있게 합니다. 준비 상태와 실제 수신 포트가 올바른지는 별도로 확인해야 합니다.

참조