다음을 통해 공유


AKS 클러스터 내의 Pod 또는 서비스에 대한 연결 문제 해결(내부 트래픽)

이 문서에서는 동일한 AKS(Microsoft Azure Kubernetes Services) 클러스터 내에서 내부 트래픽으로 Pod 또는 서비스에 대한 연결 문제를 해결하는 방법을 설명합니다.

필수 조건

문제 해결 검사 목록

1단계: 테스트 Pod 및 원격 서버 포트 설정

테스트 Pod를 설정하고 필요한 포트가 원격 서버에서 열려 있는지 확인합니다. 원본 Pod(또는 원본 Pod와 동일한 네임스페이스에 있는 테스트 Pod) 내에서 다음 단계를 수행합니다.

  1. kubectl 실행 명령을 실행하여 클러스터에서 테스트 Pod를 시작 합니다.

    kubectl run -it --rm aks-ssh --namespace <namespace> --image=debian:stable
    
  2. Pod에 액세스한 후 다음 apt-get 명령을 실행하여 DNS Utils, cURL 및 Netcat 패키지를 설치합니다.

    apt-get update -y
    apt-get install dnsutils -y
    apt-get install curl -y
    apt-get install netcat-openbsd -y
    
  3. 패키지가 설치되면 다음 cURL 명령을 실행하여 Pod의 IP 주소에 대한 연결을 테스트합니다.

    curl -Iv http://<pod-ip-address>:<port>
    
  4. Netcat 명령을 실행하여 원격 서버가 필요한 포트를 열었는지 확인합니다.

    nc -z -v <endpoint> <port>
    

2단계: Pod, 컨테이너, Kubernetes 서비스 및 엔드포인트에 대한 운영 정보 보기

명령줄에서 kubectl 및 cURL을 사용하여 다음 단계에 따라 모든 것이 예상대로 작동하는지 확인합니다.

  1. 대상 Pod가 실행 중인지 확인합니다.

    kubectl get pods -n <namespace-name>
    

    대상 Pod가 제대로 작동하면 Pod 상태가 Running표시되고 Pod가 다음과 같이 READY표시됩니다.

    NAME           READY   STATUS    RESTARTS   AGE
    my-other-pod   1/1     Running   0          44m
    my-pod         1/1     Running   0          44m
    
  2. Pod 로그에서 액세스 오류를 검색합니다.

    kubectl logs <pod-name> -n <namespace-name>
    
  3. 다중 컨테이너 Pod에서 개별 컨테이너에 대한 Pod 로그를 검색합니다.

    kubectl logs <pod-name> -n <namespace-name> -c <container-name>
    
  4. Pod 내에 있는 애플리케이션이 반복적으로 다시 시작되는 경우 이전 컨테이너 인스턴스의 Pod 로그를 확인하여 종료 메시지를 가져옵니다.

    kubectl logs <pod-name> --previous                      
    

    다중 컨테이너 사례의 경우 다음 명령을 사용합니다.

    kubectl logs <pod-name> -c <container-name> --previous  
    
  5. 트래픽을 차단할 수 있는 네트워크 정책이 있는지 확인합니다.

    kubectl get networkpolicies -A
    

    다음 표와 유사한 출력이 표시되어야 합니다.

    NAMESPACE     NAME                 POD-SELECTOR             AGE
    kube-system   konnectivity-agent   app=konnectivity-agent   4d1h
    

    사용자 지정으로 만든 다른 네트워크 정책이 표시되는 경우 해당 정책이 Pod에 대한 액세스를 차단하고 있는지 확인합니다.

  6. 서비스 IP 주소에서 애플리케이션에 연결할 수 있는지 확인합니다. 먼저 명령을 실행하여 외부 IP 주소 및 포트와 같은 서비스 리소스에 대한 세부 정보를 표시합니다 kubectl get services .

    kubectl get services -n <namespace-name>
    
    NAME         TYPE           CLUSTER-IP   EXTERNAL-IP      PORT(S)        AGE
    my-service   LoadBalancer   10.0.21.43   20.119.121.232   80:31773/TCP   28s
    

    그런 다음, 서비스 IP 주소 및 포트를 사용하여 cURL을 실행하여 애플리케이션에 연결할 수 있는지 확인합니다.

    curl -Iv http://20.119.121.232:80
    .
    .
    .
    < HTTP/1.1 200 OK
    HTTP/1.1 200 OK
    
  7. 서비스에 대한 자세한 정보를 가져옵니다.

    kubectl describe services <service-name> -n <namespace-name>
    
  8. Pod의 IP 주소를 확인합니다.

    kubectl get pods -o wide  
    
    NAME            READY   STATUS        RESTARTS   AGE   IP            NODE                                
    my-pod          1/1     Running       0          12m   10.244.0.15   aks-agentpool-000000-vmss000000  
    
  9. Pod의 IP 주소가 서비스의 엔드포인트로 존재하는지 확인합니다.

    kubectl describe services my-cluster-ip-service
    
    Name:              my-cluster-ip-service
    Namespace:         default
    Selector:          app=my-pod
    Type:              ClusterIP
    IP Family Policy:  SingleStack
    IP Families:       IPv4
    IP:                10.0.174.133
    IPs:               10.0.174.133
    Port:              <unset>  80/TCP
    TargetPort:        80/TCP
    Endpoints:         10.244.0.15:80     # <--- Here
    
  10. 엔드포인트를 직접 확인합니다.

    kubectl get endpoints
    
    NAME                      ENDPOINTS           AGE
    my-cluster-ip-service     10.244.0.15:80      14m
    
  11. 서비스에 대한 연결이 작동하지 않는 경우 CoreDNS Pod 및 CoreDNS Pod를 다시 시작 kube-proxy 합니다.

    kubectl delete pods -n kube-system -l component=kube-proxy
    kubectl delete pods -n kube-system -l k8s-app=kube-dns
    
  12. 노드가 과용되지 않는지 확인합니다.

    kubectl top nodes
    

    참고 항목

    Azure Monitor를 사용하여 클러스터의 사용량 현황 데이터를 가져올 수도 있습니다.

도움을 요청하십시오.

질문이 있거나 도움이 필요한 경우 지원 요청을 생성하거나Azure 커뮤니티 지원에 문의하세요. Azure 피드백 커뮤니티에 제품 피드백을 제출할 수도 있습니다.