共用方式為


針對 AKS 叢集內的 Pod 或服務連線 (內部流量) 問題進行疑難排解

本文討論如何將 Pod 或服務的連線問題排解為來自相同Microsoft Azure Kubernetes Services (AKS) 叢集內部流量的連線問題。

必要條件

疑難排解檢查清單

步驟 1:設定測試 Pod 和遠端伺服器埠

設定測試 Pod,並確定在遠端伺服器上開啟必要的埠。 從來源 Pod 內(或與來源 Pod 位於相同命名空間的測試 Pod),遵循下列步驟:

  1. 執行 kubectl run 命令,在叢集中啟動測試 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                      
    

    針對 multicontainer 案例,請使用下列命令:

    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 位址連線到應用程式。 首先,執行 kubectl get services 命令來顯示服務資源的詳細資料,例如外部IP位址和埠:

    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. 如果服務連線無法運作,請重新啟動 kube-proxy 和 CoreDNS Pod:

    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 監視器來取得叢集的使用方式數據。

與我們連絡,以取得說明

如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。