← 문제 라이브러리
K8s 중급 K8S 034 · 18분

NetworkPolicy를 적용한 뒤 서비스 이름만 안 풀림: IP로는 호출 성공

보안 점검 후속 조치로 payments 네임스페이스에 '기본 차단' egress 정책을 걸고, 원장 서비스(ledger) 8080 포트로 나가는 것만 허용했습니다.

검수된 문제무료
시나리오

보안 점검 후속 조치로 payments 네임스페이스에 '기본 차단' egress 정책을 걸고, 원장 서비스(ledger) 8080 포트로 나가는 것만 허용했습니다. 적용 직후부터 결제 API가 원장 서비스를 부르지 못해 결제 확정이 모두 실패하고 있습니다. 원장 팀은 자기 서비스가 정상이라고 하고, 실제로 결제 파드 안에서 원장 서비스의 ClusterIP로 직접 호출하면 200이 돌아옵니다. 보안 담당자는 정책에 원장 서비스를 분명히 허용했다고 말합니다.

단서
결제 API 로그
ERROR ledger call failed: Get "http://ledger.ledger.svc.cluster.local:8080/v1/entries": dial tcp: lookup ledger.ledger.svc.cluster.local: i/o timeout
파드 안에서 확인
$ kubectl -n payments exec deploy/pay-api -- curl -s -o /dev/null -w '%{http_code}' http://10.96.12.40:8080/health
200
$ kubectl -n payments exec deploy/pay-api -- nslookup ledger.ledger.svc.cluster.local
;; connection timed out; no servers could be reached
NetworkPolicy (egress 부분)
spec:
  podSelector: {}
  policyTypes: [Egress]
  egress:
    - to:
        - namespaceSelector:
            matchLabels: { kubernetes.io/metadata.name: ledger }
      ports:
        - { protocol: TCP, port: 8080 }

과제 원인을 좁히고, 서비스를 되살리는 순서(검증 포함)와 재발 방지책을 적어 보세요.

먼저 볼 것
  • 서비스 호출과 이름 해석(DNS)을 별개의 통신으로 보기
  • 기본 차단 정책에서 빠지기 쉬운 통신
점검 체크리스트
  1. 오류가 연결 단계인지 이름 조회(lookup) 단계인지
  2. IP로 직접 호출과 nslookup 을 따로 해 보기
  3. egress 규칙에 kube-system의 DNS(53번)가 허용됐는지