針對 AKS 叢集內的 Pod 或服務連線 (內部流量) 問題進行疑難排解
本文討論如何將 Pod 或服務的連線問題排解為來自相同Microsoft Azure Kubernetes Services (AKS) 叢集內部流量的連線問題。
必要條件
Kubernetes kubectl 工具,或連線至叢集的類似工具。 若要使用 Azure CLI 安裝 kubectl,請執行 az aks install-cli 命令。
用於處理封裝的 apt-get 命令行工具。
用戶端 URL (cURL) 工具或類似的命令行工具。
TCP 連線的 Netcat (
nc
) 命令行工具。
疑難排解檢查清單
步驟 1:設定測試 Pod 和遠端伺服器埠
設定測試 Pod,並確定在遠端伺服器上開啟必要的埠。 從來源 Pod 內(或與來源 Pod 位於相同命名空間的測試 Pod),遵循下列步驟:
執行 kubectl run 命令,在叢集中啟動測試 Pod:
kubectl run -it --rm aks-ssh --namespace <namespace> --image=debian:stable
取得 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
安裝套件之後,請執行下列 cURL 命令來測試 Pod IP 位址的連線能力:
curl -Iv http://<pod-ip-address>:<port>
執行 Netcat 命令來檢查遠端伺服器是否開啟必要的埠:
nc -z -v <endpoint> <port>
步驟 2:檢視 Pod、容器、Kubernetes 服務和端點的相關作業資訊
在命令行上使用 kubectl 和 cURL,請遵循下列步驟來檢查所有專案是否如預期般運作:
確認目的地 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
搜尋 Pod 記錄中是否有存取錯誤:
kubectl logs <pod-name> -n <namespace-name>
在多容器 Pod 中搜尋個別容器的 Pod 記錄:
kubectl logs <pod-name> -n <namespace-name> -c <container-name>
如果 Pod 內的應用程式重複重新啟動,請檢視先前容器實例的 Pod 記錄,以取得結束訊息:
kubectl logs <pod-name> --previous
針對 multicontainer 案例,請使用下列命令:
kubectl logs <pod-name> -c <container-name> --previous
檢查是否有任何網路原則可能會封鎖流量:
kubectl get networkpolicies -A
您應該會看到類似以下表的輸出。
NAMESPACE NAME POD-SELECTOR AGE kube-system konnectivity-agent app=konnectivity-agent 4d1h
如果您看到任何其他自訂建立的網路原則,請檢查該原則是否會封鎖 Pod 的存取。
檢查您是否可以從服務 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
取得服務的詳細資訊:
kubectl describe services <service-name> -n <namespace-name>
檢查 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
確認 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
直接驗證端點:
kubectl get endpoints
NAME ENDPOINTS AGE my-cluster-ip-service 10.244.0.15:80 14m
如果服務連線無法運作,請重新啟動
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
確認節點未過度使用:
kubectl top nodes
注意
您也可以使用 Azure 監視器來取得叢集的使用方式數據。
與我們連絡,以取得說明
如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。