설명
선택자를 사용하는 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를 선택할 수 있게 합니다. 준비 상태와 실제 수신 포트가 올바른지는 별도로 확인해야 합니다.