Kubernetes/Kubernetes Best Practices

[Scenario Playbook - 심화편 | Medium Level #16] Pod 간 서비스 디스커버리 문제 해결 및 네트워크 디버깅

ygtoken 2025. 3. 17. 12:02
728x90

 

쿠버네티스 클러스터에서 Pod 간 네트워크 통신이 원활하지 않으면 애플리케이션이 정상적으로 동작하지 않습니다.

이 글에서는 Pod 간 서비스 디스커버리 문제를 해결하고, 네트워크 디버깅 방법을 활용하여 통신 문제를 분석하는 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1. Pod 간 네트워크 통신 문제 해결 및 ClusterIP 서비스 활용

2. DNS 기반 서비스 디스커버리 오류 해결

3. kubectl 및 네트워크 디버깅 도구를 활용한 트러블슈팅 방법

 

각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.

 


1️⃣ Pod 간 네트워크 통신 문제 해결 및 ClusterIP 서비스 활용

 

❓ 문제 상황

 

운영팀에서 애플리케이션이 여러 개의 Pod으로 구성되어 있으며, 서로 다른 Pod 간에 통신이 이루어지지 않는 문제가 발생하고 있습니다.

이를 해결하기 위해 ClusterIP 서비스를 설정하여 내부 통신을 원활하게 만들고, 올바른 네트워크 정책을 적용해야 합니다.

서비스 이름: backend-service

ClusterIP를 통해 frontendbackend 통신 가능하도록 설정

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. ClusterIP 서비스를 생성하여 backend Pod을 내부에서 접근 가능하도록 설정합니다.

 

2. kubectl exec 명령어를 활용하여 서비스 통신을 확인합니다.

 


✅ 정답 Manifest (ClusterIP 서비스 및 Deployment 설정)

 

🔹 backend Deployment 및 ClusterIP 서비스

apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend
spec:
  replicas: 2
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: backend
        image: nginx
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: backend-service
spec:
  selector:
    app: backend
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: ClusterIP  # 내부에서만 접근 가능

이제 frontend Pod은 backend-service를 통해 backend Pod과 통신 가능

 


📌 적용 후 예상 결과 값

 

1. frontend Pod에서 backend 서비스로 통신 테스트

kubectl exec -it frontend-pod -- curl http://backend-service

 

💡 예상 출력 값

<html>
<head><title>Welcome to nginx!</title></head>
</html>

Pod 간 네트워크 통신이 정상적으로 이루어짐

 


2️⃣ DNS 기반 서비스 디스커버리 오류 해결

 

❓ 문제 상황

 

운영팀에서 애플리케이션이 backend-service로 요청을 보내지만, DNS 조회가 실패하면서 “Could not resolve host” 오류가 발생하고 있습니다.

이를 해결하기 위해 쿠버네티스 DNS 서비스(kube-dns)가 정상적으로 동작하는지 확인하고, 필요한 설정을 적용해야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. kube-dns 서비스가 정상적으로 실행되고 있는지 확인합니다.

 

2. kubectl exec 명령어를 활용하여 Pod 내부에서 DNS 조회를 테스트합니다.

 


✅ DNS 상태 확인 및 트러블슈팅 명령어

 

🔹 kube-dns 서비스 상태 확인

kubectl get svc -n kube-system | grep kube-dns

 

💡 예상 출력 값

kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP   50d

 

🔹 DNS 확인 (frontend Pod에서 backend-service 조회)

kubectl exec -it frontend-pod -- nslookup backend-service

 

💡 예상 출력 값

Server:         10.96.0.10
Address:        10.96.0.10#53
Name:   backend-service.default.svc.cluster.local
Address: 10.100.200.5

DNS가 정상적으로 backend-service를 조회할 수 있도록 설정됨

 


3️⃣ kubectl 및 네트워크 디버깅 도구를 활용한 트러블슈팅 방법

 

❓ 문제 상황

 

운영팀에서 네트워크 연결 문제로 인해 일부 Pod이 서비스에 접근하지 못하는 현상이 발생하고 있습니다.

kubectl 및 네트워크 디버깅 도구를 활용하여 Pod 간 통신 문제를 분석하고, 방화벽 및 네트워크 정책을 점검해야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. kubectl exec 명령어를 사용하여 네트워크 연결 상태를 확인합니다.

 

2. NetworkPolicy를 확인하여 특정 Pod 간의 트래픽이 차단되지 않았는지 점검합니다.

 


✅ 네트워크 문제 해결을 위한 디버깅 명령어

 

🔹 특정 Pod에서 backend-service로 ping 테스트

kubectl exec -it frontend-pod -- ping -c 3 backend-service

 

💡 예상 출력 값 (정상적인 경우)

PING backend-service.default.svc.cluster.local (10.100.200.5) 56(84) bytes of data.
64 bytes from 10.100.200.5: icmp_seq=1 ttl=63 time=0.5 ms

 

💡 예상 출력 값 (네트워크 차단된 경우)

ping: backend-service: Name or service not known

 

🔹 특정 Pod에서 backend-service로 HTTP 요청 테스트

kubectl exec -it frontend-pod -- curl -I http://backend-service

 

💡 예상 출력 값 (정상적인 경우)

HTTP/1.1 200 OK

 

💡 예상 출력 값 (차단된 경우)

curl: (7) Failed to connect to backend-service port 80: Connection refused

 

🔹 NetworkPolicy가 트래픽을 차단하고 있는지 확인

kubectl get networkpolicy

 

💡 예상 출력 값 (네트워크 정책이 적용된 경우)

NAME                          POD-SELECTOR    AGE
deny-all-external             app=frontend    2h

네트워크 정책이 Pod 간 통신을 차단하고 있는지 확인 가능

728x90