排查 AKS 群集中 Pod 或服务的连接问题(内部流量)
本文讨论如何将 Pod 或服务的连接问题作为来自同一Microsoft Azure Kubernetes 服务 (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
Pod。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 中单个容器的 Pod 日志:
kubectl logs <pod-name> -n <namespace-name> -c <container-name>
如果 Pod 内部的应用程序重复重启,请查看上一个容器实例的 Pod 日志以获取退出消息:
kubectl logs <pod-name> --previous
对于多容器情况,请使用以下命令:
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 的访问或者从 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 Monitor 获取群集的使用情况数据。
联系我们寻求帮助
如果你有任何疑问或需要帮助,请创建支持请求或联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区。